brouillon10
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédente | |||
| brouillon10 [2026/04/29 09:53] – nanaki | brouillon10 [2026/04/29 11:39] (Version actuelle) – nanaki | ||
|---|---|---|---|
| Ligne 7: | Ligne 7: | ||
| < | < | ||
| body{font-family: | body{font-family: | ||
| - | select{margin: | + | select,input{margin: |
| .box{background:# | .box{background:# | ||
| + | label{display: | ||
| + | .stat{color:# | ||
| button{margin: | button{margin: | ||
| - | input{width: | ||
| </ | </ | ||
| </ | </ | ||
| Ligne 28: | Ligne 29: | ||
| < | < | ||
| + | <div class=" | ||
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| - | <select id=" | + | < |
| <div id=" | <div id=" | ||
| + | </ | ||
| < | < | ||
| - | <select id=" | + | <select id=" |
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | CC <input type=" | ||
| + | CT <input type=" | ||
| + | F <input type=" | ||
| + | E <input type=" | ||
| + | AGI <input type=" | ||
| + | FM <input type=" | ||
| + | M <input type=" | ||
| + | PV <input type=" | ||
| + | </div> | ||
| <div class=" | <div class=" | ||
| Ligne 48: | Ligne 63: | ||
| <div class=" | <div class=" | ||
| - | < | + | < |
| <button onclick=" | <button onclick=" | ||
| <button onclick=" | <button onclick=" | ||
| - | <button onclick=" | + | <button onclick=" |
| <input id=" | <input id=" | ||
| </ | </ | ||
| Ligne 58: | Ligne 73: | ||
| < | < | ||
| - | /* ================= RACES ================= */ | + | /* ===== RACES ===== */ |
| const races = { | const races = { | ||
| Elfe: | Elfe: | ||
| Ligne 68: | Ligne 82: | ||
| }; | }; | ||
| - | /* ================= EQUIPEMENTS | + | /* ===== EQUIPEMENTS ===== */ |
| const equipments = [ | const equipments = [ | ||
| {name:" | {name:" | ||
| - | |||
| - | {name:" | ||
| {name:" | {name:" | ||
| {name:" | {name:" | ||
| {name:" | {name:" | ||
| - | |||
| {name:" | {name:" | ||
| + | {name:" | ||
| {name:" | {name:" | ||
| - | |||
| {name:" | {name:" | ||
| {name:" | {name:" | ||
| ]; | ]; | ||
| - | /* ================= PASSIFS | + | /* ===== PASSIFS ===== */ |
| const passives = [ | const passives = [ | ||
| {name:" | {name:" | ||
| Ligne 96: | Ligne 105: | ||
| ]; | ]; | ||
| - | /* ================= SELECT ================= */ | + | /* ===== COSTS ===== */ |
| + | const costs = { | ||
| + | cc: | ||
| + | ct: | ||
| + | f: | ||
| + | e: | ||
| + | agi: | ||
| + | fm: | ||
| + | m: | ||
| + | pv: | ||
| + | }; | ||
| + | /* ===== SELECT ===== */ | ||
| const race = document.getElementById(" | const race = document.getElementById(" | ||
| const passivesSelect = document.getElementById(" | const passivesSelect = document.getElementById(" | ||
| Ligne 111: | Ligne 131: | ||
| }; | }; | ||
| - | /* ================= INIT ================= */ | + | /* ===== INIT ===== */ |
| function initEquip(){ | function initEquip(){ | ||
| - | + | Object.values(slots).forEach(s=> | |
| - | Object.values(slots).forEach(s=> | + | |
| - | s.innerHTML = `<option value=""> | + | |
| - | }); | + | |
| equipments.forEach((e, | equipments.forEach((e, | ||
| - | |||
| if(e.slot===" | if(e.slot===" | ||
| - | slots.right.innerHTML += `<option value=" | + | slots.right.innerHTML+=`< |
| if(e.slot===" | if(e.slot===" | ||
| - | slots.left.innerHTML += `<option value=" | + | slots.left.innerHTML+=`< |
| if(e.slot===" | if(e.slot===" | ||
| - | slots.body.innerHTML += `<option value=" | + | slots.body.innerHTML+=`< |
| if(e.slot===" | if(e.slot===" | ||
| - | slots.cape.innerHTML += `<option value=" | + | slots.cape.innerHTML+=`< |
| if(e.slot===" | if(e.slot===" | ||
| - | slots.feet.innerHTML += `<option value=" | + | slots.feet.innerHTML+=`< |
| if(e.slot===" | if(e.slot===" | ||
| - | slots.ring.innerHTML += `<option value=" | + | slots.ring.innerHTML+=`< |
| }); | }); | ||
| - | |||
| } | } | ||
| - | |||
| - | /* ================= PASSIFS ================= */ | ||
| function initPassives(){ | function initPassives(){ | ||
| passives.forEach((p, | passives.forEach((p, | ||
| - | let opt=document.createElement(" | + | let o=document.createElement(" |
| - | opt.value=i; | + | o.value=i;o.textContent=p.name; |
| - | opt.textContent=p.name; | + | passivesSelect.appendChild(o); |
| - | passivesSelect.appendChild(opt); | + | |
| }); | }); | ||
| } | } | ||
| - | /* ================= LIMIT ================= */ | + | /* ===== BONUS AFFICHAGE |
| - | + | function | |
| - | function | + | Object.entries(slots).forEach(([k,s])=>{ |
| - | + | let item=equipments[s.value]; | |
| - | let count = 0; | + | let target=document.getElementById(k+" |
| - | let ring = 0; | + | if(!item||!item.stats){target.innerHTML=""; |
| - | + | target.innerHTML=" | |
| - | Object.entries(slots).forEach(([name,sel])=>{ | + | .map(([a,v])=>a+" "+(v> |
| - | if(!sel.value) return; | + | |
| - | + | ||
| - | if(name==="ring") ring++; | + | |
| - | else count++; | + | |
| }); | }); | ||
| - | |||
| - | if(count> | ||
| - | alert(" | ||
| - | return false; | ||
| - | } | ||
| - | if(ring> | ||
| - | alert(" | ||
| - | return false; | ||
| } | } | ||
| - | return | + | /* ===== LIMITE ===== */ |
| + | function checkLimit(){ | ||
| + | let count=0, | ||
| + | Object.entries(slots).forEach(([k, | ||
| + | if(!s.value)return; | ||
| + | if(k===" | ||
| + | }); | ||
| + | document.getElementById(" | ||
| + | return count< | ||
| } | } | ||
| - | /* ================= 2 MAINS ================= */ | + | /* ===== 2 MAINS ===== */ |
| slots.right.addEventListener(" | slots.right.addEventListener(" | ||
| - | let item = equipments[slots.right.value]; | + | let item=equipments[slots.right.value]; |
| - | + | if(item&& | |
| - | if(item && item.slot===" | + | slots.left.disabled=true; |
| - | slots.left.disabled = true; | + | slots.left.innerHTML="< |
| - | slots.left.innerHTML = "< | + | |
| }else{ | }else{ | ||
| - | slots.left.disabled = false; | + | slots.left.disabled=false; |
| initEquip(); | initEquip(); | ||
| } | } | ||
| }); | }); | ||
| - | /* ================= | + | /* ===== COST CALC ===== */ |
| + | function calcCost(b, | ||
| + | let cost=0,last=b; | ||
| + | for(let i=1;i<=n;i++){ | ||
| + | if(i===1) last=b; | ||
| + | else if(i<=3) last+=m1; | ||
| + | else last+=m2; | ||
| + | cost+=last; | ||
| + | } | ||
| + | return cost; | ||
| + | } | ||
| - | function | + | function |
| - | + | return calcCost(...costs.cc, | |
| - | let s = {...races[race.value]}; | + | +calcCost(...costs.ct, |
| - | + | +calcCost(...costs.f, | |
| - | Object.values(slots).forEach(sel=> | + | +calcCost(...costs.e,eUp.value) |
| - | let item = equipments[sel.value]; | + | +calcCost(...costs.agi, |
| - | if(!item || !item.stats) return; | + | +calcCost(...costs.fm, |
| - | + | +calcCost(...costs.m,mUp.value) | |
| - | Object.entries(item.stats).forEach(([k,v])=>{ | + | +calcCost(...costs.pv, |
| - | s[k]=(s[k]||0)+v; | + | |
| - | }); | + | |
| - | }); | + | |
| - | + | ||
| - | [...passivesSelect.selectedOptions].forEach(o=> | + | |
| - | passives[o.value].effect(s); | + | |
| - | }); | + | |
| - | + | ||
| - | return s; | + | |
| } | } | ||
| - | /* ================= CALCUL | + | /* ===== CALCUL ===== */ |
| function ctRange(ct, | function ctRange(ct, | ||
| - | if(d<=2) return | + | return |
| - | return | + | |
| } | } | ||
| Ligne 230: | Ligne 228: | ||
| } | } | ||
| - | /* ================= UPDATE | + | /* ===== UPDATE ===== */ |
| function update(){ | function update(){ | ||
| - | if(!checkEquipLimit()) return; | + | if(!checkLimit()) return; |
| - | let s = getStats(); | + | displayItemStats(); |
| + | |||
| + | let s={...races[race.value]}; | ||
| + | |||
| + | Object.values(slots).forEach(sel=> | ||
| + | let item=equipments[sel.value]; | ||
| + | if(item&& | ||
| + | Object.entries(item.stats).forEach(([k, | ||
| + | s[k]=(s[k]||0)+v; | ||
| + | }); | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | [...passivesSelect.selectedOptions].forEach(o=> | ||
| + | passives[o.value].effect(s); | ||
| + | }); | ||
| - | document.getElementById(" | + | document.getElementById(" |
| CC: ${s.cc}< | CC: ${s.cc}< | ||
| FM: ${s.fm}< | FM: ${s.fm}< | ||
| - | |||
| CT:< | CT:< | ||
| 1 case: ${ctRange(s.ct, | 1 case: ${ctRange(s.ct, | ||
| Ligne 247: | Ligne 258: | ||
| 3 cases: ${ctRange(s.ct, | 3 cases: ${ctRange(s.ct, | ||
| 4 cases: ${ctRange(s.ct, | 4 cases: ${ctRange(s.ct, | ||
| - | + | Esquive tir: ${dodge(s.cc, | |
| - | Esquive tir: ${dodge(s.cc, | + | 💰 PI: ${totalPI()} |
| `; | `; | ||
| - | |||
| - | displayCount(); | ||
| } | } | ||
| - | /* ================= COMPTEUR ================= */ | + | /* ===== SAVE ===== */ |
| - | + | ||
| - | function displayCount(){ | + | |
| - | + | ||
| - | let count=0, ring=0; | + | |
| - | + | ||
| - | Object.entries(slots).forEach(([name, | + | |
| - | if(!sel.value) return; | + | |
| - | if(name===" | + | |
| - | else count++; | + | |
| - | }); | + | |
| - | + | ||
| - | document.getElementById(" | + | |
| - | `Équipements: | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | /* ================= SAVE ================= */ | + | |
| function saveBuild(){ | function saveBuild(){ | ||
| - | let data = { | + | let data={race: |
| - | race: race.value, | + | Object.entries(slots).forEach(([k, |
| - | equip:{}, | + | |
| - | passives: | + | |
| - | }; | + | |
| - | + | ||
| - | Object.entries(slots).forEach(([k, | + | |
| - | data.equip[k]=s.value; | + | |
| - | }); | + | |
| localStorage.setItem(" | localStorage.setItem(" | ||
| - | alert(" | ||
| } | } | ||
| - | /* ================= LOAD ================= */ | + | /* ===== LOAD ===== */ |
| function loadBuild(){ | function loadBuild(){ | ||
| - | + | let data=JSON.parse(localStorage.getItem(" | |
| - | let data = JSON.parse(localStorage.getItem(" | + | if(!data)return; |
| - | if(!data) return; | + | race.value=data.race; |
| - | + | Object.entries(data.equip).forEach(([k, | |
| - | race.value = data.race; | + | [...passivesSelect.options].forEach(o=> |
| - | + | ||
| - | Object.entries(data.equip).forEach(([k, | + | |
| - | slots[k].value=v; | + | |
| - | }); | + | |
| - | + | ||
| - | [...passivesSelect.options].forEach(o=> | + | |
| - | o.selected = data.passives.includes(o.value); | + | |
| - | }); | + | |
| update(); | update(); | ||
| } | } | ||
| - | /* ================= SHARE ================= */ | + | /* ===== SHARE ===== */ |
| function generateLink(){ | function generateLink(){ | ||
| - | + | let data={race: | |
| - | let data = { | + | Object.entries(slots).forEach(([k, |
| - | race: race.value, | + | document.getElementById(" |
| - | equip:{}, | + | |
| - | passives: | + | |
| - | }; | + | |
| - | + | ||
| - | Object.entries(slots).forEach(([k, | + | |
| - | data.equip[k]=s.value; | + | |
| - | }); | + | |
| - | + | ||
| - | let str = btoa(JSON.stringify(data)); | + | |
| - | let url = location.href.split("?" | + | |
| - | + | ||
| - | document.getElementById(" | + | |
| } | } | ||
| - | /* ================= LOAD FROM URL ================= */ | + | /* ===== INIT ===== */ |
| - | + | document.querySelectorAll(" | |
| - | function loadFromURL(){ | + | |
| - | + | ||
| - | let params = new URLSearchParams(window.location.search); | + | |
| - | let data = params.get(" | + | |
| - | + | ||
| - | if(!data) return; | + | |
| - | + | ||
| - | let decoded = JSON.parse(atob(data)); | + | |
| - | + | ||
| - | race.value = decoded.race; | + | |
| - | + | ||
| - | Object.entries(decoded.equip).forEach(([k, | + | |
| - | slots[k].value=v; | + | |
| - | }); | + | |
| - | + | ||
| - | [...passivesSelect.options].forEach(o=> | + | |
| - | o.selected = decoded.passives.includes(o.value); | + | |
| - | }); | + | |
| - | + | ||
| - | update(); | + | |
| - | } | + | |
| - | + | ||
| - | /* ================= EVENTS ================= */ | + | |
| - | + | ||
| - | document.querySelectorAll(" | + | |
| - | s.addEventListener(" | + | |
| - | }); | + | |
| - | + | ||
| - | /* ================= START ================= */ | + | |
| initEquip(); | initEquip(); | ||
| initPassives(); | initPassives(); | ||
| - | loadFromURL(); | ||
| update(); | update(); | ||
brouillon10.txt · Dernière modification : 2026/04/29 11:39 de nanaki
