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

Bisavó de John Romero, criador de DOOM, será chefe do crime em novo game

Elvira Duarte foi bisavó de John Romero e agora está em Empire of Sin  - Reprodução
Elvira Duarte foi bisavó de John Romero e agora está em Empire of Sin Imagem: Reprodução

Do START

11/05/2020 13h21

Elvira Duarte foi uma dona de bordés mexicanos no início do século 20 e, agora, também uma personagem no próximo videogame do bisneto, John Romero, conhecido também como um dos criadores de DOOM. Será que ele pediu bênção da bisa?

Empire of Sin é um jogo de estratégia por turnos que está sendo feito por Brenda Romero e o marido John. O game é ambientado em Chicago, nos EUA, nos tempos da Lei Seca da década de 1920, e Elvira Duarte será uma das chefes do crime por lá.

Em um vídeo publicado em comemoração ao dia das mães, Brenda e o marido explicam como surgiu a ideia de colocar a anteada de Romero no game, que realmente foi uma chefe de máfia na cidade de Nogales, no México.

Ambos apresentaram pela primeira vez a personagem. O curioso é que, apesar de ter o nome da bisa, o visual foi baseado na avó de Romero, Socorro Duarte. No game, a personagem está na casa dos 70 anos.

Além disso, o vídeo mostra a habilidade da bisa no combate do game. Chamado de Devil's Breath, o poder faz com que inimigos sejam controlados pelo jogador por três turnos, e depois morrem.

Em entrevista ao START na BGS 2019, John Romero disse que Empire of Sin é um dos melhores jogos que já fez e representa um ponto alto na carreira dele. Apesar de estar bastante envolvido no projeto, ele foi bem claro ao dizer que o game é criação total da esposa Brenda, algo que ela vem pensando há vinte anos.

Estamos trabalhando nele (Empire of Sin) há dois anos e meio e é um ponto realmente alto na minha vida agora, pelo lado criativo
John Romero

John Romero - Mariana Pekin/UOL - Mariana Pekin/UOL
John Romero esteve na Brasil Game Show 2019
Imagem: Mariana Pekin/UOL

Empire of Sin será lançado ainda em 2020 para PS4, Xbox One, Nintendo Switch, PC e Mac. Com ou sem a bênção da bisa.

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