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

Heal: um velhinho que resolve quebra-cabeças não quer pandemia com ninguém

Em Heal, quabra-cabeças e mistérios são resolvidos por um senhor de idade - Divulgação
Em Heal, quabra-cabeças e mistérios são resolvidos por um senhor de idade Imagem: Divulgação

Makson Lima

Colaboração para o START

14/05/2020 04h00

Quarentena. Pandemia. Isolamento Social. São tempos malucos em que precisamos de algo para nos segurar. Para muitos de nós, videogames são eternas ferramentas de escapismo. Para os mais velhos, essa distração estão em mídias mais analógicas. É a palavra cruzada que o vô e a vó tanto gostam.

O game independente Heal meio que junta esses dois mundos, ao falar sobre um idoso resolvendo quebra-cabeças dos mais bizarros, o que pode ser algo estranhamente revigorante nesses tempos tão doidos.

ando o tempo

Quando a frustração se torna aprendizado, o incentivo para continuar tentando é parte integral. Heal não é nenhum The Witness ou Myst quanto à complexidade de seus puzzles, e conquista justamente por sua simplicidade, em como ela está associada à evolução do jogador, do lugar onde estamos agora até a próxima resolução.

E não só nossa, de quem joga, mas também do senhorzinho que nos representa ali dentro, naquela realidade escapista e que pode ser tão assustadora quanto a incerteza que há por trás de uma porta recém-aberta.

Heal game quebra-cabeça - Divulgação - Divulgação
Game possui um clima e estrutura parecida com jogo como The Room
Imagem: Divulgação

Heal foi desenvolvido pelo finlandês Jesse Makkonen. Ele diz, em entrevista ao START, que não chegou a pensar muito na hora de escolher alguém da terceira idade como protagonista: "Eu apenas senti que queria fazer um jogo sobre o tema. Suponho que são todas as coisas que me afetam na vida real, não há uma 'inspiração' para isso", conta.

Quebra-cabeças e mistérios

O Senhorzinho, querendo ou não, faz parte do charme do game, assim como um clima macabro que permeia a coisa toda. Parte disso vem do histórico de Makkonen com jogos de terror: Silent of the Sleep e Distraint estão entre suas obras anteriores.

"Heal não é um jogo de terror, mas eu concordo, há uma certa atmosfera sombria ali", comenta o desenvolvedor.

Muito desse clima se apresenta principalmente nas primeiras fases, em que os quebra-cabeças envolvem armários trancados, relógios e rádios antigos. Todos são objetos em um apartamento vazio. Só você, o velhinho e uma trilha de filme de mistério ao fundo.

Heal quebra-cabeça - Divulgação - Divulgação
Um dos quebra-cabeças do game
Imagem: Divulgação

Makkonen conta que Heal, no final das contas, acabou sendo um jogo mais experimental e que ele nem sabia se daria certo até os últimos momentos do desenvolvimento, o que rendeu algumas dores de cabeça a ele. E esse contraste de proposta abstrata e vida real parece exercer uma influência invisível em Heal.

"Foi (uma experiência) diferente e tomou muito de meu tempo criar todos aqueles quebra-cabeças, mas, vez ou outra, foi bem divertido também!"

É um jogo silencioso, e consegui capturar a atmosfera e história da forma com gostaria
Jesse Makkonen

"Eu não jogo quebra-cabeças"

Jesse Makkonen criador do jogo Heal - Divulgação - Divulgação
Jesse Makkonen
Imagem: Divulgação
Pelo resultado, foi surpreendente descobrir que o criador de Heal não é lá tão fã assim de puzzles. Pelo menos ele ite que gosta de bons quebra-cabeças presentes em jogos como Zelda.

"Não tenho uma inspiração clara, mas eu diria que os quebra-cabeças em Heal são semelhantes aos clássicos dos jogos de terror de sobrevivência", revela Makkonen.

Heal está disponível para PC (via Steam) e Mobile (Android e iOS) e com esse jogo experimental já no ado, o desenvolvedor agora prepara seu maior game até o momento:

"Ainda é cedo e as coisas podem mudar, mas no estado atual do projeto, acontece no espaço, você joga como robô, haverá uma história principal e missões secundárias, então vai seguir uma linha semi-sandbox".

Apesar do projeto ambicioso, cito outro game sendo feito por ele, The Human Galley, um jogo de terror psicológico, anunciado há anos, em que controlaríamos um serial killer. Ainda assim, ficamos no aguardo de seu próximo game.

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