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

10 situações que todo jogador de "Dark Souls" já encarou

Não há expressão que defina melhor "Dark Souls" do que "o bagulho é louco" - Divulgação
Não há expressão que defina melhor "Dark Souls" do que "o bagulho é louco" Imagem: Divulgação

Rodrigo Lara

Colaboração para o START, em São Paulo

18/06/2019 08h00

Difícil, injusto, impossível... A lista de adjetivos para os games da série "Dark Souls" (incluindo também "Bloodborne") é extensa, e a maioria faz questão de lembrar que o jogo não perdoa os erros do jogador. Sem meias palavras: não dá pra vacilar.

Você pode gostar do desafio ou se desesperar na maioria das vezes, mas sempre vai lembrar de momentos marcantes em algum jogo da série. Podem ser momentos engraçados, ou então... bem, quem nunca arremessou um controle na parede, não é mesmo?

Crise de identidade

Bloodbourne Temer - Reprodução - Reprodução
Imagem: Reprodução

Sempre que você começa um "Souls", precisa tomar uma decisão que vai afetar TODO o seu gameplay (ou, ao menos, boa parte dele): definir a classe inicial do seu personagem. Para piorar, há poucas informações sobre cada uma delas - como você vai adivinhar que jogar como ladrão é uma treta sem tamanho? O resultado disso é que provavelmente você vai ar muito tempo sem conseguir chegar a uma decisão certeira. E depois vai se arrepender, é claro.

O primeiro boss

via GIPHY

Se tem algo que une o primeiro e o último jogos da série "Dark Souls" é a presença de um chefão quando o jogador ainda está se aquecendo. Enquanto no primeiro game temos o Asylum Demon, no último a missão de dar boas vindas ao jogador fica a cargo de Iudex Gundyr.

Eles não são exatamente difíceis - é certeza que você vai ar muito mais raiva com outros chefões dos jogos -, mas a mistura entre choque, receio de ter o traseiro chutado e não fazer ideia dos movimentos do inimigo geralmente resulta em um (ou mais) encontro com a tela de game over.

Traído pelas costas

Você está lá, confiante e todo pimpão, já despachou alguns inimigos e está explorando um cenário novo que parece tranquilo. Até, claro, um maldito inimigo aparecer do nada e te acertar em cheio. Os jogos da série "Dark Souls" são adeptos desse tipo de armadilha, e você vai acabar trombando com inimigos escondidos em esquinas, atrás de barris, de árvores. Temos certeza de que a equipe liderada por Hidetaka Miyazaki é composta de sádicos que adoram pegar o jogador desprevenido.

Olha, um inimigo gigante!

via GIPHY

"O que acontece se eu atacar aquele dragão enorme?". Eu duvido que você não tenha pensado isso no primeiro "Dark Souls". E, claro, nossa curiosidade de jogador acaba falando mais alto, e lá vamos nós cutucar o bicho com vara curta. Não é preciso dizer que a chance de virarmos pó é bem grande nesses casos.

Os games da série sempre apresentam inimigos opcionais que, geralmente, são muito mais fortes que o jogador quando eles são encontrados pela primeira vez. Sabe aquele cavaleiro armado até os dentes que fica quieto no canto dele? Pois é...

Pra onde eu vou?

Ficar perdido em jogos da série "Dark Souls" é algo comum, até mesmo pela concepção de mundo com áreas interconectadas. Então, invariavelmente, chega aquele momento que você não sabe para onde ir, acaba entrando em uma área que você só deveria explorar mais tarde, e aí não tem jeito: é morte na certa.

Cuidado onde pisa

Essa é clássica: você está enfrentando um punhado de inimigos, esquece de prestar atenção no cenário e quando se dá conta, tchauzinho: você caiu em um buraco. Quedas costumam ser letais em games da franquia "Dark Souls" e, acredite: não faltarão oportunidades para você encontrar seu fim desta forma.

Você matou quem não devia

via GIPHY

A série "Dark Souls" coloca os movimentos de ataque nos botões de ombro dos controles. E isso pode causar alguns problemas. Imagine só: você chega perto de um personagem que não é seu inimigo, resolve apoiar o controle na perna e quando vê, acabou atacando a pessoa sem perceber. Matar personagens pode ter consequências péssimas, como ficar sem o a determinados itens ou, ainda, mudar completamente a história do jogo - normalmente, para pior.

Tão perto, tão longe

Morrer é uma constante nos games da franquia e, quando isso ocorre, as almas coletadas ficam acumuladas em uma poça de sangue. Naturalmente, a primeira coisa que você vai querer fazer é correr até ela e resgatar o que você perdeu. Mas quantas vezes não estamos fazendo isso e acabamos morrendo pouco antes de alcançar nosso objetivo, não é mesmo? É caso de jogar o controle longe.

Preciso de amigos!

Você tentou matar o mesmo boss uma, duas, três, vinte vezes e nada. A solução? Tentar de novo e se esforçar mais, aumentar seu nível ou melhorar seus itens? Nada disso: é hora de chamar a cavalaria. Se você joga o game com o modo online ativado, é quase certeza que você encontrará uma série de mensagens no chão na entrada das áreas de boss. Invocar outros jogadores - ou, por que não, ser invocado - é algo tradicional na série, e uma ajuda e tanto para quem não é tão habilidoso assim.

Ah, as invasões?

via GIPHY

Da mesma forma que é possível chamar pessoas para te ajudar, há a chance de a sua partida ser invadida por outros jogadores. São aqueles temidos fantasmas vermelhos que aparecem logo que a mensagem "o seu mundo está sendo invadido" surge na tela. Nessa hora, é bom se preparar: em geral, jogadores que invadem o mundo alheio não são exatamente inexperientes e, se você não estiver acostumado com o modo PvP do jogo, as chances de morrer são enormes.