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 09:53] nanakibrouillon10 [2026/04/29 13:54] (Version actuelle) nanaki
Ligne 3: Ligne 3:
 <head> <head>
 <meta charset="UTF-8"> <meta charset="UTF-8">
-<title>Simulateur Build</title>+<title>Simulateur RPG</title>
  
 <style> <style>
-body{font-family:Arial;background:#1e1e1e;color:#eee;padding:20px} +body { font-family: Arial; background:#0b1a13; color:#e0d3a3; padding:20px;
-select{margin:5px;width:250px+h1,h2 color:gold;} 
-.box{background:#2a2a2a;padding:10px;margin-top:10px;border-radius:6px+.box { border:1px solid gold; padding:10px; margin-bottom:15px;
-button{margin:5px;padding:6px 10px} +select,input { margin:3px;
-input{width:300px}+button { padding:8px; margin:5px; background:gold; border:none;}
 </style> </style>
 </head> </head>
Ligne 16: Ligne 16:
 <body> <body>
  
-<h1>Simulateur Build</h1>+<h1>Simulateur</h1>
  
-<h2>Race</h2> +<div class="box"> 
-<select id="race"> +Race 
-<option>Elfe</option+<select id="race"></select
-<option>Nain</option> +</div>
-<option>Géant</option> +
-<option>Olympien</option> +
-<option>HS</option> +
-</select>+
  
-<h2>Équipement</h2> +<div class="box"> 
- +Stats 
-<select id="head"></select><br> +<div id="stats"></div> 
-<select id="cape"></select><br> +</div>
-<select id="body"></select><br> +
-<select id="right"></select><br> +
-<select id="left"></select><br> +
-<select id="feet"></select><br> +
-<select id="ring"></select><br+
- +
-<div id="equipCount"></div> +
- +
-<h2>Passifs</h2> +
-<select id="passives" multiple size="8"></select>+
  
 <div class="box"> <div class="box">
-<h2>Résultats</h2+Équipement<br> 
-<div id="result"></div>+Tête <select id="head"></select><br> 
 +Cou <select id="neck"></select><br> 
 +Dos <select id="cape"></select><br> 
 +Main droite <select id="rightHand"></select><br> 
 +Main gauche <select id="leftHand"></select><br> 
 +Corps <select id="body"></select><br> 
 +Anneau <select id="ring"></select><br
 +Pieds <select id="feet"></select>
 </div> </div>
  
 <div class="box"> <div class="box">
-<h2>Sauvegarde / Partage</h2> +Compétences 
-<button onclick="saveBuild()">💾 Sauvegarder</button> +<div id="skills"></div>
-<button onclick="loadBuild()">📂 Charger</button><br><br> +
- +
-<button onclick="generateLink()">🔗 Générer lien</button><br> +
-<input id="shareLink" readonly>+
 </div> </div>
  
-<script>+<button onclick="calculate()">Calculer</button> 
 +<button onclick="exportWiki()">Export Wiki</button>
  
-/* ================= RACES ================*/+<pre id="result"></pre> 
 + 
 +<script>
  
 +// ===== DATA =====
 const races = { const races = {
-Elfe:{cc:9,ct:10,f:9,e:4,agi:9,fm:8}, +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}, 
-Nain:{cc:11,ct:8,f:11,e:6,agi:6,fm:10}, +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}
-Géant:{cc:9,ct:10,f:12,e:4,agi:7,fm:6}, +
-Olympien:{cc:10,ct:9,f:10,e:5,agi:8,fm:7}, +
-HS:{cc:8,ct:9,f:7,e:3,agi:11,fm:9}+
 }; };
  
-/* ================= EQUIPEMENTS ================= */+const costTable 
 +cc:[100,50,30], f:[120,55,30], e:[120,55,30], m:[110,55,35], 
 +pv:[4,2,1], mvt:[100,50,30] 
 +};
  
 const equipments = [ const equipments = [
-{name:"Rien",slot:"all"}, +{name:"Lance elfe",race:"Elfe",slot:"weapon",stats:{cc:1,f:1},magicBlock:true}, 
- +{name:"Targe",race:"Nain",slot:"defensive",stats:{cc:1,pv:10},magicBlock:true}, 
-{name:"Armure sylvestre",slot:"body",stats:{e:2}}, +{name:"Armure elfe",race:"Elfe",slot:"torse",stats:{e:2,mvt:-1},magicBlock:true}, 
-{name:"Gladius",slot:"weapon",stats:{cc:1}}, +{name:"Arc long",race:"all",slot:"weapon2h",stats:{ct:2}}
-{name:"Lance elfique",slot:"weapon",stats:{cc:1,f:1}}, +
-{name:"Arc long",slot:"weapon2h",stats:{ct:2,cc:-2}}, +
- +
-{name:"Bouclier",slot:"offhand",stats:{cc:1}}, +
-{name:"Cape de chasse",slot:"cape",stats:{ct:1}}, +
- +
-{name:"Bottes rapides",slot:"feet",stats:{agi:1}}, +
-{name:"Anneau puissance",slot:"ring",stats:{m:1}}+
 ]; ];
  
