Outils pour utilisateurs

Outils du site


brouillon9

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
brouillon9 [2026/04/23 15:22] – créée nanakibrouillon9 [2026/05/01 10:16] (Version actuelle) nanaki
Ligne 1: Ligne 1:
-Survie  +Voici un simulateur en version beta, n'hésitez pas à faire vos remarques sur le discord ou le forum.
  
 <html> <html>
 <head> <head>
 <meta charset="UTF-8"> <meta charset="UTF-8">
 +<title>Simulateur RPG</title>
  
 <style> <style>
-body { font-family: Arial; }+body { 
 +  font-family: Arial; 
 +  background:#0b1a13; 
 +  color:#e0d3a3; 
 +  padding:10px; 
 +}
  
-table { border-collapse: collapse; width: 100%; font-size: 13px; } +h1,h2 color:gold;}
-tdth { border: 1px solid #ccc; padding: 5px; } +
-th background#f2f2f2; }+
  
-.survie background#e5fff5}   /* vert/bleu léger */ +.box { 
-.passif { background#e5ffe5; }+  border:1px solid gold
 +  padding:10px; 
 +  margin-bottom:10px; 
 +}
  
-.controls { margin-bottom:10px; }+select { margin:3px; max-width:150px;
 +input { margin:3px; width:50px; } 
 + 
 +.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 22: Ligne 47:
 <body> <body>
  
-<div class="controls"> +<h1>Simulateur</h1> 
-Points : <span id="points">0</span> / 15+ 
 +<div class="box"> 
 +Race : 
 +<select id="race"></select> 
 + 
 +<h3>Stats de base</h3> 
 +<pre id="baseStats"></pre>
 </div> </div>
  
-<table id="skills">+<div class="box"> 
 +<h3>Améliorations</h3> 
 +<div id="stats"></div> 
 +<div id="cost"></div> 
 +</div>
  
-<thead+<div class="box"
-<tr> +<h3>Équipement (3 max + 1 anneau)</h3>
-<th></th> +
-<th>Race</th> +
-<th>Nom</th> +
-<th>Coût</th> +
-<th>Type</th> +
-<th>Effet</th> +
-<th>Portée</th> +
-<th>Niv</th> +
-</tr> +
-</thead>+
  
-<tbody>+Tête <select id="head"></select> <span id="headStats"></span><br> 
 +Cou <select id="neck"></select> <span id="neckStats"></span><br> 
 +Dos <select id="cape"></select> <span id="capeStats"></span><br> 
 +Main droite <select id="rightHand"></select> <span id="rightStats"></span><br> 
 +Main gauche <select id="leftHand"></select> <span id="leftStats"></span><br> 
 +Corps <select id="body"></select> <span id="bodyStats"></span><br> 
 +Anneau <select id="ring"></select> <span id="ringStats"></span><br> 
 +Pieds <select id="feet"></select> <span id="feetStats"></span>
  
-<!-- ===== NIVEAU 2 ===== -->+<div id="limitWarn" style="color:red;"></div> 
 +</div>
  
-<tr class="survie"> +<div class="box"> 
-<td><input type="checkbox" class="skill"></td+<h3>Passifs</h3
-<td>Communs</td> +<div id="skills"></div
-<td>Encaisser</td> +</div>
-<td>6 MP</td> +
-<td>Technique</td> +
-<td>Encaisse</td> +
-<td>Soi-même</td> +
-<td>2</td+
-</tr>+
  
-<!-- ===== NIVEAU 4 ===== -->+<button onclick="resetAll()">Reset</button>
  
-<tr class="passif"> +<pre id="result" class="result"></pre>
-<td><input type="checkbox" class="skill"></td> +
-<td>Communs</td> +
-<td>Anguille</td> +
-<td>/</td> +
-<td>Passif</td> +
-<td>Avantage esquive</td> +
-<td>/</td> +
-<td>4</td> +
-</tr>+
  
-<tr class="passif"> +<script>
-<td><input type="checkbox" class="skill"></td> +
-<td>Communs</td> +
-<td>Couverture</td> +
-<td>/</td> +
-<td>Passif</td> +
-<td>Esquive tirs bouclier</td> +
-<td>/</td> +
-<td>4</td> +
-</tr>+
  
-<tr class="passif"> +// ===== RACES ===== 
-<td><input type="checkbox" class="skill"></td> +const races = { 
-<td>Communs</td> +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}, 
-<td>Inépuisable</td> +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}, 
-<td>/</td> +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}, 
-<td>Passif</td> +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}, 
-<td>Malus réduits</td> +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} 
-<td>/</td> +};
-<td>4</td> +
-</tr>+
  
