computerism/guillotine-cross-sicario-ultimate-guide
0
1// Theme toggle with persistence2(function themeInit() {3 const root = document.documentElement;4 const key = 'gx-guide-theme';5 const stored = localStorage.getItem(key);6 if (stored === 'light' || stored === 'dark') {7 root.setAttribute('data-theme', stored);8 }9})();10 11document.getElementById('themeToggle').addEventListener('click', () => {12 const root = document.documentElement;13 const curr = root.getAttribute('data-theme') || 'dark';14 const next = curr === 'dark' ? 'light' : 'dark';15 root.setAttribute('data-theme', next);16 localStorage.setItem('gx-guide-theme', next);17 document.getElementById('themeToggle').textContent = next === 'dark' ? '🌙' : '☀️';18});19// Dataset de habilidades (sumarizado, prosa original em português)20const SKILLS = [21 // DPS Principal22 {23 id: 'cross-impact',24 name: 'Impacto Cruzado',25 pt: 'Lâminas Retalhadoras',26 category: 'dps',27 ratings: { popularity: 5, damage: 5, qol: 5, efficiency: 5 },28 prereq: 'Golpe Sônico Nv. 10',29 summary: 'Saltar para o alvo e causar dano massivo de alvo único. Pós-2020: pode criticar (metade da taxa/dano). 0.5s cooldown no nível máximo com alto custo de SP. DPS MVP de alto nível.',30 details: ['IC usa metade do CRIT exibido e metade dos bônus de dano crítico.', 'Ignora fuga através de acertos críticos.', 'Burst de alvo único de melhor classe quando EDP está ativo.']31 },32 {33 id: 'rolling-cutter',34 name: 'Cortador Giratório',35 pt: 'Lâminas de Loki',36 category: 'aoe',37 ratings: { popularity: 5, damage: 4, qol: 5, efficiency: 5 },38 prereq: 'Golpe Sônico Nv. 10',39 summary: 'Spin AoE exclusivo de katanas: 3×3 → 5×5 → 7×7 conforme os níveis. Constrói Contadores de Giro (duração 10s) para o Talhador Estilhaçador Cruzado. Barato e spammável.',40 details: ['RC5 acerta 7×7, GCD 0.2s, 5 SP.', 'Contadores de Giro persistem 10s para habilitar burst do CRS.', 'Essencial para level e gerenciamento de mobs escravos.']41 },42 {43 id: 'cross-ripper-slasher',44 name: 'Talhador Estilhaçador Cruzado',45 pt: 'Castigo de Loki',46 category: 'aoe',47 ratings: { popularity: 4, damage: 4, qol: 3, efficiency: 4 },48 prereq: 'Cortador Giratório Nv. 5',49 summary: 'Arremessar katanas consumindo todos os Contadores de Giro para burst à distância. Escala com contadores, nível base e AGI. Opcional em builds IC.',50 details: ['Alcance ~13 células.', 'Dano fortemente influenciado pela contagem de stacks.', 'Cooldown 1s; bom para snipe, não DPS primário.']51 },52 53 // Movimentação54 {55 id: 'dark-illusion',56 name: 'Ilusão Sombria',57 pt: 'Passo Sombrio',58 category: 'move',59 ratings: { popularity: 5, damage: 2, qol: 5, efficiency: 4 },60 prereq: 'Impacto Cruzado Nv. 3',61 summary: 'Teletransporta para o alvo dentro de 9–13 células dependendo do nível. Mobilidade central para builds IC.',62 details: ['Cooldown 0.5s.', 'Atravessa terreno sem consumir contadores.', 'Essencial para fechar lacunas e reposicionamento.']63 },64 65 // Defesa66 {67 id: 'counter-slash',68 name: 'Contra-ataque',69 pt: 'Retaliação',70 category: 'def',71 ratings: { popularity: 3, damage: 5, qol: 3, efficiency: 3 },72 prereq: 'Bloqueio de Arma Nv. 1',73 summary: 'AoE reativo que atravessa toda defesa quando acionado da Postura de Contra-ataque. Buffs pós-2020: 10 níveis, AoE 5×5, sem penalidade EDP.',74 details: ['Requer Bloqueio de Arma para entrar na Postura de Contra-ataque.', 'Maior burst contra MVPs de alta DEF durante janelas de postura.', 'Dependente de RNG; trade-off de decisão de build.']75 },76 {77 id: 'weapon-blocking',78 name: 'Bloqueio de Arma',79 pt: 'Reflexo de Combate',80 category: 'def',81 ratings: { popularity: 3, damage: 1, qol: 3, efficiency: 3 },82 prereq: '—',83 summary: 'Chance de bloquear ataques físicos corpo a corpo e entrar na Postura de Contra-ataque. Dreno de SP enquanto ativo.',84 details: ['Máx. ~35% chance de bloqueio.', 'Habilita Contra-ataque e Esmagador de Arma.', 'Situacional em builds IC modernas.']85 },86 {87 id: 'hallucination-walk',88 name: 'Caminho da Alucinação',89 pt: 'Passos da Ilusão',90 category: 'def',91 ratings: { popularity: 4, damage: 1, qol: 5, efficiency: 4 },92 prereq: 'Ameaça Fantasma Nv. 1',93 summary: 'Aumenta grandemente a FUGA e concede esquiva mágica. Combina bem com builds CRIT de alta AGI para sobrevivencia MVP.',94 details: ['Sobrevivência de alto valor em lutas MVP solo.', 'Não afeta dano diretamente.']95 },96 97 // Furtividade98 {99 id: 'cloaking-exceed',100 name: 'Exceder Esconderijo',101 pt: 'Ocultação',102 category: 'stealth',103 ratings: { popularity: 5, damage: 1, qol: 5, efficiency: 5 },104 prereq: '—',105 summary: 'Invisibilidade aprimorada que não requer paredes. Insensível às raças Inseto/Demônio.',106 details: ['Ferramenta central de posicionamento e fuga.', 'QoL fantástico em todo conteúdo.']107 },108 109 // Sistema de veneno110 {111 id: 'new-poison-research',112 name: 'Nova Pesquisa de Veneno',113 pt: 'Pesquisa de Toxinas',114 category: 'poison',115 ratings: { popularity: 5, damage: 1, qol: 5, efficiency: 5 },116 prereq: '—',117 summary: 'Desbloqueia venenos GX e estende duração do EDP em ~15s por nível. Utilidade obrigatória.',118 details: ['EDP dura ~300s com Pesquisa 10.', 'Acesso a Maldição do Esquecimento, Paralisia e outros venenos.']119 },120 {121 id: 'edp',122 name: 'Encantar com Veneno Mortal',123 pt: 'Encantar com Veneno Mortal',124 category: 'poison',125 ratings: { popularity: 5, damage: 5, qol: 5, efficiency: 5 },126 prereq: 'Criar Veneno Mortal Nv. 1',127 summary: 'Multiplica ATK da arma ~5× no Nv5. Pós-2020: efeito completo em IC/Golpe Sônico/Contra-ataque.',128 details: ['Consume Garrafa de Veneno.', 'Mantenha 100% de uptime para DPS máximo.']129 },130 {131 id: 'dark-claw',132 name: 'Garra Sombria',133 pt: 'Garra Sombria',134 category: 'poison',135 ratings: { popularity: 5, damage: 5, qol: 3, efficiency: 5 },136 prereq: '—',137 summary: 'Burst de dano corpo a corpo de curta duração (5s). Cooldown importante para aplicar durante janelas.',138 details: ['Aplicar durante bursts de alto valor.', 'Requer timing para evitar downtime.']139 },140 {141 id: 'poisonous-weapon',142 name: 'Arma Venenosa',143 pt: 'Aplicar Toxina',144 category: 'poison',145 ratings: { popularity: 4, damage: 3, qol: 4, efficiency: 4 },146 prereq: '—',147 summary: 'Cobre a arma com venenos GX, adicionando ~10% de dano corpo a corpo e chances de status.',148 details: ['Bom multiplicador de dano passivo.', 'Sinergiza com efeitos de veneno.']149 },150 151 // Pré-requisitos Assassin Cross152 {153 id: 'sonic-blow',154 name: 'Golpe Sônico',155 pt: 'Lâminas Destruidoras',156 category: 'prereq',157 ratings: { popularity: 3, damage: 4, qol: 3, efficiency: 5 },158 prereq: '—',159 summary: 'Ataque combo de 8 acertos. Pré-requisito para IC e RC. Recebe EDP completo pós-2020.',160 details: ['DPS fallback se IC indisponível.', '10 pontos obrigatórios para acesso ao IC.']161 },162 {163 id: 'katar-mastery',164 name: 'Maestria Katar',165 pt: 'Perícia com Katar',166 category: 'prereq',167 ratings: { popularity: 5, damage: 5, qol: 5, efficiency: 5 },168 prereq: '—',169 summary: 'Aumenta ATK com armas Katar. Passivo central para builds Katar.',170 details: ['Não pegue Maestria Katar Avançada se usar adagas duplas (interferência de Ataque Duplo).']171 },172 {173 id: 'adv-katar-mastery',174 name: 'Maestria Katar Avançada',175 pt: 'Perícia Avançada',176 category: 'prereq',177 ratings: { popularity: 5, damage: 5, qol: 5, efficiency: 5 },178 prereq: 'Maestria Katar',179 summary: 'Mais aumento de ATK para Kataras. Pular para builds críticas de adaga dupla.',180 details: ['Evitar se construindo adaga dupla + CRIT.']181 },182 {183 id: 'meteor-assault',184 name: 'Investida Meteoro',185 pt: 'Impacto Meteoro',186 category: 'prereq',187 ratings: { popularity: 2, damage: 3, qol: 2, efficiency: 3 },188 prereq: '—',189 summary: 'AoE 5×5 com tempo de conjuração. Não afetado pelo EDP; geralmente inferior ao RC pós-2020.',190 details: ['Opção legacy para level de adaga dupla com Sapatos do Executor.']191 },192 {193 id: 'create-poison',194 name: 'Criar Veneno Mortal',195 pt: 'Criar Veneno Mortal',196 category: 'prereq',197 ratings: { popularity: 5, damage: 1, qol: 3, efficiency: 5 },198 prereq: '—',199 summary: 'Cria Garrafas de Veneno para EDP. Pré-requisito de ponto único.',200 details: ['Necessário para desbloquear EDP.']201 },202 203 // Utilidade204 {205 id: 'venom-impress',206 name: 'Impressão de Veneno',207 pt: 'Potencializar Veneno',208 category: 'utility',209 ratings: { popularity: 3, damage: 3, qol: 3, efficiency: 3 },210 prereq: '—',211 summary: 'Adiciona bônus contra alvos fracos de veneno; reduz resistência a veneno em até 50%.',212 details: ['Otimização especializada.']213 }214];215 216const CATEGORY_LABELS = {217 dps: 'DPS Principal',218 aoe: 'AoE',219 move: 'Movimentação',220 def: 'Defesa',221 stealth: 'Furtividade',222 poison: 'Sistema de Veneno',223 prereq: 'Pré-requisitos Assassin Cross',224 utility: 'Utilidade',225};226function renderSkills() {227 const grid = document.getElementById('skillGrid');228 grid.innerHTML = '';229 230 const filters = {231 dps: document.getElementById('filter-dps').checked,232 aoe: document.getElementById('filter-aoe').checked,233 move: document.getElementById('filter-move').checked,234 def: document.getElementById('filter-def').checked,235 stealth: document.getElementById('filter-stealth').checked,236 poison: document.getElementById('filter-poison').checked,237 prereq: document.getElementById('filter-prereq').checked,238 utility: document.getElementById('filter-utility').checked,239 };240 241 SKILLS.filter(s => filters[s.category]).forEach(skill => {242 const card = document.createElement('div');243 card.className = 'skill-card';244 card.innerHTML = `245 <div class="skill-header">246 <div>247 <h3 class="skill-title">${skill.name} <span class="skill-sub">(${skill.pt})</span></h3>248 <div class="badges">249 <span class="badge primary">${CATEGORY_LABELS[skill.category]}</span>250 ${skill.category === 'aoe' ? '<span class="badge aoe">AoE</span>' : ''}251 </div>252 </div>253 <div class="stars" aria-label="Ratings">${renderStars(skill.ratings.popularity)}</div>254 </div>255 <p class="skill-desc">${skill.summary}</p>256 <ul class="list">257 ${skill.details.map(d => `<li>${d}</li>`).join('')}258 </ul>259 <div class="meta">260 <div><strong>Popularidade</strong> ${'★'.repeat(skill.ratings.popularity)}${'☆'.repeat(5 - skill.ratings.popularity)}</div>261 <div><strong>Dano</strong> ${'★'.repeat(skill.ratings.damage)}${'☆'.repeat(5 - skill.ratings.damage)}</div>262 <div><strong>Qualidade de Vida</strong> ${'★'.repeat(skill.ratings.qol)}${'☆'.repeat(5 - skill.ratings.qol)}</div>263 <div><strong>Eficiência da Habilidade</strong> ${'★'.repeat(skill.ratings.efficiency)}${'☆'.repeat(5 - skill.ratings.efficiency)}</div>264 </div>265 <div class="note"><strong>Pré-requisito:</strong> ${skill.prereq}</div>266`;267 grid.appendChild(card);268 });269}270 271function renderStars(n) {272 return '★'.repeat(n) + '☆'.repeat(5 - n);273}274 275['filter-dps','filter-aoe','filter-move','filter-def','filter-stealth','filter-poison','filter-prereq','filter-utility']276 .forEach(id => document.getElementById(id).addEventListener('change', renderSkills));277 278// Calculators279function clamp(v, min, max) { return Math.max(min, Math.min(max, v)); }280 281function computeASPD(agi) {282 // Simplified: target 193 for 7.14 APS; not calculating exact formula283 return clamp(agi, 1, 200);284}285 286function computeCritDisplayed(luk) {287 // Base CRIT ≈ LUK/3 (rounded). Gear/buffs would add separately.288 return Math.floor(luk / 3);289}290 291function computeCritEffective(critDisplay, weapon = 'katar') {292 // Katar doubles displayed CRIT in calc; otherwise 1:1293 return weapon === 'katar' ? critDisplay * 2 : critDisplay;294}295 296function updateStats() {297 const BLv = parseInt(document.getElementById('baseLevel').value || '175', 10);298 const JLv = parseInt(document.getElementById('jobLevel').value || '70', 10);299 const STR = parseInt(document.getElementById('statStr').value || '1', 10);300 const AGI = parseInt(document.getElementById('statAgi').value || '1', 10);301 const VIT = parseInt(document.getElementById('statVit').value || '1', 10);302 const INT = parseInt(document.getElementById('statInt').value || '1', 10);303 const DEX = parseInt(document.getElementById('statDex').value || '1', 10);304 const LUK = parseInt(document.getElementById('statLuk').value || '1', 10);305 306 const aspd = computeASPD(AGI);307 document.getElementById('aspdValue').textContent = aspd;308 document.getElementById('aspdTarget').textContent = '193';309 310 const critDisplay = computeCritDisplayed(LUK);311 const critEffective = computeCritEffective(critDisplay, 'katar');312 313 document.getElementById('critDisplay').textContent = critDisplay;314 document.getElementById('critEffective').textContent = critEffective;315 316 // CI uses half effective CRIT317 const ciCritChance = Math.min(100, Math.floor(critEffective / 2));318 document.getElementById('ciCritChance').textContent = ciCritChance + '%';319 320 const vitTotal = VIT + Math.min(6, JLv); // assume 6 job bonus321 document.getElementById('vitImmune').textContent = vitTotal >= 100 ? 'Yes' : 'No';322}323 324function updateDamage() {325 const totalAtk = parseFloat(document.getElementById('totalAtk').value || '0');326 const weaponAtk = parseFloat(document.getElementById('weaponAtk').value || '0');327 const edp = parseFloat(document.getElementById('edpMult').value || '5');328 const darkClaw = parseFloat(document.getElementById('darkClaw').value || '1.4');329 const pWpn = parseFloat(document.getElementById('poisonousWpn').value || '1.10');330 const critMult = parseFloat(document.getElementById('critMult').value || '1.9');331 const misc = parseFloat(document.getElementById('miscMod').value || '1.0');332 const ciMod = parseFloat(document.getElementById('ciSkillMult').value || '3762.5') / 100.0;333 const assumeCrit = document.getElementById('assumeCrit').checked;334 335 // Simplified Cross Impact damage model336 const base = totalAtk;337 const afterEDP = base * edp;338 const withBuffs = afterEDP * darkClaw * pWpn;339 const withSkill = withBuffs * ciMod;340 const withCrit = assumeCrit ? withSkill * critMult : withSkill; // non-crit uses ~1.0341 const final = withCrit * misc;342 343 document.getElementById('ciDamage').textContent = Math.round(final).toLocaleString();344}345 346function updateHitReq() {347 const flee = parseInt(document.getElementById('enemyFlee').value || '0', 10);348 const agiUp = document.getElementById('agiUp').checked;349 const effectiveFlee = agiUp ? flee * 2 : flee;350 351 const hit95 = effectiveFlee + 80;352 const hit99 = effectiveFlee + 120;353 354 document.getElementById('hit95').textContent = hit95;355 document.getElementById('hit99').textContent = hit99;356}357 358[359 'baseLevel','jobLevel','statStr','statAgi','statVit','statInt','statDex','statLuk'360].forEach(id => document.getElementById(id).addEventListener('input', updateStats));361 362[363 'weaponAtk','totalAtk','edpMult','darkClaw','poisonousWpn','critMult','miscMod','ciSkillMult','assumeCrit'364].forEach(id => document.getElementById(id).addEventListener('input', updateDamage));365 366['enemyFlee','agiUp'].forEach(id => document.getElementById(id).addEventListener('input', updateHitReq));367 368// Initial render369renderSkills();370updateStats();371updateDamage();372updateHitReq();373 374// Smooth scroll for anchors375document.querySelectorAll('a[href^="#"]').forEach(a => {376 a.addEventListener('click', e => {377 const id = a.getAttribute('href').slice(1);378 const el = document.getElementById(id);379 if (el) {380 e.preventDefault();381 el.scrollIntoView({ behavior: 'smooth', block: 'start' });382 }383 });384});