-/* ================= PASSIFS ================= */+const skills ["Fulgurance","Duelliste","Encaisser","Anguille"];
  
-const passives +// ===== DOM ====
-{name:"Fulgurance",effect:(s)=>{s.cc+=1;s.agi+=1}}, +const raceSelect document.getElementById("race")
-{name:"Couverture",effect:(s)=>{s.cover=true}}, +const statsDiv document.getElementById("stats")
-{name:"Anguille",effect:(s)=>{s.agi+=2}}, +const skillsDiv document.getElementById("skills");
-{name:"Duelliste",effect:(s)=>{s.cc+=2}}, +
-{name:"Maître bretteur",effect:(s)=>{s.cc+=1}}, +
-{name:"Inépuisable",effect:(s)=>{}} +
-];+
  
-/* ================= SELECT ================= */+const head document.getElementById("head"); 
 +const neck document.getElementById("neck"); 
 +const cape document.getElementById("cape"); 
 +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");
  
-const race document.getElementById("race"); +// ===== INIT =====
-const passivesSelect document.getElementById("passives");+
  
-const slots = { +// race 
-head:document.getElementById("head"), +for(let r in races){ 
-cape:document.getElementById("cape"), +raceSelect.innerHTML += `<option>${r}</option>`; 
-body:document.getElementById("body"), +}
-right:document.getElementById("right"), +
-left:document.getElementById("left"), +
-feet:document.getElementById("feet"), +
-ring:document.getElementById("ring") +
-};+
  
-/================= INIT ================= */ +// stats 
- +for(let s in costTable){ 
-function initEquip(){+statsDiv.innerHTML +`${s} <input type="number" id="${s}" value="0"><br>`; 
 +}
  
-Object.values(slots).forEach(s=>+// skills 
-s.innerHTML = `<option value="">-- Aucun --</option>`;+skills.forEach(s=>
 +skillsDiv.innerHTML += `<label><input type="checkbox" class="sk"> ${s}</label><br>`;
 }); });
  
