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

Aprendendo a superar desafios com Frostpunk

Frostpunk é dos mesmo criadores do também ótimo game This War of Mine - Divulgação
Frostpunk é dos mesmo criadores do também ótimo game This War of Mine Imagem: Divulgação

Colunista do UOL

14/10/2020 08h00

Jogos de estratégia têm um lugar mega especial no meu coração, mesmo que por muito tempo eu nem sequer imaginava que Age of Empires, Café Mania e Civilization, três jogos ao quais dediquei uma boa quantidade de horas, faziam parte de um mesmo gênero com temáticas diferentes. Pra mim, esse tipo de jogo sempre foi "Jogue, se divirta e e raiva".

Não foi diferente com Frostpunk, jogo de estratégia e sobrevivência em que seu objetivo é governar e zelar pelo bem, e às vezes mal, de uma população em meio a gélidos desafios. Mas antes de contar como me diverti em terras congelantes e inóspitas, trate de pegar uma roupa de inverno pesado, vamos precisar.

Frostpunk foi um jogo que ficou por muito tempo na minha geladeira. Não sei se foi por falta de maturidade ou medo de jogar meu tempo fora com mais do mesmo.

No entanto, sinto uma dorzinha no coração por ter ignorado o jogo por tanto tempo.

Pensando bem, esse medo não vem do nada, não é de hoje que me sinto entediada por estar no ciclo dos mesmo jogos, sabendo que muitos utilizam de diversas técnicas para nos deixar viciados e não nos entregam experiências que nos respeitam quanto jogadoras (es).

Indignado com o meu estado de espírito apático com os games, o Marcos Silva, meu sócio na Sue The Real, esposo e player 2, ligou o videogame, me alinhou na frente da TV, pegou um cobertor e me ou o controle dizendo, "Senta aí, você vai gostar!".

Dito e feito!

Oh! Amada madrugada de todos os gamers da face da terra, nada melhor que uma boa jogatina depois de uma épica jornada de trabalho!

Eu ei a noite inteira jogando e não conseguia sobreviver mais que 10 dias de inverno rigoroso. Se é difícil governar a cidade quando ainda é pequena, ao crescer os desafios aumentam exponencialmente.

Os recursos acabavam, eu ficava desesperada e ao mesmo tempo queria ajudar cada integrante que estava ali fazendo a cidade funcionar. O jogo me punia se quisesse ser essencialmente boa e isso nem é um spoiler.

Desde o começo você percebe que o cobertor é pequeno demais para cobrir os pés e a cabeça. Para fazer as coisas funcionarem, você vai precisar tomar decisões difíceis.

Em cada nova jogada, eu assumia uma nova estratégia, as coisas que funcionavam nas jogadas anteriores eu mantia, mas eu sabia que isso não era o suficiente, eu precisava pensar em algo diferente.

Com um mês de jogatina eu poderia falar aqui como evolui a economia da cidade, sobre as expedições que me renderam recursos importantíssimos ou como evitei algumas mortes criando leis, mas não quero fazer desse texto um guia de gameplay, eu realmente quero dividir com vocês o quanto pensar em coisas fora do jogo me fez avançar nele.

Você já estudou sobre educação financeira?

A essa altura você deve estar se perguntando: "o que finanças, números e juros têm a ver com esse game?"

Frostpunk - Divulgação - Divulgação
Imagem: Divulgação

Recentemente tenho acompanhado muito o canal da Nath Finanças e lá tenho refletido muito sobre como as decisões que tomamos na vida financeira impactam de curto, médio e longo prazo.

Eu cresci numa família onde falar de dinheiro não era um tabu e desde pequena aprendi que quando se tem controle do dinheiro e não o contrário, conseguimos ter uma vida melhor.

Nesta parte o jogo se assemelha muito com a vida real.

Em diversos momentos que temos poucos recursos precisamos entender ainda mais como lidar com a escassez, sendo uma alternativa poupar.

Você já deve ter escutado de alguém da sua família dizer: "Desliga essa lâmpada! Está gastando energia!', foi esse tipo de coisa que me fez desligar o gerador durante os dias mais quentes em Frostpunk e isso sem dúvida impactou positivamente as noites de nevasca.

E não para por aí, o jogo traz diversos dilemas morais que valem a pena um texto só para isso.

O Frostizinho, apelido fofo que dei para esse incrível jogo, me ensinou que o frio é um mecanismo de criar conflito e desafios, e em paralelo na vida, muitas vezes só nos preocupamos com alguns assuntos quando se transformam em problemas, mas independente de quão complexa é a situação, precisamos buscar apoio, obter conhecimento e tentar agir de forma diferente.

Talvez com isso o nosso gerador consiga esquentar novamente e quem sabe até conseguimos levar esse calor para outras pessoas.

Pra mim agora, jogos de estratégia são "Jogue, se divirta, e raiva e aprenda". E pra você, qual frase define esse gênero?

Um segredinho aqui, só cheguei até o dia 30 e agora eu coloco estufas em todo lugar para manter os alimentos crus para a população, meu sonho da vida real é ter várias.

Frost Punk - Divulgação - Divulgação
Frostpunk
Imagem: Divulgação

Agora continuo na luta para finalizar o jogo que ganhou o meu coração congelado em -40°C.

BÔNUS

A mente genial aqui, comentou com o Marcos Silva: "Nossa, eu amei demais esse jogo queria muito falar com os desenvolvedores".

Como uma gentileza que não cabe no mundo, o Marcos responde: "Oxi! Você lembra que assistiu presencialmente a palestra com um dos desenvolvedores falando sobre o desenvolvimento?"

#EuFui, mas não me lembro!

Se quiser assistir a palestra, está aqui esse marco incrível na minha memória: