;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

GGWP

REPORTAGEM

Texto que relata acontecimentos, baseado em fatos e dados observados ou verificados diretamente pelo jornalista ou obtidos pelo o a fontes jornalísticas reconhecidas e confiáveis.

Campeão em 2 modalidades diferentes, Sacy é lenda viva do Esport brasileiro

Gustavo Rossi foi campeão brasileiro de LoL em 2017 e venceu o mundial de Valorant em 2022 - Colin Young-Wolff / Riot Games
Gustavo Rossi foi campeão brasileiro de LoL em 2017 e venceu o mundial de Valorant em 2022 Imagem: Colin Young-Wolff / Riot Games

Colunista do UOL

22/09/2022 04h00

Parece clichê dizer que algumas pessoas nascem com o dom para determinadas coisas. Por favor, não se trata aqui de diminuir o trabalho duro ou o esforço constante em busca de um objetivo, mas certos talentos parecem estar intrínsecos a algumas grandes figuras de quaisquer áreas da vida, especialmente do esporte. No ambiente eletrônico, um certo brasileiro, que atende pelo nome de Gustavo Rossi, fez história no último domingo (18) - e é o mote central deste texto.

Gustavo, mais conhecido como Sacy, foi campeão brasileiro de League of Legends em 2017. Venceu a final do CBLOL em Recife, defendendo a RED Canids Kalunga, ocupando o lugar de ninguém menos que Felipe "brTT", dono de seis troféus da competição, em partidas decisivas daquele Split. E, no fim de semana ado, foi nada menos que campeão mundial de VALORANT. Pois é. Dois jogos diferentes. Nível competitivo.

Se você ainda não se situou nesta história, pausemos aqui. League of Legends é um MOBA (Multiplayer Online Battle Arena). VALORANT é um FPS (First Person Shooter). São jogos totalmente diferentes. Da mesma forma que a única semelhança entre futebol e basquete é se usar uma bola para a prática, LoL e VAL compartilham linearmente o uso do teclado e do mouse. É inimaginável alguém disputando torneios do mais alto nível em ambos os jogos.

Obviamente, sob uma análise leiga, viria o velho chavão: "Ah, é tudo videogame...". Pois é, a bem longe disso. São esferas completamente diferentes, que demandam reflexos, atitudes e preparações totalmente distintas. O que Sacy fez é histórico - e entra para a história dos Esports a nível mundial. Talvez a ficha demore pra cair, tanto pra ele, quanto pra nós mesmos. Mas é gigantesco.

Sacy topou o desafio de sair de um cenário no qual, embora tenha sido campeão naquele ano, pudesse continuar como mero coadjuvante - mais um em meio a tantos - para começar do zero. E foi o cara e a cara do VALORANT brasileiro desde o início. Ao lado do argentino Saadhak, construiu uma trajetória digna de aplausos. Bateu de frente até colocar o Brasil no lugar mais alto do planeta com a LOUD.

O título do Champions reforça ainda mais o quanto somos monstruosos nos FPS. Campeões mundiais de Counter-Strike, Point Blank, Crossfire, Rainbow Six Siege... E agora VALORANT. Não é mera coincidência. Temos um talento e tanto no gênero, e isso não pode ser deixado de lado. Que o digam Aspas e Less, companheiros de equipes de Sacy, com apenas 19 e 17 (!!!) anos de idade - e já campeões mundiais.

Que Sacy seja inspiração para tantos outros garotos e garotas brasileiros acreditarem que é possível vencer no esporte eletrônico e que o respaldo que vem da nossa torcida é um estímulo e tanto para trilhar esse caminho. Somos fortes, somos muitos, e exemplos não nos faltam. Somos o país do FPS.