CoolFace
Apppublic

computerism/guillotine-cross-sicario-ultimate-guide

sourceHugging Faceupdated 11mo agoView on Hugging Face
0likes
script.js384 linesDownload Raw Back to root
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});