-equipments.forEach((e,i)=>+/slots reset 
- +function resetSlots(){ 
-if(e.slot==="weapon"||e.slot==="weapon2h"+[head,neck,cape,rightHand,leftHand,body,ring,feet].forEach(sel=>{ 
-slots.right.innerHTML += `<option value="${i}">${e.name}</option>`; +sel.innerHTML = `<option value="">--</option>`;
- +
-if(e.slot==="offhand"+
-slots.left.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-if(e.slot==="body") +
-slots.body.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-if(e.slot==="cape") +
-slots.cape.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-if(e.slot==="feet"+
-slots.feet.innerHTML += `<option value="${i}">${e.name}</option>`; +
- +
-if(e.slot==="ring"+
-slots.ring.innerHTML += `<option value="${i}">${e.name}</option>`; +
 }); });
- 
 } }
  
-/================= PASSIFS ================= */+// remplir équipements 
 +function fillEquip(){ 
 +let r raceSelect.value; 
 + 
 +equipments.forEach((e,i)=>{ 
 +if(e.race!=="all" && e.race!==r) return;
  
-function initPassives(){ +if(e.slot==="weapon"||e.slot==="weapon2h"rightHand.innerHTML += `<option value="${i}">${e.name}</option>`
-passives.forEach((p,i)=>{ +if(e.slot==="defensive") leftHand.innerHTML += `<option value="${i}">${e.name}</option>`
-let opt=document.createElement("option")+if(e.slot==="torse"body.innerHTML += `<option value="${i}">${e.name}</option>`;
-opt.value=i; +
-opt.textContent=p.name; +
-passivesSelect.appendChild(opt);+
 }); });
 } }
  
-/* ================= LIMIT ================= *+// update 
- +raceSelect.addEventListener("change", ()=>{ 
-function checkEquipLimit(){ +resetSlots(); 
- +fillEquip();
-let count = 0; +
-let ring = 0; +
- +
-Object.entries(slots).forEach(([name,sel])=>{ +
-if(!sel.valuereturn+
- +
-if(name==="ring"ring++; +
-else count++;+
 }); });
  
-if(count>3){ +resetSlots(); 
-alert("Max 3 équipements !"); +fillEquip();
-return false; +
-+
-if(ring>1){ +
-alert("Max 1 anneau !"); +
-return false; +
-+
- +
-return true; +
-+
- +
-/* ================= 2 MAINS ================= */+
  
-slots.right.addEventListener("change",()=>+// 2 mains 
-let item equipments[slots.right.value];+rightHand.addEventListener("change", ()=>{ 
 +let rightHand.value; 
 +if(v===""){ leftHand.disabled=false; return;}
  
-if(item && item.slot==="weapon2h"){ +let item = equipments[v]; 
-slots.left.disabled true+if(item.slot==="weapon2h"){ 
-slots.left.innerHTML "<option>Bloqué</option>";+leftHand.value=""
 +leftHand.disabled=true;
 }else{ }else{
-slots.left.disabled = false+leftHand.disabled=false;
-initEquip();+
 } }
 }); });
  
-/================= STATS ================= */+/===== CALCUL ===== 
 +function calculate(){
  
-function getStats(){+let char = {...races[raceSelect.value]}; 
 +let total = 0;
  
-let s = {...races[race.value]}; +// stats 
- +for(let s in costTable){ 
-Object.values(slots).forEach(sel=>+let parseInt(document.getElementById(s).value)||0; 
-let item equipments[sel.value]; +char[s]+=v;
-if(!item || !item.stats) return; +
- +
-Object.entries(item.stats).forEach(([k,v])=>{ +
-s[k]=(s[k]||0)+v+
-}); +
-}); +
- +
-[...passivesSelect.selectedOptions].forEach(o=>{ +
-passives[o.value].effect(s); +
-}); +
- +
-return s;+
 } }
  
-/* ================= CALCUL ================= *+// equip 
- +[rightHand,leftHand,body].forEach(sel=>
-function ctRange(ct,d)+if(sel.value==="") return; 
-if(d<=2) return ct+let e = equipments[sel.value]; 
-return ct-(d-2)*3;+for(let stat in e.stats){ 
 +char[stat]=(char[stat]||0)+e.stats[stat];
 } }
- 
-function dodge(cc,agi){ 
-return Math.max( 
-Math.floor(cc*0.75+agi*0.25), 
-Math.floor(cc*0.25+agi*0.75) 
-); 
-} 
- 
-/* ================= UPDATE ================= */ 
- 
-function update(){ 
- 
-if(!checkEquipLimit()) return; 
- 
-let s = getStats(); 
- 
-document.getElementById("result").innerHTML = ` 
-CC: ${s.cc}<br> 
-FM: ${s.fm}<br><br> 
- 
-CT:<br> 
-1 case: ${ctRange(s.ct,1)}<br> 
-2 cases: ${ctRange(s.ct,2)}<br> 
-3 cases: ${ctRange(s.ct,3)}<br> 
-4 cases: ${ctRange(s.ct,4)}<br><br> 
- 
-Esquive tir: ${dodge(s.cc,s.agi)} 
-`; 
- 
-displayCount(); 
-} 
- 
-/* ================= COMPTEUR ================= */ 
- 
-function displayCount(){ 
- 
-let count=0, ring=0; 
- 
-Object.entries(slots).forEach(([name,sel])=>{ 
-if(!sel.value) return; 
-if(name==="ring") ring++; 
-else count++; 
 }); });
  
-document.getElementById("equipCount").innerHTML = +// affichage 
-`Équipements: ${count}/3 | Anneau: ${ring}/1`; +result.innerText = JSON.stringify(char,null,2);
 } }
  