-<tr class="passif"> +// ===== COST ===== 
-<td><input type="checkbox" class="skill"></td> +const costTable = { 
-<td>Communs</td> +cc:[100,50,30], ct:[110,50,30], 
-<td>Réflexes fulgurants</td> +f:[120,55,30], e:[120,55,30], 
-<td>/</td> +agi:[95,45,25], 
-<td>Passif</td> +m:[110,55,35], 
-<td>Esquive modifiée</td> +fm:[100,50,30], 
-<td>/</td> +p:[110,85,78], 
-<td>4</td> +pv:[4,2,1], 
-</tr>+pm:[5,3,1], 
 +mvt:[100,50,30], 
 +r:[40,30,15], 
 +rm:[50,40,20] 
 +};
  
-<tr class="passif"> +// ===== PASSIFS ====
-<td><input type="checkboxclass="skill"></td> +const skills 
-<td>Communs</td> +{name:"Fulgurance",desc:"+1 toucher au cac + 1 esquive tous les 5 mouvements"}, 
-<td>Volonté de fer</td> +{name:"Couverture",desc:"85% CC 15% AGI"}, 
-<td>/</td> +{name:"Réflexes fulgurants",desc:"85% AGI 15% CC"}, 
-<td>Passif</td> +{name:"Berserker",desc:"+1 toucher au cac tous les 10 pv perdus"}, 
-<td>Avantage résistance</td> +{name:"Griffes",desc:"+3 dégâts au poings"}, 
-<td>/</td> +{name:"Anguille",desc:"Avantage esquive"} 
-<td>4</td> +];
-</tr>+
  
-</tbody> +const equipments = [
-</table>+
  
-<script> +/* ================= COMMUNS ================= */
-let max 15;+
  
-document.querySelectorAll(".skill").forEach(cb=>+{name:"Arc",race:"all",slot:"weapon2h",stats:{cc:-1,ct:1}}, 
-cb.addEventListener("change", ()=>+{name:"Armure matelassée",race:"all",slot:"body",stats:{e:1,agi:-2}}, 
-let total = document.querySelectorAll(".skill:checked").length+{name:"Bâton de marche",race:"all",slot:"weapon",stats:{mvt:1}}, 
-if(total max){ cb.checked false; return; } +{name:"Bottes de marche",race:"all",slot:"feet",stats:{mvt:1}}, 
-document.getElementById("points").innerText total;+{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:"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}}, 
 + 
 +/* ===== 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 ===== 
 +const raceSelect = document.getElementById("race"); 
 +const statsDiv = document.getElementById("stats")
 +const baseDiv = document.getElementById("baseStats")
 + 
 +for(let r in races){ 
 +raceSelect.innerHTML += `<option>${r}</option>`; 
 +
 + 
 +// stats UI 
 +for(let s in costTable){ 
 +statsDiv.innerHTML +
 +<div class="statLine"> 
 +<span>${s}</span> 
 +<input type="number" id="${s}" value="0" min="0"> 
 +</div>`; 
 +} 
 + 
 +// passifs 
 +skills.forEach(s=>{ 
 +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
 +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(){
 +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>`;
 }); });
-</script>+}
  
 +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);
 +}
 +}
 +
 +// ===== CALCUL =====
 +function calculate(){
 +
 +let char={...races[raceSelect.value]};
 +
 +// stats investies
 +for(let s in costTable){
 +let v=+document.getElementById(s).value||0;
 +char[s]=(char[s]||0)+v;
 +}
 +
 +// 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 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 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`;
 +}
 +
 +// ===== 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+
 +
 +"\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();
 +
 +</script>
 </body> </body>
 </html> </html>
brouillon9.1776950543.txt.gz · Dernière modification : 2026/04/23 15:22 de nanaki