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

OPINIÃO

The Division 2: Doguinho da expansão é o único motivo para salvar Nova York

O mascote de Warlords of New York rouba a cena na expansão - Reprodução
O mascote de Warlords of New York rouba a cena na expansão
Imagem: Reprodução

Bruno Izidro

Do START, em São Paulo

17/03/2020 04h00

Às vezes, jogamos algo para imergirmos em histórias fascinantes e nos apaixonarmos por personagens, seja um Disco Elysium ou Kentucky Route Zero. Até então, jogar The Division 2 não envolvia nenhuma dessas características. O que o game tem de bom são as mecânicas de tiro e ambientação em cidades destruídas.

Só que algo mudou com a chegada de Warlords of New York, a nova expansão do game. O regresso para uma Nova York ainda mais destruída não dava dicas de que eu me importaria tanto por um canino, ao ponto de ele ar a ser a grande motivação para salvar a cidade.

Can You Pet the Dog?

Quem está por aí nas redes sociais pode ter deparado com a conta "Can You Pet the Dog" pela timeline, que tem a nobre função que catalogar todos os games em que é possível fazer carinho em cachorros e outros animais.

Desde então, esse simples detalhe ou a ganhar importância tremenda para muitos jogadores, eu incluso. Essa foi, inclusive, uma das decepções com The Division 2, já que o mundo aberto do jogo é povoado aqui e ali por alguns cachorros perdidos em meio ao caos, só que não é possível nenhum tipo de interação com eles.

Agora, Warlords of New York chegou com o intuito de ser o novo ponto de partida para o segundo ano do jogo, com um novo mapa, atividades, armas e com conteúdos adicionais chegando de temos em tempos para justificar o modelo de "jogo como serviço" em The Division 2.

Tudo isso, na real, era fachada.

Vida de Cão

A real intenção foi finalmente apresentar esse filhote de pastor de alemão, que balança o rabinho toda vez que o jogador aparece e que, finalmente, pode receber o carinho merecido.

O Dog não tem nome, mas conquista qualquer um logo de cara e é uma das primeiras coisas que conhecemos em Haven, a nova base de operações dos jogadores em Nova York. Os desenvolvedores da Massive Entertainment ainda tiveram o cuidado de criar animações variadas para cada interação com o pet: às vezes ele rola no chão, em outras ele dá a patinha ou pula pra chamar a atenção.

O que torna esse cachorrinho ainda mais especial é que só é possível interagir com ele em todo o jogo. Nova York está um mato, mas com cachorros, que continuam habitando as ruas abandonadas da cidade. Porém, assim como no jogo base, eles fogem ao se depararem com o jogador.

O máximo que acontece é um encontro aleatório, em que é possível testemunhar um dos sobreviventes tentando fazer amizade com um dos cachorros de rua. Só que o jogador mesmo não pode fazer nada com o dog depois.

Até mesmo em um dos esconderijos do game, que serve de abrigo de animais, com gatos, cachorros e coelhos, não é possível interagir com eles. O privilégio fica todo para o filhote de pastor alemão.

Jogar pra comprar a ração dele

The Division Dog - Reprodução - Reprodução
O modo foto do game nunca foi tão usado para tirar dezenas de imagens do doguinho
Imagem: Reprodução

O maior impacto na adição do dog de Haven é que ele deu uma motivação para além de só jogar The Division 2 por sua jogabilidade. Até porque, vamos ser sinceros, toda a narrativa e personagens humanos no jogo nunca foram o ponto forte.

Eles existem mais como uma desculpa para ter algo em que atirar numa metrópole em ruínas, falando no comunicador durante as missões, sem você saber quais dos dois ou três personagens principais que está falando no momento.

A cada nova missão cumprida, eu retornava a Haven só para saber como o estava o doguinho. Agora era por ele que meu agente saia às ruas para tentar salvar Nova York, completando atividades que já tinha enjoado no game base, mas que dariam melhores equipamentos e, assim deixaria aquela bola de pelos virtuais segura.

*A cópia do jogo, na versão de Xbox One, foi cedida pela Ubisoft Brasil.

Os Pets de The Division 2

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

** Este texto não reflete, necessariamente, a opinião do UOL