MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
/* | /* TimeRO MediaWiki:Common.js | ||
Fixes Card Database and Beginner Leveling Guide loaders. | |||
ES5-safe: no const, let, arrow functions, template literals or nullish coalescing. */ | |||
(function () { | (function () { | ||
'use strict'; | 'use strict'; | ||
function esc(v){return String(v==null?'':v).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');} | |||
function style(id,css){if(document.getElementById(id))return;var s=document.createElement('style');s.id=id;s.appendChild(document.createTextNode(css));document.head.appendChild(s);} | |||
function ajax(url,ok,fail){var x=new XMLHttpRequest();x.open('GET',url,true);x.setRequestHeader('Accept','application/json');x.onreadystatechange=function(){if(x.readyState!==4)return;if(x.status<200||x.status>=300){fail('HTTP '+x.status+': '+x.responseText.substr(0,240));return;}try{ok(JSON.parse(x.responseText));}catch(e){fail('JSON inválido: '+x.responseText.substr(0,240));}};x.onerror=function(){fail('Falha de rede.');};x.send(null);} | |||
function debounce(fn,ms){var t;return function(){var a=arguments,self=this;clearTimeout(t);t=setTimeout(function(){fn.apply(self,a);},ms);};} | |||
function rgba(hex,a){var h=String(hex||'#58d7ff').replace('#',''),n=parseInt(h,16);return 'rgba('+((n>>16)&255)+','+((n>>8)&255)+','+(n&255)+','+a+')';} | |||
function injectSharedCss(){style('timero-apps-fixed-css', | |||
'.tr-app,.tr-app *{box-sizing:border-box}.tr-app{font-family:Segoe UI,system-ui,sans-serif;color:#d8ecff}.tr-shell{background:radial-gradient(circle at 18% 0%,rgba(74,144,217,.10),transparent 34%),radial-gradient(circle at 88% 24%,rgba(92,70,180,.08),transparent 30%),linear-gradient(135deg,rgba(5,10,22,.98),rgba(2,5,14,.99));border:1px solid rgba(80,170,255,.18);border-radius:18px;padding:24px;margin:0 0 34px;box-shadow:0 0 30px rgba(0,0,0,.35),inset 0 0 28px rgba(80,160,255,.025)}'+ | |||
'.tr-head{background:linear-gradient(90deg,rgba(74,144,217,.14),rgba(74,144,217,.04),transparent);border:1px solid rgba(74,144,217,.18);border-left:5px solid #4a90d9;border-radius:12px;padding:16px 18px;margin:0 0 18px}.tr-kicker{color:#58d7ff;font-weight:900;letter-spacing:.10em;text-transform:uppercase;font-size:.78rem;margin-bottom:8px}.tr-title{color:#fff;font-size:clamp(1.4rem,2.6vw,2rem);font-weight:900;margin:0 0 6px;line-height:1.1}.tr-sub{color:rgba(180,205,230,.72);font-size:.92rem;line-height:1.65}.tr-btn{border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.04);color:rgba(180,205,230,.72);border-radius:999px;padding:8px 13px;cursor:pointer;font-family:inherit;font-weight:800;font-size:.78rem}.tr-btn.active{background:linear-gradient(135deg,rgba(74,144,217,.22),rgba(74,144,217,.08));border-color:rgba(88,215,255,.30);color:#58d7ff}.tr-pill{display:inline-flex;align-items:center;justify-content:center;padding:6px 10px;border-radius:999px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);font-weight:800;font-size:.76rem;white-space:nowrap}'+ | |||
'.tc-toolbar{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:16px;margin:0 0 16px}.tc-top{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.tc-search-wrap{flex:1;min-width:260px;position:relative}.tc-search-wrap span{position:absolute;left:13px;top:50%;transform:translateY(-50%);opacity:.55}.tc-search{width:100%;padding:11px 12px 11px 40px;border-radius:11px;background:rgba(0,0,0,.34);border:1px solid rgba(255,255,255,.09);color:#e8eef8;font-size:.92rem;outline:none}.tc-toggle{display:inline-flex;gap:9px;align-items:center;cursor:pointer;padding:10px 14px;border-radius:11px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);font-weight:800}.tc-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.tc-table{border:1px solid rgba(255,255,255,.08);border-radius:14px;overflow:hidden;background:rgba(3,6,14,.96)}.tc-head-row,.tc-row{display:grid;grid-template-columns:88px 1.35fr 150px 145px 120px;align-items:center}.tc-head-row{background:rgba(0,0,0,.42);border-bottom:1px solid rgba(255,255,255,.06)}.tc-th{padding:12px 14px;color:#6070a0;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.68rem;border-right:1px solid rgba(255,255,255,.045);cursor:pointer}.tc-row{border-bottom:1px solid rgba(255,255,255,.045);cursor:pointer}.tc-row:hover{background:rgba(74,144,217,.06)}.tc-cell{padding:13px 14px;border-right:1px solid rgba(255,255,255,.035)}.tc-id{font-family:Courier New,monospace;color:#f0c840;font-weight:900}.tc-name{display:flex;align-items:center;gap:12px}.tc-icon{width:42px;height:42px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;overflow:hidden;flex:0 0 42px}.tc-icon img{max-width:36px;max-height:36px}.tc-card-title{color:#58d7ff;font-weight:900}.tc-small{color:rgba(180,205,230,.58);font-size:.76rem;margin-top:3px}.tc-status{display:inline-flex;padding:6px 10px;border-radius:999px;font-size:.72rem;font-weight:900}.tc-changed{background:rgba(112,216,144,.10);border:1px solid rgba(112,216,144,.24);color:#70d890}.tc-original{background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.08);color:rgba(180,205,230,.55)}.tc-detail{display:none;background:rgba(0,0,0,.18);border-bottom:1px solid rgba(255,255,255,.055)}.tc-detail.open{display:block}.tc-detail-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;padding:16px}.tc-box{border-radius:12px;padding:14px;background:linear-gradient(135deg,rgba(8,14,26,.96),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);min-height:112px}.tc-box h4{color:#6070a0;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.68rem;margin:0 0 8px}.tc-box div{color:rgba(220,235,255,.78);font-size:.84rem;line-height:1.65;white-space:pre-wrap}.tc-msg{padding:34px;text-align:center;color:rgba(180,205,230,.58);font-weight:700}.tc-error{color:#ff8a8a}.tc-groups{margin-top:26px}.tc-group{border-radius:14px;border:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));overflow:hidden;margin-bottom:10px}.tc-group-main{padding:15px 18px;display:grid;grid-template-columns:auto 1fr auto;gap:13px;align-items:center}.tc-group-icon{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:1.25rem}.tc-group-key{font-size:.64rem;font-weight:900;letter-spacing:.11em;text-transform:uppercase;margin-bottom:2px}.tc-group-name{color:#fff;font-weight:900}.tc-group-bonus{padding:11px 18px;border-top:1px solid rgba(255,255,255,.055);color:rgba(220,235,255,.74);line-height:1.55;font-size:.84rem}'+ | |||
'.tl-root{margin:-1em -1.5em;min-height:100vh;background:radial-gradient(circle at 18% 0%,rgba(88,215,255,.09),transparent 34%),radial-gradient(circle at 88% 24%,rgba(176,108,255,.08),transparent 30%),linear-gradient(135deg,#050914,#02050e);overflow:hidden}.tl-inner{max-width:1280px;margin:0 auto;padding:44px 28px 60px}.tl-hero{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(88,215,255,.18);border-radius:18px;padding:34px;margin-bottom:18px}.tl-hero h1{font-size:clamp(2.2rem,5vw,4rem);line-height:.96;font-weight:900;color:#fff;letter-spacing:-.035em;margin:0 0 16px}.tl-hero h1 span{background:linear-gradient(90deg,#00ff88,#58d7ff,#f9a826);-webkit-background-clip:text;background-clip:text;color:transparent}.tl-stats,.tl-grid,.tl-checks,.tl-related{display:grid;gap:12px}.tl-stats{grid-template-columns:repeat(5,1fr);margin:18px 0}.tl-stat{background:rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:14px;text-align:center}.tl-stat strong{display:block;font-size:1.35rem;color:#58d7ff;font-weight:900}.tl-stat span{font-size:.72rem;color:rgba(122,144,176,.72);letter-spacing:.12em;text-transform:uppercase;font-weight:800}.tl-panel{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);border-radius:18px;padding:16px;margin-bottom:18px}.tl-label{color:#7a90b0;font-weight:900;letter-spacing:.11em;text-transform:uppercase;font-size:.72rem;margin-bottom:10px}.tl-flex{display:flex;gap:9px;flex-wrap:wrap}.tl-track{height:12px;border-radius:999px;background:rgba(255,255,255,.05);overflow:hidden;display:grid;grid-template-columns:24.5fr 24.5fr 20fr 15fr 16fr;margin-bottom:14px}.tl-track span:nth-child(1){background:#00ff88}.tl-track span:nth-child(2){background:#00d4ff}.tl-track span:nth-child(3){background:#f9a826}.tl-track span:nth-child(4){background:#b06cff}.tl-track span:nth-child(5){background:#ff3d5a}.tl-phase{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid var(--line);border-radius:18px;padding:24px;margin-bottom:22px}.tl-head{display:flex;gap:18px;margin-bottom:22px}.tl-icon{width:64px;height:64px;border-radius:18px;display:flex;align-items:center;justify-content:center;flex:0 0 64px;font-size:1.8rem;background:var(--soft);border:1px solid var(--line)}.tl-chip{display:inline-flex;margin:0 8px 8px 0;padding:3px 10px;border-radius:999px;background:var(--soft);border:1px solid var(--line);color:var(--color);font-size:.65rem;letter-spacing:.13em;text-transform:uppercase;font-weight:900}.tl-phase h2{color:#fff;margin:0 0 8px;font-size:clamp(1.35rem,2.5vw,2rem);border:0}.tl-phase p{color:rgba(176,192,224,.75);line-height:1.7;margin:0}.tl-grid{grid-template-columns:1fr 1fr;margin-bottom:18px}.tl-box{border-radius:16px;overflow:hidden;background:rgba(0,0,0,.24);border:1px solid var(--line)}.tl-box-head{padding:13px 16px;background:var(--soft);border-bottom:1px solid var(--line);color:var(--color);font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.78rem}.tl-box-body{padding:15px;display:flex;flex-direction:column;gap:10px}.tl-card{border-radius:12px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.07);padding:12px 14px}.tl-map{display:flex;justify-content:space-between;gap:14px}.tl-name{color:#fff;font-size:.95rem;font-weight:900}.tl-muted{color:rgba(122,144,176,.72);font-size:.76rem;margin-top:3px}.tl-level{color:var(--color);font-size:.78rem;font-weight:900;white-space:nowrap;text-align:right}.tl-mob{cursor:pointer}.tl-mob-main{display:flex;align-items:center;gap:12px}.tl-mob-icon{width:42px;height:42px;border-radius:10px;display:flex;align-items:center;justify-content:center;background:var(--soft);border:1px solid var(--line);font-size:1.2rem}.tl-mob-info{flex:1}.tl-detail{display:none;padding:10px 0 0 54px;color:rgba(180,205,230,.78);font-size:.82rem;line-height:1.6}.tl-mob.open .tl-detail{display:block}.tl-checks{grid-template-columns:1fr 1fr}.tl-check{display:flex;align-items:center;gap:10px;cursor:pointer}.tl-mark{width:18px;height:18px;border-radius:5px;border:1px solid var(--line);background:var(--soft);display:flex;align-items:center;justify-content:center;color:var(--color);font-weight:900}.tl-check.checked .tl-text{text-decoration:line-through;opacity:.55}.tl-note{display:none;margin-top:14px;border-radius:12px;padding:14px 16px;color:rgba(220,235,255,.78);line-height:1.65;font-size:.88rem}.tl-note strong{display:block;margin-bottom:5px;letter-spacing:.09em;text-transform:uppercase;font-size:.75rem}.tl-footer{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:20px}.tl-related{grid-template-columns:repeat(4,1fr);margin-top:24px}.tl-related .tl-panel{text-align:center;margin:0}@media(max-width:980px){.tl-stats,.tl-grid,.tl-checks,.tl-related{grid-template-columns:1fr}.tl-inner{padding:26px 14px 44px}.tl-hero,.tl-phase{padding:20px}.tl-head{flex-direction:column}.tl-map{flex-direction:column}.tl-level{text-align:left}}');} | |||
/* Card app */ | |||
function initCards(){var root=document.getElementById('timero-card-db-app');if(!root||root.getAttribute('data-ready')==='1')return;root.setAttribute('data-ready','1');injectSharedCss();var state={api:root.getAttribute('data-api')||'/pt/api/wiki_cards.php',q:'',cat:'all',changed:false,sort:'card_name',dir:'asc',cards:[],groups:[],err:'',load:false};var cats=[['all','Todas','◆','#7c6aff'],['weapon','Armas','⚔️','#ff6b7a'],['armor','Armaduras','🛡','#00d4ff'],['accessory','Acessórios','💎','#f9a826'],['headgear','Headgear','🎩','#b06cff'],['shield','Escudos','🛡️','#70b8ff'],['garment','Capas','🧥','#60d090'],['shoes','Sapatos','👢','#f0c840']];function meta(id){for(var i=0;i<cats.length;i++)if(cats[i][0]===id)return cats[i];return cats[0];}function readScript(s){return String(s||'').replace(/bonus\s+/gi,'').replace(/;/g,'; ').replace(/bAllStats/gi,'All Stats').replace(/bMaxHP/gi,'Max HP').replace(/bMaxSP/gi,'Max SP').replace(/bBaseAtk/gi,'ATK').replace(/bMatk/gi,'MATK').replace(/bStr/gi,'STR').replace(/bAgi/gi,'AGI').replace(/bVit/gi,'VIT').replace(/bInt/gi,'INT').replace(/bDex/gi,'DEX').replace(/bLuk/gi,'LUK')||'—';} | |||
root.className+=' tr-app';root.innerHTML='<div class="tr-shell"><div class="tr-head"><div class="tr-kicker">◇ Banco de Dados</div><h2 class="tr-title">Todas as Cartas Balanceadas</h2><div class="tr-sub">Pesquise por nome da carta, ID, monstro, slot, efeito antigo, efeito novo, bônus de coleção ou script de coleção.</div></div><div class="tc-toolbar"><div class="tc-top"><div class="tc-search-wrap"><span>🔍</span><input id="tc-search" class="tc-search" placeholder="Buscar carta, ID, monstro, efeito ou coleção..."></div><label class="tc-toggle"><input id="tc-changed" type="checkbox"> ⚡ Apenas alteradas</label><div id="tc-count" class="tr-pill">— cartas</div></div><div id="tc-tabs" class="tc-tabs"></div></div><div class="tc-table"><div class="tc-head-row"><div class="tc-th" data-sort="id">ID ↕</div><div class="tc-th" data-sort="name">Carta / Monstro ↕</div><div class="tc-th" data-sort="slot">Slot ↕</div><div class="tc-th" data-sort="category">Categoria ↕</div><div class="tc-th">Status</div></div><div id="tc-body"><div class="tc-msg">Carregando cartas...</div></div></div><div class="tc-groups"><div class="tr-head" style="margin-top:26px"><div class="tr-kicker">◇ Grupos de Coleção</div><h2 class="tr-title" style="font-size:1.35rem">Bônus permanentes por grupo</h2><div class="tr-sub">Dados carregados da tabela <strong>wiki_card_groups</strong>.</div></div><div id="tc-groups"></div></div></div>'; | |||
var tabs=root.querySelector('#tc-tabs');for(var i=0;i<cats.length;i++)(function(c){var b=document.createElement('button');b.className='tr-btn'+(c[0]===state.cat?' active':'');b.innerHTML=esc(c[2])+' '+esc(c[1]);b.onclick=function(){state.cat=c[0];fetchCards();};tabs.appendChild(b);})(cats[i]);root.querySelector('#tc-search').oninput=debounce(function(){state.q=this.value;fetchCards();},220);root.querySelector('#tc-changed').onchange=function(){state.changed=this.checked;fetchCards();};var hs=root.querySelectorAll('.tc-th[data-sort]');for(i=0;i<hs.length;i++)hs[i].onclick=function(){var s=this.getAttribute('data-sort');if(state.sort===s)state.dir=state.dir==='asc'?'desc':'asc';else{state.sort=s;state.dir='asc';}fetchCards();};function fetchCards(){var bs=root.querySelectorAll('#tc-tabs .tr-btn');for(var b=0;b<bs.length;b++)bs[b].className='tr-btn'+(cats[b][0]===state.cat?' active':'');state.load=true;render();var q='q='+encodeURIComponent(state.q)+'&category='+state.cat+'&changed='+(state.changed?'1':'0')+'&sort='+state.sort+'&dir='+state.dir;ajax(state.api+(state.api.indexOf('?')===-1?'?':'&')+q,function(d){state.load=false;if(!d||!d.ok){state.err=(d&&d.error)||'Erro desconhecido';state.cards=[];state.groups=[];}else{state.err='';state.cards=d.cards||[];state.groups=d.groups||[];}render();},function(e){state.load=false;state.err=e;state.cards=[];state.groups=[];render();});}function render(){var body=root.querySelector('#tc-body'),count=root.querySelector('#tc-count');count.innerHTML=state.cards.length+' carta'+(state.cards.length===1?'':'s');if(state.load){body.innerHTML='<div class="tc-msg">Carregando cartas...</div>';return;}if(state.err){body.innerHTML='<div class="tc-msg tc-error">Erro: '+esc(state.err)+'</div>';return;}if(!state.cards.length){body.innerHTML='<div class="tc-msg">Nenhuma carta encontrada.</div>';return;}body.innerHTML='';for(var i=0;i<state.cards.length;i++)(function(card){var m=meta(card.category),row=document.createElement('div'),det=document.createElement('div');row.className='tc-row';row.innerHTML='<div class="tc-cell tc-id">#'+esc(card.card_id)+'</div><div class="tc-cell"><div class="tc-name"><div class="tc-icon"><img src="https://timero.com.br/images/item/icons/'+esc(card.card_id)+'.png"></div><div><div class="tc-card-title">'+esc(card.card_name)+'</div>'+(card.monster_name?'<div class="tc-small">'+esc(card.monster_name)+'</div>':'')+'</div></div></div><div class="tc-cell"><span class="tr-pill">'+esc(card.slot_type||'Unknown')+'</span></div><div class="tc-cell"><span class="tr-pill" style="color:'+m[3]+';border-color:'+m[3]+'44">'+m[2]+' '+esc(card.collection_group_name||'—')+'</span></div><div class="tc-cell">'+(String(card.changed)==='1'?'<span class="tc-status tc-changed">Alterada</span>':'<span class="tc-status tc-original">Original</span>')+'</div>';var img=row.querySelector('img');img.onerror=function(){this.parentNode.innerHTML='🃏';};det.className='tc-detail';det.innerHTML='<div class="tc-detail-grid"><div class="tc-box"><h4>Efeito Antigo</h4><div>'+esc(card.old_effect||'—')+'</div></div><div class="tc-box"><h4>Efeito Novo</h4><div>'+esc(card.new_effect||'—')+'</div></div><div class="tc-box"><h4>Coleção</h4><div><b style="color:#f0c840">Grupo:</b> '+esc(card.collection_group_name||'—')+'<br><b style="color:#f0c840">Pontos:</b> '+esc(card.collection_points||0)+'<br><b style="color:#f0c840">Efeito:</b> '+esc(card.collection_effect||'—')+'<br><b style="color:#f0c840">Script:</b> '+esc(readScript(card.collection_script))+'</div></div></div>';row.onclick=function(){var open=det.className.indexOf('open')>-1,ds=body.querySelectorAll('.tc-detail.open'),rs=body.querySelectorAll('.tc-row.open');for(var a=0;a<ds.length;a++)ds[a].className='tc-detail';for(var r=0;r<rs.length;r++)rs[r].className='tc-row';if(!open){det.className='tc-detail open';row.className='tc-row open';}};body.appendChild(row);body.appendChild(det);})(state.cards[i]);var gw=root.querySelector('#tc-groups');gw.innerHTML='';if(!state.groups.length){gw.innerHTML='<div class="tc-msg">Nenhum grupo de coleção cadastrado.</div>';return;}for(i=0;i<state.groups.length;i++){var g=state.groups[i],c=g.color||'#7c6aff',el=document.createElement('div');el.className='tc-group';el.style.borderColor=c+'33';el.innerHTML='<div class="tc-group-main"><div class="tc-group-icon" style="background:'+c+'14;border:1px solid '+c+'44">'+esc(g.icon||'🃏')+'</div><div><div class="tc-group-key" style="color:'+c+'">Grupo · '+esc(g.group_key)+'</div><div class="tc-group-name">'+esc(g.group_name)+'</div></div><div class="tr-pill" style="color:'+c+';border-color:'+c+'33">'+esc(g.card_count||0)+' cartas · Min '+esc(g.min_cards||1)+'</div></div><div class="tc-group-bonus"><b style="color:'+c+'">Bônus:</b> '+esc(g.collection_effect||'—')+'</div>';gw.appendChild(el);}}fetchCards();} | |||
if ( | /* Leveling app */ | ||
document. | function initLeveling(){var root=document.getElementById('timero-leveling-guide-app');if(!root||root.getAttribute('data-ready')==='1')return;root.setAttribute('data-ready','1');injectSharedCss();var cls=[['all','Todas','◆','#58d7ff'],['swordsman','Espadachim','⚔️','#ff6b7a'],['mage','Mago','🔮','#b06cff'],['archer','Arqueiro','🏹','#00ff88'],['acolyte','Acolyte','✨','#f9a826'],['thief','Ladrão','🗡️','#7a90b0']],notes={swordsman:['⚔️','Dica: Espadachim','Priorize sobrevivência e dano consistente.'],mage:['🔮','Dica: Mago','Controle distância, elemento e consumo de SP.'],archer:['🏹','Dica: Arqueiro','Use vantagem de alcance e kite.'],acolyte:['✨','Dica: Acolyte','Heal contra Undead pode ser muito eficiente.'],thief:['🗡️','Dica: Ladrão','AGI e evasão tornam a progressão mais segura.']},ph=[['phase-1','FASE 1','Nível 1 → 25','~XX–YY minutos','🌿','#00ff88','Primeiros Passos — Poring Island & Prontera Field'],['phase-2','FASE 2','Nível 25 → 50','~XX–YY horas','⚡','#00d4ff','Construindo Momentum — Mapas Intermediários'],['phase-3','FASE 3','Nível 50 → 70','~XX–YY horas','🔥','#f9a826','Mid-Game Eficiente — Zonas de Farming'],['phase-4','FASE 4','Nível 70 → 85','~XX–YY horas','⚔️','#b06cff','Pré-Endgame — Transições e Dungeons'],['phase-5','FASE FINAL','Nível 85 → 99','~XX–YY horas','🏁','#ff3d5a','Reta Final — Caminho ao 99']];function phase(p,i){var c=p[5],maps='',mobs='',checks='',j;for(j=0;j<(i<2?3:2);j++)maps+='<div class="tl-card tl-map"><div><div class="tl-name">Mapa Fase '+(i+1)+' · '+(j+1)+'</div><div class="tl-muted">mapa_code</div></div><div><div class="tl-level">Nv. '+(i*20+1)+'–'+(i*20+20)+'</div><div class="tl-muted">Rota recomendada</div></div></div>';for(j=0;j<(i===0?2:1);j++)mobs+='<div class="tl-card tl-mob"><div class="tl-mob-main"><div class="tl-mob-icon">'+p[4]+'</div><div class="tl-mob-info"><div class="tl-name">Monstro Fase '+(i+1)+' · '+String.fromCharCode(65+j)+'</div><div class="tl-muted">Substitua pelo monstro real</div></div><div class="tl-level">EXP: ???</div><div>▼</div></div><div class="tl-detail">HP: ??? · Drops: Item 1, Item 2<br><span style="color:'+c+'">Dica:</span> Adicione dicas de combate aqui.</div></div>';var list=['Confirmar rota de leveling','Comprar consumíveis necessários','Atualizar equipamentos principais','Avançar para a próxima fase'];for(j=0;j<list.length;j++)checks+='<div class="tl-card tl-check"><div class="tl-mark"></div><div class="tl-text">'+list[j]+'</div></div>';return '<section id="'+p[0]+'" class="tl-phase" style="--color:'+c+';--soft:'+rgba(c,.08)+';--line:'+rgba(c,.22)+'"><div class="tl-head"><div class="tl-icon">'+p[4]+'</div><div><span class="tl-chip">'+p[1]+'</span><span class="tl-chip">'+p[2]+'</span><span class="tl-chip">⏱ '+p[3]+'</span><h2>'+p[6]+'</h2><p>Substitua com a descrição real da fase, mapas ideais, monstros principais, consumíveis e momento correto de troca de classe.</p></div></div><div class="tl-grid"><div class="tl-box"><div class="tl-box-head">🗺️ Mapas Recomendados</div><div class="tl-box-body">'+maps+'</div></div><div class="tl-box"><div class="tl-box-head">🐉 Monstros-Alvo</div><div class="tl-box-body">'+mobs+'</div></div></div><div class="tl-box"><div class="tl-box-head">✅ Checklist da '+p[1]+'</div><div class="tl-box-body"><div class="tl-checks">'+checks+'</div></div></div><div class="tl-note"></div><div class="tl-footer">'+(i>0?'<button class="tr-btn" data-scroll="'+ph[i-1][0]+'">← '+ph[i-1][1]+'</button>':'<span></span>')+(i<ph.length-1?'<button class="tr-btn active" data-scroll="'+ph[i+1][0]+'">Próxima Fase: '+ph[i+1][2]+' →</button>':'<button class="tr-btn active" data-scroll="timero-leveling-guide-app">Voltar ao topo ↑</button>')+'</div></section>';} | ||
root.className+=' tr-app';var filters='',nav='',blocks='',i;for(i=0;i<cls.length;i++)filters+='<button class="tr-btn'+(i===0?' active':'')+'" data-class="'+cls[i][0]+'">'+cls[i][2]+' '+cls[i][1]+'</button>';for(i=0;i<ph.length;i++){nav+='<button class="tr-btn'+(i===0?' active':'')+'" data-scroll="'+ph[i][0]+'">'+ph[i][1]+' · '+ph[i][2]+'</button>';blocks+=phase(ph[i],i);}root.innerHTML='<div class="tl-root"><div class="tl-inner"><header class="tl-hero"><div class="tr-kicker">// Guia de Progressão</div><h1>Guia de Leveling<br><span>para Iniciantes</span></h1><p class="tr-sub">Do nível 1 ao 99 — rotas otimizadas, mapas ideais por fase, dicas de consumíveis e estratégias para cada etapa da progressão no TimeRO.</p></header><div class="tl-stats"><div class="tl-stat"><strong>5</strong><span>Fases</span></div><div class="tl-stat"><strong>10+</strong><span>Mapas</span></div><div class="tl-stat"><strong>98</strong><span>Níveis</span></div><div class="tl-stat"><strong>Solo</strong><span>Estilo</span></div><div class="tl-stat"><strong>Pre-R</strong><span>Modalidade</span></div></div><div class="tl-panel"><div class="tl-label">Filtrar por classe</div><div class="tl-flex">'+filters+'</div></div><div class="tl-panel"><div class="tl-label">Progressão de Níveis</div><div class="tl-track"><span></span><span></span><span></span><span></span><span></span></div><div class="tl-flex">'+nav+'</div></div>'+blocks+'<div class="tl-related"><div class="tl-panel">🧰<b>Random Options</b></div><div class="tl-panel">🏰<b>Instances</b></div><div class="tl-panel">🔥<b>Fever System</b></div><div class="tl-panel">⏱️<b>MVP Timer</b></div></div></div></div>';var sc=root.querySelectorAll('[data-scroll]');for(i=0;i<sc.length;i++)sc[i].onclick=function(){var t=document.getElementById(this.getAttribute('data-scroll'));if(t)t.scrollIntoView({behavior:'smooth',block:'start'});};var mb=root.querySelectorAll('.tl-mob');for(i=0;i<mb.length;i++)mb[i].onclick=function(){this.className=this.className.indexOf('open')<0?this.className+' open':this.className.replace(' open','');};var ch=root.querySelectorAll('.tl-check');for(i=0;i<ch.length;i++)ch[i].onclick=function(){var on=this.className.indexOf('checked')<0,m=this.querySelector('.tl-mark');this.className=on?this.className+' checked':this.className.replace(' checked','');if(m)m.innerHTML=on?'✓':'';};var cb=root.querySelectorAll('[data-class]');for(i=0;i<cb.length;i++)cb[i].onclick=function(){var v=this.getAttribute('data-class'),j;for(j=0;j<cb.length;j++){cb[j].className='tr-btn'+(cb[j]===this?' active':'');cb[j].style.opacity=(v!=='all'&&cb[j]!==this)?.45:1;}var nt=root.querySelectorAll('.tl-note');for(j=0;j<nt.length;j++){if(v==='all'||!notes[v]){nt[j].style.display='none';nt[j].innerHTML='';}else{var n=notes[v],color='#58d7ff';for(var k=0;k<cls.length;k++)if(cls[k][0]===v)color=cls[k][3];nt[j].style.display='block';nt[j].style.border='1px solid '+rgba(color,.24);nt[j].style.background=rgba(color,.07);nt[j].innerHTML='<strong style="color:'+color+'">'+n[0]+' '+n[1]+'</strong>'+esc(n[2]);}}};} | |||
if (window.mw && mw.hook) | function boot(){initCards();initLeveling();} | ||
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot(); | |||
if(window.mw&&mw.hook)mw.hook('wikipage.content').add(boot); | |||
})(); | })(); | ||
Revision as of 16:03, 30 April 2026
/* TimeRO MediaWiki:Common.js
Fixes Card Database and Beginner Leveling Guide loaders.
ES5-safe: no const, let, arrow functions, template literals or nullish coalescing. */
(function () {
'use strict';
function esc(v){return String(v==null?'':v).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'/g,''');}
function style(id,css){if(document.getElementById(id))return;var s=document.createElement('style');s.id=id;s.appendChild(document.createTextNode(css));document.head.appendChild(s);}
function ajax(url,ok,fail){var x=new XMLHttpRequest();x.open('GET',url,true);x.setRequestHeader('Accept','application/json');x.onreadystatechange=function(){if(x.readyState!==4)return;if(x.status<200||x.status>=300){fail('HTTP '+x.status+': '+x.responseText.substr(0,240));return;}try{ok(JSON.parse(x.responseText));}catch(e){fail('JSON inválido: '+x.responseText.substr(0,240));}};x.onerror=function(){fail('Falha de rede.');};x.send(null);}
function debounce(fn,ms){var t;return function(){var a=arguments,self=this;clearTimeout(t);t=setTimeout(function(){fn.apply(self,a);},ms);};}
function rgba(hex,a){var h=String(hex||'#58d7ff').replace('#',''),n=parseInt(h,16);return 'rgba('+((n>>16)&255)+','+((n>>8)&255)+','+(n&255)+','+a+')';}
function injectSharedCss(){style('timero-apps-fixed-css',
'.tr-app,.tr-app *{box-sizing:border-box}.tr-app{font-family:Segoe UI,system-ui,sans-serif;color:#d8ecff}.tr-shell{background:radial-gradient(circle at 18% 0%,rgba(74,144,217,.10),transparent 34%),radial-gradient(circle at 88% 24%,rgba(92,70,180,.08),transparent 30%),linear-gradient(135deg,rgba(5,10,22,.98),rgba(2,5,14,.99));border:1px solid rgba(80,170,255,.18);border-radius:18px;padding:24px;margin:0 0 34px;box-shadow:0 0 30px rgba(0,0,0,.35),inset 0 0 28px rgba(80,160,255,.025)}'+
'.tr-head{background:linear-gradient(90deg,rgba(74,144,217,.14),rgba(74,144,217,.04),transparent);border:1px solid rgba(74,144,217,.18);border-left:5px solid #4a90d9;border-radius:12px;padding:16px 18px;margin:0 0 18px}.tr-kicker{color:#58d7ff;font-weight:900;letter-spacing:.10em;text-transform:uppercase;font-size:.78rem;margin-bottom:8px}.tr-title{color:#fff;font-size:clamp(1.4rem,2.6vw,2rem);font-weight:900;margin:0 0 6px;line-height:1.1}.tr-sub{color:rgba(180,205,230,.72);font-size:.92rem;line-height:1.65}.tr-btn{border:1px solid rgba(255,255,255,.08);background:rgba(255,255,255,.04);color:rgba(180,205,230,.72);border-radius:999px;padding:8px 13px;cursor:pointer;font-family:inherit;font-weight:800;font-size:.78rem}.tr-btn.active{background:linear-gradient(135deg,rgba(74,144,217,.22),rgba(74,144,217,.08));border-color:rgba(88,215,255,.30);color:#58d7ff}.tr-pill{display:inline-flex;align-items:center;justify-content:center;padding:6px 10px;border-radius:999px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);font-weight:800;font-size:.76rem;white-space:nowrap}'+
'.tc-toolbar{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:16px;margin:0 0 16px}.tc-top{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.tc-search-wrap{flex:1;min-width:260px;position:relative}.tc-search-wrap span{position:absolute;left:13px;top:50%;transform:translateY(-50%);opacity:.55}.tc-search{width:100%;padding:11px 12px 11px 40px;border-radius:11px;background:rgba(0,0,0,.34);border:1px solid rgba(255,255,255,.09);color:#e8eef8;font-size:.92rem;outline:none}.tc-toggle{display:inline-flex;gap:9px;align-items:center;cursor:pointer;padding:10px 14px;border-radius:11px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);font-weight:800}.tc-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.tc-table{border:1px solid rgba(255,255,255,.08);border-radius:14px;overflow:hidden;background:rgba(3,6,14,.96)}.tc-head-row,.tc-row{display:grid;grid-template-columns:88px 1.35fr 150px 145px 120px;align-items:center}.tc-head-row{background:rgba(0,0,0,.42);border-bottom:1px solid rgba(255,255,255,.06)}.tc-th{padding:12px 14px;color:#6070a0;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.68rem;border-right:1px solid rgba(255,255,255,.045);cursor:pointer}.tc-row{border-bottom:1px solid rgba(255,255,255,.045);cursor:pointer}.tc-row:hover{background:rgba(74,144,217,.06)}.tc-cell{padding:13px 14px;border-right:1px solid rgba(255,255,255,.035)}.tc-id{font-family:Courier New,monospace;color:#f0c840;font-weight:900}.tc-name{display:flex;align-items:center;gap:12px}.tc-icon{width:42px;height:42px;border-radius:10px;background:rgba(0,0,0,.28);border:1px solid rgba(255,255,255,.08);display:flex;align-items:center;justify-content:center;overflow:hidden;flex:0 0 42px}.tc-icon img{max-width:36px;max-height:36px}.tc-card-title{color:#58d7ff;font-weight:900}.tc-small{color:rgba(180,205,230,.58);font-size:.76rem;margin-top:3px}.tc-status{display:inline-flex;padding:6px 10px;border-radius:999px;font-size:.72rem;font-weight:900}.tc-changed{background:rgba(112,216,144,.10);border:1px solid rgba(112,216,144,.24);color:#70d890}.tc-original{background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.08);color:rgba(180,205,230,.55)}.tc-detail{display:none;background:rgba(0,0,0,.18);border-bottom:1px solid rgba(255,255,255,.055)}.tc-detail.open{display:block}.tc-detail-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;padding:16px}.tc-box{border-radius:12px;padding:14px;background:linear-gradient(135deg,rgba(8,14,26,.96),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);min-height:112px}.tc-box h4{color:#6070a0;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.68rem;margin:0 0 8px}.tc-box div{color:rgba(220,235,255,.78);font-size:.84rem;line-height:1.65;white-space:pre-wrap}.tc-msg{padding:34px;text-align:center;color:rgba(180,205,230,.58);font-weight:700}.tc-error{color:#ff8a8a}.tc-groups{margin-top:26px}.tc-group{border-radius:14px;border:1px solid rgba(255,255,255,.08);background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));overflow:hidden;margin-bottom:10px}.tc-group-main{padding:15px 18px;display:grid;grid-template-columns:auto 1fr auto;gap:13px;align-items:center}.tc-group-icon{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:1.25rem}.tc-group-key{font-size:.64rem;font-weight:900;letter-spacing:.11em;text-transform:uppercase;margin-bottom:2px}.tc-group-name{color:#fff;font-weight:900}.tc-group-bonus{padding:11px 18px;border-top:1px solid rgba(255,255,255,.055);color:rgba(220,235,255,.74);line-height:1.55;font-size:.84rem}'+
'.tl-root{margin:-1em -1.5em;min-height:100vh;background:radial-gradient(circle at 18% 0%,rgba(88,215,255,.09),transparent 34%),radial-gradient(circle at 88% 24%,rgba(176,108,255,.08),transparent 30%),linear-gradient(135deg,#050914,#02050e);overflow:hidden}.tl-inner{max-width:1280px;margin:0 auto;padding:44px 28px 60px}.tl-hero{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(88,215,255,.18);border-radius:18px;padding:34px;margin-bottom:18px}.tl-hero h1{font-size:clamp(2.2rem,5vw,4rem);line-height:.96;font-weight:900;color:#fff;letter-spacing:-.035em;margin:0 0 16px}.tl-hero h1 span{background:linear-gradient(90deg,#00ff88,#58d7ff,#f9a826);-webkit-background-clip:text;background-clip:text;color:transparent}.tl-stats,.tl-grid,.tl-checks,.tl-related{display:grid;gap:12px}.tl-stats{grid-template-columns:repeat(5,1fr);margin:18px 0}.tl-stat{background:rgba(0,0,0,.24);border:1px solid rgba(255,255,255,.08);border-radius:14px;padding:14px;text-align:center}.tl-stat strong{display:block;font-size:1.35rem;color:#58d7ff;font-weight:900}.tl-stat span{font-size:.72rem;color:rgba(122,144,176,.72);letter-spacing:.12em;text-transform:uppercase;font-weight:800}.tl-panel{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid rgba(255,255,255,.08);border-radius:18px;padding:16px;margin-bottom:18px}.tl-label{color:#7a90b0;font-weight:900;letter-spacing:.11em;text-transform:uppercase;font-size:.72rem;margin-bottom:10px}.tl-flex{display:flex;gap:9px;flex-wrap:wrap}.tl-track{height:12px;border-radius:999px;background:rgba(255,255,255,.05);overflow:hidden;display:grid;grid-template-columns:24.5fr 24.5fr 20fr 15fr 16fr;margin-bottom:14px}.tl-track span:nth-child(1){background:#00ff88}.tl-track span:nth-child(2){background:#00d4ff}.tl-track span:nth-child(3){background:#f9a826}.tl-track span:nth-child(4){background:#b06cff}.tl-track span:nth-child(5){background:#ff3d5a}.tl-phase{background:linear-gradient(135deg,rgba(8,14,26,.94),rgba(4,8,18,.99));border:1px solid var(--line);border-radius:18px;padding:24px;margin-bottom:22px}.tl-head{display:flex;gap:18px;margin-bottom:22px}.tl-icon{width:64px;height:64px;border-radius:18px;display:flex;align-items:center;justify-content:center;flex:0 0 64px;font-size:1.8rem;background:var(--soft);border:1px solid var(--line)}.tl-chip{display:inline-flex;margin:0 8px 8px 0;padding:3px 10px;border-radius:999px;background:var(--soft);border:1px solid var(--line);color:var(--color);font-size:.65rem;letter-spacing:.13em;text-transform:uppercase;font-weight:900}.tl-phase h2{color:#fff;margin:0 0 8px;font-size:clamp(1.35rem,2.5vw,2rem);border:0}.tl-phase p{color:rgba(176,192,224,.75);line-height:1.7;margin:0}.tl-grid{grid-template-columns:1fr 1fr;margin-bottom:18px}.tl-box{border-radius:16px;overflow:hidden;background:rgba(0,0,0,.24);border:1px solid var(--line)}.tl-box-head{padding:13px 16px;background:var(--soft);border-bottom:1px solid var(--line);color:var(--color);font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:.78rem}.tl-box-body{padding:15px;display:flex;flex-direction:column;gap:10px}.tl-card{border-radius:12px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.07);padding:12px 14px}.tl-map{display:flex;justify-content:space-between;gap:14px}.tl-name{color:#fff;font-size:.95rem;font-weight:900}.tl-muted{color:rgba(122,144,176,.72);font-size:.76rem;margin-top:3px}.tl-level{color:var(--color);font-size:.78rem;font-weight:900;white-space:nowrap;text-align:right}.tl-mob{cursor:pointer}.tl-mob-main{display:flex;align-items:center;gap:12px}.tl-mob-icon{width:42px;height:42px;border-radius:10px;display:flex;align-items:center;justify-content:center;background:var(--soft);border:1px solid var(--line);font-size:1.2rem}.tl-mob-info{flex:1}.tl-detail{display:none;padding:10px 0 0 54px;color:rgba(180,205,230,.78);font-size:.82rem;line-height:1.6}.tl-mob.open .tl-detail{display:block}.tl-checks{grid-template-columns:1fr 1fr}.tl-check{display:flex;align-items:center;gap:10px;cursor:pointer}.tl-mark{width:18px;height:18px;border-radius:5px;border:1px solid var(--line);background:var(--soft);display:flex;align-items:center;justify-content:center;color:var(--color);font-weight:900}.tl-check.checked .tl-text{text-decoration:line-through;opacity:.55}.tl-note{display:none;margin-top:14px;border-radius:12px;padding:14px 16px;color:rgba(220,235,255,.78);line-height:1.65;font-size:.88rem}.tl-note strong{display:block;margin-bottom:5px;letter-spacing:.09em;text-transform:uppercase;font-size:.75rem}.tl-footer{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-top:20px}.tl-related{grid-template-columns:repeat(4,1fr);margin-top:24px}.tl-related .tl-panel{text-align:center;margin:0}@media(max-width:980px){.tl-stats,.tl-grid,.tl-checks,.tl-related{grid-template-columns:1fr}.tl-inner{padding:26px 14px 44px}.tl-hero,.tl-phase{padding:20px}.tl-head{flex-direction:column}.tl-map{flex-direction:column}.tl-level{text-align:left}}');}
/* Card app */
function initCards(){var root=document.getElementById('timero-card-db-app');if(!root||root.getAttribute('data-ready')==='1')return;root.setAttribute('data-ready','1');injectSharedCss();var state={api:root.getAttribute('data-api')||'/pt/api/wiki_cards.php',q:'',cat:'all',changed:false,sort:'card_name',dir:'asc',cards:[],groups:[],err:'',load:false};var cats=[['all','Todas','◆','#7c6aff'],['weapon','Armas','⚔️','#ff6b7a'],['armor','Armaduras','🛡','#00d4ff'],['accessory','Acessórios','💎','#f9a826'],['headgear','Headgear','🎩','#b06cff'],['shield','Escudos','🛡️','#70b8ff'],['garment','Capas','🧥','#60d090'],['shoes','Sapatos','👢','#f0c840']];function meta(id){for(var i=0;i<cats.length;i++)if(cats[i][0]===id)return cats[i];return cats[0];}function readScript(s){return String(s||'').replace(/bonus\s+/gi,'').replace(/;/g,'; ').replace(/bAllStats/gi,'All Stats').replace(/bMaxHP/gi,'Max HP').replace(/bMaxSP/gi,'Max SP').replace(/bBaseAtk/gi,'ATK').replace(/bMatk/gi,'MATK').replace(/bStr/gi,'STR').replace(/bAgi/gi,'AGI').replace(/bVit/gi,'VIT').replace(/bInt/gi,'INT').replace(/bDex/gi,'DEX').replace(/bLuk/gi,'LUK')||'—';}
root.className+=' tr-app';root.innerHTML='<div class="tr-shell"><div class="tr-head"><div class="tr-kicker">◇ Banco de Dados</div><h2 class="tr-title">Todas as Cartas Balanceadas</h2><div class="tr-sub">Pesquise por nome da carta, ID, monstro, slot, efeito antigo, efeito novo, bônus de coleção ou script de coleção.</div></div><div class="tc-toolbar"><div class="tc-top"><div class="tc-search-wrap"><span>🔍</span><input id="tc-search" class="tc-search" placeholder="Buscar carta, ID, monstro, efeito ou coleção..."></div><label class="tc-toggle"><input id="tc-changed" type="checkbox"> ⚡ Apenas alteradas</label><div id="tc-count" class="tr-pill">— cartas</div></div><div id="tc-tabs" class="tc-tabs"></div></div><div class="tc-table"><div class="tc-head-row"><div class="tc-th" data-sort="id">ID ↕</div><div class="tc-th" data-sort="name">Carta / Monstro ↕</div><div class="tc-th" data-sort="slot">Slot ↕</div><div class="tc-th" data-sort="category">Categoria ↕</div><div class="tc-th">Status</div></div><div id="tc-body"><div class="tc-msg">Carregando cartas...</div></div></div><div class="tc-groups"><div class="tr-head" style="margin-top:26px"><div class="tr-kicker">◇ Grupos de Coleção</div><h2 class="tr-title" style="font-size:1.35rem">Bônus permanentes por grupo</h2><div class="tr-sub">Dados carregados da tabela <strong>wiki_card_groups</strong>.</div></div><div id="tc-groups"></div></div></div>';
var tabs=root.querySelector('#tc-tabs');for(var i=0;i<cats.length;i++)(function(c){var b=document.createElement('button');b.className='tr-btn'+(c[0]===state.cat?' active':'');b.innerHTML=esc(c[2])+' '+esc(c[1]);b.onclick=function(){state.cat=c[0];fetchCards();};tabs.appendChild(b);})(cats[i]);root.querySelector('#tc-search').oninput=debounce(function(){state.q=this.value;fetchCards();},220);root.querySelector('#tc-changed').onchange=function(){state.changed=this.checked;fetchCards();};var hs=root.querySelectorAll('.tc-th[data-sort]');for(i=0;i<hs.length;i++)hs[i].onclick=function(){var s=this.getAttribute('data-sort');if(state.sort===s)state.dir=state.dir==='asc'?'desc':'asc';else{state.sort=s;state.dir='asc';}fetchCards();};function fetchCards(){var bs=root.querySelectorAll('#tc-tabs .tr-btn');for(var b=0;b<bs.length;b++)bs[b].className='tr-btn'+(cats[b][0]===state.cat?' active':'');state.load=true;render();var q='q='+encodeURIComponent(state.q)+'&category='+state.cat+'&changed='+(state.changed?'1':'0')+'&sort='+state.sort+'&dir='+state.dir;ajax(state.api+(state.api.indexOf('?')===-1?'?':'&')+q,function(d){state.load=false;if(!d||!d.ok){state.err=(d&&d.error)||'Erro desconhecido';state.cards=[];state.groups=[];}else{state.err='';state.cards=d.cards||[];state.groups=d.groups||[];}render();},function(e){state.load=false;state.err=e;state.cards=[];state.groups=[];render();});}function render(){var body=root.querySelector('#tc-body'),count=root.querySelector('#tc-count');count.innerHTML=state.cards.length+' carta'+(state.cards.length===1?'':'s');if(state.load){body.innerHTML='<div class="tc-msg">Carregando cartas...</div>';return;}if(state.err){body.innerHTML='<div class="tc-msg tc-error">Erro: '+esc(state.err)+'</div>';return;}if(!state.cards.length){body.innerHTML='<div class="tc-msg">Nenhuma carta encontrada.</div>';return;}body.innerHTML='';for(var i=0;i<state.cards.length;i++)(function(card){var m=meta(card.category),row=document.createElement('div'),det=document.createElement('div');row.className='tc-row';row.innerHTML='<div class="tc-cell tc-id">#'+esc(card.card_id)+'</div><div class="tc-cell"><div class="tc-name"><div class="tc-icon"><img src="https://timero.com.br/images/item/icons/'+esc(card.card_id)+'.png"></div><div><div class="tc-card-title">'+esc(card.card_name)+'</div>'+(card.monster_name?'<div class="tc-small">'+esc(card.monster_name)+'</div>':'')+'</div></div></div><div class="tc-cell"><span class="tr-pill">'+esc(card.slot_type||'Unknown')+'</span></div><div class="tc-cell"><span class="tr-pill" style="color:'+m[3]+';border-color:'+m[3]+'44">'+m[2]+' '+esc(card.collection_group_name||'—')+'</span></div><div class="tc-cell">'+(String(card.changed)==='1'?'<span class="tc-status tc-changed">Alterada</span>':'<span class="tc-status tc-original">Original</span>')+'</div>';var img=row.querySelector('img');img.onerror=function(){this.parentNode.innerHTML='🃏';};det.className='tc-detail';det.innerHTML='<div class="tc-detail-grid"><div class="tc-box"><h4>Efeito Antigo</h4><div>'+esc(card.old_effect||'—')+'</div></div><div class="tc-box"><h4>Efeito Novo</h4><div>'+esc(card.new_effect||'—')+'</div></div><div class="tc-box"><h4>Coleção</h4><div><b style="color:#f0c840">Grupo:</b> '+esc(card.collection_group_name||'—')+'<br><b style="color:#f0c840">Pontos:</b> '+esc(card.collection_points||0)+'<br><b style="color:#f0c840">Efeito:</b> '+esc(card.collection_effect||'—')+'<br><b style="color:#f0c840">Script:</b> '+esc(readScript(card.collection_script))+'</div></div></div>';row.onclick=function(){var open=det.className.indexOf('open')>-1,ds=body.querySelectorAll('.tc-detail.open'),rs=body.querySelectorAll('.tc-row.open');for(var a=0;a<ds.length;a++)ds[a].className='tc-detail';for(var r=0;r<rs.length;r++)rs[r].className='tc-row';if(!open){det.className='tc-detail open';row.className='tc-row open';}};body.appendChild(row);body.appendChild(det);})(state.cards[i]);var gw=root.querySelector('#tc-groups');gw.innerHTML='';if(!state.groups.length){gw.innerHTML='<div class="tc-msg">Nenhum grupo de coleção cadastrado.</div>';return;}for(i=0;i<state.groups.length;i++){var g=state.groups[i],c=g.color||'#7c6aff',el=document.createElement('div');el.className='tc-group';el.style.borderColor=c+'33';el.innerHTML='<div class="tc-group-main"><div class="tc-group-icon" style="background:'+c+'14;border:1px solid '+c+'44">'+esc(g.icon||'🃏')+'</div><div><div class="tc-group-key" style="color:'+c+'">Grupo · '+esc(g.group_key)+'</div><div class="tc-group-name">'+esc(g.group_name)+'</div></div><div class="tr-pill" style="color:'+c+';border-color:'+c+'33">'+esc(g.card_count||0)+' cartas · Min '+esc(g.min_cards||1)+'</div></div><div class="tc-group-bonus"><b style="color:'+c+'">Bônus:</b> '+esc(g.collection_effect||'—')+'</div>';gw.appendChild(el);}}fetchCards();}
/* Leveling app */
function initLeveling(){var root=document.getElementById('timero-leveling-guide-app');if(!root||root.getAttribute('data-ready')==='1')return;root.setAttribute('data-ready','1');injectSharedCss();var cls=[['all','Todas','◆','#58d7ff'],['swordsman','Espadachim','⚔️','#ff6b7a'],['mage','Mago','🔮','#b06cff'],['archer','Arqueiro','🏹','#00ff88'],['acolyte','Acolyte','✨','#f9a826'],['thief','Ladrão','🗡️','#7a90b0']],notes={swordsman:['⚔️','Dica: Espadachim','Priorize sobrevivência e dano consistente.'],mage:['🔮','Dica: Mago','Controle distância, elemento e consumo de SP.'],archer:['🏹','Dica: Arqueiro','Use vantagem de alcance e kite.'],acolyte:['✨','Dica: Acolyte','Heal contra Undead pode ser muito eficiente.'],thief:['🗡️','Dica: Ladrão','AGI e evasão tornam a progressão mais segura.']},ph=[['phase-1','FASE 1','Nível 1 → 25','~XX–YY minutos','🌿','#00ff88','Primeiros Passos — Poring Island & Prontera Field'],['phase-2','FASE 2','Nível 25 → 50','~XX–YY horas','⚡','#00d4ff','Construindo Momentum — Mapas Intermediários'],['phase-3','FASE 3','Nível 50 → 70','~XX–YY horas','🔥','#f9a826','Mid-Game Eficiente — Zonas de Farming'],['phase-4','FASE 4','Nível 70 → 85','~XX–YY horas','⚔️','#b06cff','Pré-Endgame — Transições e Dungeons'],['phase-5','FASE FINAL','Nível 85 → 99','~XX–YY horas','🏁','#ff3d5a','Reta Final — Caminho ao 99']];function phase(p,i){var c=p[5],maps='',mobs='',checks='',j;for(j=0;j<(i<2?3:2);j++)maps+='<div class="tl-card tl-map"><div><div class="tl-name">Mapa Fase '+(i+1)+' · '+(j+1)+'</div><div class="tl-muted">mapa_code</div></div><div><div class="tl-level">Nv. '+(i*20+1)+'–'+(i*20+20)+'</div><div class="tl-muted">Rota recomendada</div></div></div>';for(j=0;j<(i===0?2:1);j++)mobs+='<div class="tl-card tl-mob"><div class="tl-mob-main"><div class="tl-mob-icon">'+p[4]+'</div><div class="tl-mob-info"><div class="tl-name">Monstro Fase '+(i+1)+' · '+String.fromCharCode(65+j)+'</div><div class="tl-muted">Substitua pelo monstro real</div></div><div class="tl-level">EXP: ???</div><div>▼</div></div><div class="tl-detail">HP: ??? · Drops: Item 1, Item 2<br><span style="color:'+c+'">Dica:</span> Adicione dicas de combate aqui.</div></div>';var list=['Confirmar rota de leveling','Comprar consumíveis necessários','Atualizar equipamentos principais','Avançar para a próxima fase'];for(j=0;j<list.length;j++)checks+='<div class="tl-card tl-check"><div class="tl-mark"></div><div class="tl-text">'+list[j]+'</div></div>';return '<section id="'+p[0]+'" class="tl-phase" style="--color:'+c+';--soft:'+rgba(c,.08)+';--line:'+rgba(c,.22)+'"><div class="tl-head"><div class="tl-icon">'+p[4]+'</div><div><span class="tl-chip">'+p[1]+'</span><span class="tl-chip">'+p[2]+'</span><span class="tl-chip">⏱ '+p[3]+'</span><h2>'+p[6]+'</h2><p>Substitua com a descrição real da fase, mapas ideais, monstros principais, consumíveis e momento correto de troca de classe.</p></div></div><div class="tl-grid"><div class="tl-box"><div class="tl-box-head">🗺️ Mapas Recomendados</div><div class="tl-box-body">'+maps+'</div></div><div class="tl-box"><div class="tl-box-head">🐉 Monstros-Alvo</div><div class="tl-box-body">'+mobs+'</div></div></div><div class="tl-box"><div class="tl-box-head">✅ Checklist da '+p[1]+'</div><div class="tl-box-body"><div class="tl-checks">'+checks+'</div></div></div><div class="tl-note"></div><div class="tl-footer">'+(i>0?'<button class="tr-btn" data-scroll="'+ph[i-1][0]+'">← '+ph[i-1][1]+'</button>':'<span></span>')+(i<ph.length-1?'<button class="tr-btn active" data-scroll="'+ph[i+1][0]+'">Próxima Fase: '+ph[i+1][2]+' →</button>':'<button class="tr-btn active" data-scroll="timero-leveling-guide-app">Voltar ao topo ↑</button>')+'</div></section>';}
root.className+=' tr-app';var filters='',nav='',blocks='',i;for(i=0;i<cls.length;i++)filters+='<button class="tr-btn'+(i===0?' active':'')+'" data-class="'+cls[i][0]+'">'+cls[i][2]+' '+cls[i][1]+'</button>';for(i=0;i<ph.length;i++){nav+='<button class="tr-btn'+(i===0?' active':'')+'" data-scroll="'+ph[i][0]+'">'+ph[i][1]+' · '+ph[i][2]+'</button>';blocks+=phase(ph[i],i);}root.innerHTML='<div class="tl-root"><div class="tl-inner"><header class="tl-hero"><div class="tr-kicker">// Guia de Progressão</div><h1>Guia de Leveling<br><span>para Iniciantes</span></h1><p class="tr-sub">Do nível 1 ao 99 — rotas otimizadas, mapas ideais por fase, dicas de consumíveis e estratégias para cada etapa da progressão no TimeRO.</p></header><div class="tl-stats"><div class="tl-stat"><strong>5</strong><span>Fases</span></div><div class="tl-stat"><strong>10+</strong><span>Mapas</span></div><div class="tl-stat"><strong>98</strong><span>Níveis</span></div><div class="tl-stat"><strong>Solo</strong><span>Estilo</span></div><div class="tl-stat"><strong>Pre-R</strong><span>Modalidade</span></div></div><div class="tl-panel"><div class="tl-label">Filtrar por classe</div><div class="tl-flex">'+filters+'</div></div><div class="tl-panel"><div class="tl-label">Progressão de Níveis</div><div class="tl-track"><span></span><span></span><span></span><span></span><span></span></div><div class="tl-flex">'+nav+'</div></div>'+blocks+'<div class="tl-related"><div class="tl-panel">🧰<b>Random Options</b></div><div class="tl-panel">🏰<b>Instances</b></div><div class="tl-panel">🔥<b>Fever System</b></div><div class="tl-panel">⏱️<b>MVP Timer</b></div></div></div></div>';var sc=root.querySelectorAll('[data-scroll]');for(i=0;i<sc.length;i++)sc[i].onclick=function(){var t=document.getElementById(this.getAttribute('data-scroll'));if(t)t.scrollIntoView({behavior:'smooth',block:'start'});};var mb=root.querySelectorAll('.tl-mob');for(i=0;i<mb.length;i++)mb[i].onclick=function(){this.className=this.className.indexOf('open')<0?this.className+' open':this.className.replace(' open','');};var ch=root.querySelectorAll('.tl-check');for(i=0;i<ch.length;i++)ch[i].onclick=function(){var on=this.className.indexOf('checked')<0,m=this.querySelector('.tl-mark');this.className=on?this.className+' checked':this.className.replace(' checked','');if(m)m.innerHTML=on?'✓':'';};var cb=root.querySelectorAll('[data-class]');for(i=0;i<cb.length;i++)cb[i].onclick=function(){var v=this.getAttribute('data-class'),j;for(j=0;j<cb.length;j++){cb[j].className='tr-btn'+(cb[j]===this?' active':'');cb[j].style.opacity=(v!=='all'&&cb[j]!==this)?.45:1;}var nt=root.querySelectorAll('.tl-note');for(j=0;j<nt.length;j++){if(v==='all'||!notes[v]){nt[j].style.display='none';nt[j].innerHTML='';}else{var n=notes[v],color='#58d7ff';for(var k=0;k<cls.length;k++)if(cls[k][0]===v)color=cls[k][3];nt[j].style.display='block';nt[j].style.border='1px solid '+rgba(color,.24);nt[j].style.background=rgba(color,.07);nt[j].innerHTML='<strong style="color:'+color+'">'+n[0]+' '+n[1]+'</strong>'+esc(n[2]);}}};}
function boot(){initCards();initLeveling();}
if(document.readyState==='loading')document.addEventListener('DOMContentLoaded',boot);else boot();
if(window.mw&&mw.hook)mw.hook('wikipage.content').add(boot);
})();