-/================= SAVE ================= */+/===== EXPORT ===== 
 +function exportWiki(){
  
-function saveBuild(){ +let txt="=== Build ===\n"; 
-let data { +txt+="Race"+raceSelect.value+"\n\n";
-racerace.value+
-equip:{}, +
-passives:[...passivesSelect.selectedOptions].map(o=>o.value) +
-};+
  
-Object.entries(slots).forEach(([k,s])=>{ +document.querySelectorAll(".sk:checked").forEach(s=>
-data.equip[k]=s.value;+txt+="* "+s.parentNode.innerText+"\n";
 }); });
  
-localStorage.setItem("build",JSON.stringify(data)); +result.innerText=txt;
-alert("Build sauvegardé !");+
 } }
- 
-/* ================= LOAD ================= */ 
- 
-function loadBuild(){ 
- 
-let data = JSON.parse(localStorage.getItem("build")); 
-if(!data) return; 
- 
-race.value = data.race; 
- 
-Object.entries(data.equip).forEach(([k,v])=>{ 
-slots[k].value=v; 
-}); 
- 
-[...passivesSelect.options].forEach(o=>{ 
-o.selected = data.passives.includes(o.value); 
-}); 
- 
-update(); 
-} 
- 
-/* ================= SHARE ================= */ 
- 
-function generateLink(){ 
- 
-let data = { 
-race: race.value, 
-equip:{}, 
-passives:[...passivesSelect.selectedOptions].map(o=>o.value) 
-}; 
- 
-Object.entries(slots).forEach(([k,s])=>{ 
-data.equip[k]=s.value; 
-}); 
- 
-let str = btoa(JSON.stringify(data)); 
-let url = location.href.split("?")[0]+"?build="+str; 
- 
-document.getElementById("shareLink").value = url; 
-} 
- 
-/* ================= LOAD FROM URL ================= */ 
- 
-function loadFromURL(){ 
- 
-let params = new URLSearchParams(window.location.search); 
-let data = params.get("build"); 
- 
-if(!data) return; 
- 
-let decoded = JSON.parse(atob(data)); 
- 
-race.value = decoded.race; 
- 
-Object.entries(decoded.equip).forEach(([k,v])=>{ 
-slots[k].value=v; 
-}); 
- 
-[...passivesSelect.options].forEach(o=>{ 
-o.selected = decoded.passives.includes(o.value); 
-}); 
- 
-update(); 
-} 
- 
-/* ================= EVENTS ================= */ 
- 
-document.querySelectorAll("select").forEach(s=>{ 
-s.addEventListener("change",update); 
-}); 
- 
-/* ================= START ================= */ 
- 
-initEquip(); 
-initPassives(); 
-loadFromURL(); 
-update(); 
  
 </script> </script>
brouillon10.1777449203.txt.gz · Dernière modification : 2026/04/29 09:53 de nanaki