;(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

Preview: Battletoads é diversão entre amigos em clima de desenho animado

Battletoads ressuscita o clássico de Nintendinho dos anos 90 - Divulgação
Battletoads ressuscita o clássico de Nintendinho dos anos 90 Imagem: Divulgação

Makson Lima

Colaboração para o START

13/10/2019 10h00

A expectativa por um novo "Battletoads" vem de décadas. O clássico de 91 segue como algo sagrado na mente de quem teve a oportunidade de experimentá-lo lá atrás. Um dos mais brutais do NES, um console repleto de jogos com dificuldades traumatizantes, mas também lembrado pela diversidade surpreendente no gameplay. Muito mais que um jogo de porradaria, o petardo da Rare revolucionava fase a fase, de sequências de plataforma no gelo a rapel em cavernas, motos voadoras e tudo mais.

Aí a Microsoft, depois de muita espera e alarde, finalmente ressuscitou a franquia. E a primeira impressão não foi das mais positivas: me pareceu um indie qualquer, remetendo a tantos desenhos animados atuais e do ado, além da pancadaria bem simples. "Castle Crashers" já havia feito o grande favor de trazer todo um gênero de volta há alguns anos. Queria tirar essa ideia da cabeça, e foi o que aconteceu ao jogar "Battletoads" (PC, Xbox One) na BGS 2019.

Joguei com outras duas pessoas que nunca tinha visto na vida e foi divertido, para ser o mais direto possível. Preferiria outro personagem a Pimple, o sapão amarronzado, ainda mais brucutu que os Rash e Zitz, mas não foi preciso tanta adaptação assim. O que chamou minha atenção, logo nos primeiros minutos, é como o jogo se esforça em ser engraçado. E até que funciona, num esquema mais "As Tartarugas Ninja" do que conseguia me lembrar. O traço é aquele de desenho animado da metade dos anos 1990. E ficou clara a intenção dos produtores, abraçando de vez a ideia.

Porradaria diversificada rende pontuação maior, com direito a avaliação conforme as hordas de inimigos surgem

Na primeira fase, um beat'em up bem básico. Misturar botões no combo resulta em transformações inusitadas do personagem, como foi no clássico da Rare. Pimple vai de um mandril que arremessa as ratazanas inimigas pelos ares, a projetar espinhos de suas costas. Cada sapo antropomórfico tem suas próprias metamorfoses, e são bem divertidas e bizarras. O jogo pode até parecer lento: colocar duas vezes para frente não faz o boneco correr, mas o botão de "dash", acionado à vontade, torna as coisas mais ágeis. Segurar o LT faz o personagem preparar a língua, aí você pode puxar inimigos até você, ou se projetar até eles.

Battletoads pele - Divulgação - Divulgação
Zitz, Pimple e Rash depois da troca de pele
Imagem: Divulgação

Porradaria diversificada rende pontuação maior, com direito a avaliação conforme as hordas de inimigos surgem. Não tenho ideia se isso vai ter algum tipo de impacto maior no jogo em si, tipo para aquisição de novas habilidades ou algo assim, ou se será só para descobrir qual dos sapos é o rei do sopapo.

Depois de derrubar o chefão, um porco rosado bem nos moldes de Bebop (me marcou sua mensagem de pós-vida: "não há nada aqui, então aproveitem cada dia ao máximo", assim como o que surgiu antes da próxima fase, algo tipo "esse estágio não acaba aqui, deve ser uma coisa de BGS"), foi hora de montar nas motocas flutuantes. A dificuldade subiu drasticamente e, numa perspectiva Out-Run demais, total oposta ao 2D sempre para direita do clássico, o objetivo era simples: desviar de todos os obstáculos até o fim da fase, com checkpoints até que generosos.

Battletoads mutações - Divulgação - Divulgação
Não liga, não, os sapos são realmente exagerados
Imagem: Divulgação

Os três sapos têm tamanhos diferentes, mas talvez o hit-box (a área de contato de cada um com outros elementos do jogo) seja o mesmo. Os ombros largos de Pimple, vez ou outra, transavam as sucatas no meio da pista. E o negócio é "one hit kill", com direito a "respawn" caso os sobreviventes aguentem um tempinho a mais. Não saberia dizer se é mais fácil ou não jogar sozinho, mas espero que o jogo final trabalhe com diferentes tipos de gameplay. Aí, sim, seria uma forma bem honesta de representar um dos maiores clássicos da Rare e do Nintendinho.

Me pareceu um jogo despretensioso e divertido, aquele tipo de diversão regada a muita pizza e palavrão

Pelo que joguei na BGS 2019, o novo "Battletoads", que continua sem data de lançamento definida, me pareceu um jogo despretensioso e divertido, aquele tipo de diversão regada a muita pizza e palavrão. Talvez tenhamos aqui alguma espécie de termômetro de popularidade e interesse em seus personagens, para então resultar em algo maior.

Battletoads motos - Divulgação - Divulgação
As motos voadoras traumatizaram muita gente no clássico do Nintendinho
Imagem: Divulgação

START na BGS 2019

Confira os pro-players e streamers que estarão no estande do START:

Brasil Game Show 2019

Quando: 10 a 13 de outubro (dia 9 exclusivo para imprensa)
Onde: Expo Center Norte - Rua José Bernardo Pinto, 333 - Vila Guilherme, São Paulo - SP
Ingressos: opções de pacotes disponíveis no site oficial

SIGA O START NAS REDES SOCIAIS

Twitter: https://twitter.com/start_uol
Instagram: https://www.instagram.com/start_uol/
Facebook: https://www.facebook.com/startuol/
TikTok: http://vm.tiktok.com/Rqwe2g/
Twitch: https://www.twitch.tv/start_uol