Mostrando postagens com marcador Destaques. Mostrar todas as postagens
Mostrando postagens com marcador Destaques. Mostrar todas as postagens

19/08/2020

Oniken Unstoppable Edition: Revisitando o clássico indie brasileiro

Em 2012, ainda adolescente, escrevi uma análise sobre o jogo Oniken. Lembro que estava estudando programação e minha habilidade como gamer também não era grande coisa, por isso passei 2 semanas jogando religiosamente até zerá-lo. E foi uma das experiências mais brilhantes e gratificantes que tive com um videogame inspirado em jogos antigos. Desenvolvido pelo talentoso time brasileiro da JoyMasher, convido todos os leitores a revisitarem o clássico jogo independente que abriu uma porta importante para muitos outros indies ousarem de inúmeras outras maneiras.


Na infância, me diverti com boa parte dos grandes jogos do Nintendo Entertainment System (apelidado como Nintendinho ou NES ). Tínhamos jogos geniais que burlavam as limitações técnicas do console tanto na parte gráfica quanto na parte sonora, além da dificuldade considerada alta (para justificar o investimento financeiro dos nossos pais) e as caprichadíssimas cenas animadas que contribuíam para manter o jogador imerso naquele grande desafio que poderia se estender por dias, semanas ou meses.

Graças ao esforço dos brasileiros Danilo Dias, Thais Weiller, Marco Galvão (todos meus amigos) e ainda alguns outros nomes que não tive a chance de conhecer, temos aqui Oniken, um jogo 2D de plataforma que resgata toda a experiência encontrada nos melhores jogos do NES. Em um período anterior ao carnaval de indies retrôs que temos à disposição para jogar, Oniken era pioneiro e ousado. Recentemente tive a chance de jogá-lo em meu Xbox One (também disponível para PlayStation 4 e Nintendo Switch), e confesso que eu já sonhava faz muito anos com o lançamento dele em plataformas atuais. E já adianto: foi maravilhoso insistir e morrer até voltar a pegar o jeito do game.

O game pode ser jogado em diferentes línguas e a versão brasileira possui todas as expressões de dublagem que marcaram os filmes do passado. 
Outra das inúmeras cenas animadas entre as fases. Como é bom recordar o passado sentindo uma experiência completamente nova!
Oniken se destaca por trazer várias fórmulas antigas que poderiam ser consideradas genéricas e apresentá-las ao jogador como algo novo e interessante. A sua história acontece num futuro pós-apocalíptico típico de filmes como Mad Max. Um grupo de rebeldes se esforça para deter uma poderosa organização militar que recebe o nome do game, mas seus esforços mostram-se inúteis devido ao grande poder bélico e toda a superioridade tecnológica da mesma. E é nesse instante que surge Zaku, o personagem controlado pelo jogador (muito parecido com o próprio criador do jogo, Danilo Dias), um poderoso mercenário BADASS considerado como uma “lenda viva”, “o implacável”, uma mistura de Kenshiro (de Hokuto no Ken) com John Rambo, que carrega uma espada e fatia seus inimigos como se fossem tomates.

Se a abertura não fosse assim eu nem teria jogado o game!
O miniboss da 2° fase, Geist (uma referência ao anime de mesmo nome) é muito bem animado e oferece uma batalha memorável.
Todo o enredo de Oniken é apresentado com excelentes cutscenes que não poderiam ser executadas em um Nintendinho sem a ajuda de um Chip extra embutido ou algo semelhante. Algumas chegam a lembrar animações de jogos em CD do obscuro e adorável TurboGrafx-16 (vulgo PC Engine) de tão fluídas e bem animadas que são, mesmo sem a presença de vozes. A direção de arte é excelente, e a edição Unstoppable conta com melhorias visuais e sonoras que aperfeiçoam a experiência como um todo. Esperem desfrutar de efeitos de parallax e muitos sprites e cenários caprichados.

A jogabilidade é marcada  pela ação em plataforma vista em jogos como Ninja Gaiden e Vice - Project Doom, onde o jogador deve combinar saltos ágeis com ataques certeiros, além de “memorizar” o posicionamento e o padrão de movimentação dos inimigos para passar as fases. Algumas etapas devem ser desbravadas com auxílio de um Jet-ski, o que transforma o jogo momentaneamente em uma espécie de shooter em 8-bits com a movimentação fixa da tela. Já os chefes são numerosos (cerca de dois mini-bosses por estágio além do boss final) e muito bem desenhados e detalhados, principalmente os maiores, ocupando grande parte da tela como pode ser comprovado nos melhores títulos produzidos para o NES.

Cutscene de Oniken, super caprichada e animada. Não sei se foi proposital, mas me fez lembrar na hora..
... do jogo Vice - Project Doom para Nintendinho.
A Trilha Sonora é um verdadeiro espetáculo nostálgico. O jogo chegou até a ganhar o prêmio do Game Music Brasil na categoria de Melhor Game Indie onde foram avaliados todos os seus aspectos, destacando-se a parte gráfica, técnica e sonora do game. Oniken possui composições memoráveis, como Brain Palace e The Core que acompanham suas desafiadoras etapas finais. Aliás, melhor eu explanar logo sobre a dificuldade de Oniken antes que eu me esqueça.

O jogo é difícil como qualquer grande jogo de 8-bits deveria ser, embora os desafios se intensifiquem progressivamente ao longo de cada fase, e de forma muito inteligente e equilibrada. O Level Design de Oniken estimula a inteligência do jogador, fazendo-o encontrar a melhor solução com um pouco de insistência, nada absurdo como o primeiro Ninja Gaiden e muito menos como o sádico Battletoads, mas que pode causar estranhamento aos jogadores mais impacientes, desacostumados com jogos mais antigos de plataforma. Ainda assim, a experiência de insistir após fracassar se mostrou extremamente divertida mesmo em 2020.

Essa etapa desafiadora em que é preciso desviar de um raio me lembrou do game 'Mighty Morphin Power Rangers: The Movie' para Super Nintendo!
Os bosses do game são enormes e muito caprichados. A batalha final é difícil e me fez refazer o última estágio pelo menos 3 vezes!
Vale lembrar que as missões são liberadas à medida que as fases vão sendo vencidas, e ficam então disponíveis para serem jogadas a qualquer momento, o que permite desbravar todas elas sem a necessidade de se jogar o game inteiro novamente. É um recurso muito bem-vindo para pessoas com pouco tempo disponível ou para refazer determinadas fases e obter pontuações maiores, enviando-as para um ranking on-line. Existem ainda DLCs gratuitas que são liberadas após terminá-lo, como o modo Boss Rush (batalhas com todos os chefes sem interrupções), o Hardcore Mode (com várias características que dificultam as nossas vidas) e ainda uma missão extra, onde o jogador controla Jenny, uma personagem feminina de madeixas curtas (lembra muito a Thais Weiller) que usa uma metralhadora, o que acrescenta um grande leque de possibilidades, aproximando a jogabilidade de Oniken a de um grande clássico da Konami: o popular Contra! Será que veio daí a inspiração para fazer o espetacular Blazing Chrome?

A missão 7 é divertidíssima e apesar de ser uma DLC, é 100% gratuita!
O trunfo de Oniken definitivamente não é a inovação, mas sim a proposta de trazer todas as características que amávamos nos jogos da grande era 8-bits, melhorando-as de forma que seria impossível fazer na época, seja por limitações de hardware, por desconhecimento, ou por limitações de concepção daqueles tempos. Ele nos faz lembrar da importância da diversão em tempos em que o mercado de games parece só se importar com gráficos e enredos mirabolantes.

Está aí um belo jogo!
E é isso aí. #FiqueEmCasa

13/02/2020

O flickering charmoso do Street Fighter Alpha 2 para SNES

... Já perceberam que eu sou péssimo para dar títulos às postagens? ^_^


O flickering (algo como "tremedeira" em inglês) é uma técnica bastante usada em videogames antigos para criar a impressão de estar de exibindo mais elementos na tela do que o seus limites suportam. Em outras palavras, o hardware permite um número limitado de componentes na tela, e os programadores fazem com que alguns deles desapareçam por frações de segundo e façam com que outros sejam exibidos no mesmo instante, e depois trocam as suas posições, concatenando a exibição dos itens para criar uma ilusão de que todos estão sendo exibidos simultaneamente. Um dos exemplos mais famosos e antigos é o do jogo Adventure para Atari 2600, que permitia uma quantidade ínfima elementos ao mesmo tempo, mas nós imaginávamos muito mais:


Parece pouco, mas a técnica foi sendo aprimorada e logo recebemos jogos em que o flickering foi aplicado até mesmo em partes de sprites de inimigos e tiles dos cenários. Os exemplos são muitos e estão por quase todos os jogos da terceira geração de videogames (também chamada de "Era do processamento em 8-bits"), como Mega Man e Teenage Mutant Ninja Turtles - Arcade Game:

O NES te ajuda contra os ninjas: decepou o pé de um e desmembrou as pernas do outro!
O uso de flickering no Nintendo Entertainment System (também conhecido como NES ou "Nintendinho") surgiu por limitações de memória de sua PPU (Picture Processing Unit). Segundo o wiki Nesdev, a Unidade de Processamento de Imagem desenha 64 sprites por frame e 8 sprites por linha horizontal (as famosas scanlines). Sua memória para sprites (chamada de OAM - Object Attribute Memory) armazena-os em uma área de 256 bytes. Porém, existe uma OAM secundária com 32 bytes que guarda os sprites para scanline atual e a próxima. Se houver mais de 8 sprites por scanline, apenas os 8 primeiros serão exibidos. Para driblar isso, os desenvolvedores faziam com que os sprites excedentes alternassem cada um dos seus frames, o que causa o efeito de flickering registrado na screenshot acima e evita que eles não sejam exibidos em nenhum momento na tela.

Entretanto, o intuito da postagem é destacar o uso de flickering em um jogo de videogame lançado já em Novembro de 1996, época em que o PlayStation, Sega Saturn e Nintendo 64 já estavam no "pedaço". Como o título e a imagem em destaque já estão dedurando, Street Fighter Alpha 2 foi convertido com maestria para o Super Nintendo, apresentando uma qualidade bastante fiel à versão para fliperamas, mesmo com as diferenças notáveis de hardware. E para compreender todo o processo de desenvolvimento até o seu resultado, detalharemos as práticas utilizadas pela Capcom.

Todos os códigos funcionam também nessa versão, e os finais dos personagens refletem as mudanças!
A primeira solução foi o uso do chip S-DD1 (usado também em Star Ocean), que realiza a descompressão de sprites compactados em um total de 32 megabit (e não megabytes) através do "Algoritmo ABS Lossless Entropy" (codificação aritmética desenvolvida pela Ricoh). Os responsáveis pelo entendimento de como o chip funciona são os "cabeças" do emulador Snes9X, que inclusive consideraram desistir de entendê-lo e utilizar pacotes gráficos para simular o seu comportamento. O chip descompacta os sprites dinamicamente e os fornece diretamente para a PPU, e depois faz a mediação entre o microprocessador Ricoh 5A22 (também da Ricoh) e a memória ROM (somente de leitura, ou seja, com dados gravados de forma permanente) por dois barramentos. Com isso, o Ricoh 5A22 ainda pode solicitar sprites sem compactação mesmo que o chip S-DD1 já esteja ocupado com a descompressão, tudo ao mesmo tempo. Joia, não acham?

O problema é que há um efeito colateral: o jogo apresenta breves momentos de congelamento, principalmente entre a narração do round e o início da luta, devido a todo o processo envolvendo a descompressão de sprites para cada um dos rounds. Embora seja bastante evidente, não chega atrapalhar a experiência, e ainda é muito mais rápido (aproximadamente 3 segundos) do que o tempo de loading (carregamento de dados) de outras versões do jogo.

Entre o "Fight!" e a luta, o jogador precisa aguardar 3 segundos. Repare que as sombras sumiram durante a descompressão de sprites!
A Capcom também adaptou todo o visual ao console de 16 bits da Nintendo. Para tanto, os sprites foram redesenhados em proporção 8:3 (para serem esticados em 4:3) e suas animações foram simplificadas com menos quadros, visando tirar melhor proveito da resolução e das capacidades reduzidas do videogame. O resultado é muito superior ao alcançado nas conversões de Street Fighter 2 para o Super Nintendo, contando dessa vez com sprites maiores e mais detalhados:

As lâmpadas do caminhão foram redesenhadas para criar uma animação chamativa, mesmo com frames a menos!
Os cenários também foram refeitos, sempre tentando se assemelhar (e de forma impressionante) com suas versões originais: são muitas cores, elementos e efeitos visuais, mesmo que alguns tenham sido redesenhados e todas as animações fluídas deem lugar ao máximo de carisma que 2 ou 3 frames conseguem apresentar. A famosa abertura, que esbanja recursos aparentemente impossíveis de serem executados no Super Nintendo, está idêntica à original: todas as artes e animações que a tornaram memorável estão presentes, contando ainda com uma excelente adaptação da trilha sonora. Aliás, falaremos desse aspecto a seguir.

Disse uma vez para a minha noiva: "Estou ABESTALHADO com sua beleza, inteligência, o brilho reluzente de suas pernas e o balanço dos seus quadris". Apanhei.
Para conseguir manter o essencial dentro do espaço de 4 megabytes (ou 31 megabites), todos os sons como vozes, golpes e interações no menu sofreram compressões. Porém, para a nossa surpresa, a maioria deles permanece audível, exceto por alguns golpes que já eram difíceis de entender nos fliperamas. Já as músicas tentam extrair o máximo de similaridade que o chip sonoro SPC700 é capaz de fazer, entregando um excelente resultado. Por último e não menos importante, as respostas aos comandos permanecem rápidas, e contamos ainda com 3 opções de velocidade: Normal, Turbo 1 e Turbo 2. E assim como em outros títulos de luta do Super Nintendo, o layout de 6 botões de ação de seu controle "se garante".

Mesmo com todos esses cuidados, o Super Nintendo ainda possui limites de hardware. No caso do Street Fighter Alpha 2, seria quase impossível desenhar a sombra de dois personagens simultaneamente, já que a quantidade de elementos na tela foi minuciosamente controlada para não ultrapassar o limite de 32 sprites por scanline e 128 sprites totais em tela. Mas a Capcom encontrou uma saída engenhosa: utilizou flickering, trocando a sombra do player 1 com a do player 2 em uma velocidade que cria uma ilusão de sombras transparentes para ambos os jogadores! As únicas formas de constatar o flickering é pausar o jogo ou tirar uma foto da tela, como essa:

Repare que apenas a sombra do Ken foi desenhada, enquanto a do Bison será exibida depois. Em movimento, cria-se uma ilusão perfeita!
Perdoem o excesso de informações, mas tive que percorrer todo esse caminho para explicar as razões que fizeram a Capcom recorrer ao flickering. Ou talvez eu seja apenas um tagarela infernal, prolixo e chato, e tenha feito a pior síntese de todos os tempos. Obviamente eu não me importo, mas quem concordar com a segunda hipótese será expulso do blog. Fica o aviso. Evidentemente estou brincando. Ou não. Depende do dia. Ou da hora. Sei lá. Bom, me xinguem nos comentários e digam o que acharam do texto.

Ps: E caso tenham um computador, PlayStation 4, Xbox One ou Nintendo Switch, vale a pena adquirir a coletânea Street Fighter 30th Anniversary Collection, que inclui todos os jogos da franquia Street Fighter até a última versão do Street Fighter III.

E é isso aí.

16/01/2016

Quake 3 Arena e o método Fast InvSqrt()

A raiz quadrada inversa é uma função matemática extremamente útil e com muitas aplicações em diversas áreas. Na área da informática este cálculo também pode ser utilizado para solucionar os mais variados problemas. Entretanto, destaca-se a sua aplicação em jogos eletrônicos para determinar ângulos de incidência e reflexão, muito úteis para gerar iluminação e sombras em ambientes tridimensionais.

Entretanto, alcançar a raiz quadrada inversa durante a execução de iluminação dinâmica em um jogo criava uma situação bastante desconfortável aos programadores, que já lutavam contra os limites de hardware e de programação da época. Realizar este cálculo inúmeras vezes por segundo exigia muito do processador, por isso os programadores buscavam soluções a qualquer custo para minimizar o seu alto custo de processamento e conseguir um resultando ao menos semelhante. E é justamente aí que entra o jogo Quake 3 Arena, lançado em 1999.

Observe o tiro indo em direção à entrada, iluminando a estátua e o chão. Isso é iluminação dinâmica! Clique na imagem para vê-la em tamanho maior :)
A função Fast InvSqrt (abreviação de Fast inverse square root - "Raiz quadrada inversa rápida" ) apareceu pela primeira vez no código fonte do viciante jogo Quake 3 Arena. O método consegue com apenas seis linhas de código;retornar um valor bastante aproximado da raiz quadrada inversa, façanha esta que reduz custos de processamento e roda pelo menos quatro vezes mais rapidamente do que qualquer outro algoritmo que tente encontrar a raiz quadrada inversa de um número, como o (float)(1.0/sqrt(x)), recurso nativo e popular da década de noventa (LOMONT, 2003).

ATENÇÃO: Antes de irmos com tanta sede ao código, que tal relembrarmos alguns detalhes básicos? Variáveis do tipo int correspondem a variáveis que armazenam números inteiros como valor. Já as variáveis do tipo float armazenam números flutuantes, que fazem parte justamente do formato de representação de números reais utilizado pelo computador. Parece bobagem, mas não precisaremos de muito mais do que isso para estudarmos esse interessantíssimo trecho de código.

Agora que terminamos essa pequena revisão, segue abaixo o método (que é uma função, ou seja, retorna o valor da variável) com os devidos comentários:

1. float InvSqrt (float x){ // Função do tipo float recebe a váriável x do tipo float
2.    float xhalf = 0.5f*x; // inicializa a variável xhalf com o valor de x * 0.5f
3.    int i = *(int*)&x; // armazena os bits do ponto flutuante como inteiro
4.    i = 0x5f3759df - (i>>1); // estimativa inicial para a Aproximação de Newton
5.    x = *(float*)&i; // converte bits de volta em ponto flutuante
6.    x = x*(1.5f - xhalf*x*x); // rodada da Aproximação de Newton-Raphson
7.    return x; // retorna o valor armazenado na variável x
8. }

Excluindo o cabeçalho do método (a primeira linha) e a chave que o fecha (última linha), sobram seis linhas de lógica. É incrível como o algoritmo não utiliza divisões e expoentes, apenas multiplicação e deslocamento de bits. A função estima a raiz inversa e utiliza o Método de Aproximação de Newton-Raphson (Aproximação de Newton), uma fórmula empregada para encontrar um valor aproximado de uma raiz de qualquer função matemática. Repetir a Aproximação de Newton refina a acurácia (precisão) do valor, fazendo com que ele se aproxime cada vez mais da raiz. Curiosamente, o método Fast InvSqrt() utiliza apenas uma rodada da Aproximação de Newton.

Mesmo com os comentários acrescidos, algumas linhas ainda nos deixam com algumas dúvidas, por isso tratarei de explicá-las neste parágrafo. Depois da variável xhalf receber o valor de x multiplicado por 0.5f (é a adaptação de uma passagem da Aproximação de Newton, o resultado - produto - será reaproveitado na sexta linha), a terceira linha faz uma conversão (cast) de ponto flutuante para inteiro e armazena o valor na variável i (ok, eu sei que agora foi um pouco pesado, mas garanto que se você tentar ler pausadamente, vai entender muito bem). A quarta linha é uma das mais importantes, tendo a responsabilidade de fazer a estimativa inicial para a Aproximação de Newton. Devido a sua alta complexidade, vamos atentar aos detalhes de sua funcionalidade e não como os autores desta heurística adaptaram essas fórmulas matemáticas.

A linha utiliza um número mágico: 0x5f3759df. É difícil abstrair o que o código faz com facilidade, mas através dessa constante que subtrai o trecho "i>>1" deslocam-se os bits uma posição para a direita, fazendo o último bit significativo cair, o que resulta em uma divisão por 2. Com isso, chegamos a um valor muito próximo da raiz quadrada inversa. A quinta linha converte os bits para ponto flutuante novamente e a sexta linha, a mais importante, é uma adaptação da Aproximação de Newton em linha de código. É através dela que o valor torna-se ainda mais preciso e próximo da raiz quadrada inversa. Por último, na sétima linha, o valor adquirido retorna ao código que chamou a função, chegando ao fim do método Fast InvSqrt().

Autoria da heurística

Diversos sites e portais dão os créditos desta solução ao genial programador John Carmack (Carmack), desenvolvedor de engines de jogos como Commander Keen, Wolfenstein 3D, Doom e Quake. De fato, o trecho citado nesse artigo aparece dentro do código-fonte de Quake 3 Arena, que teve a sua engine desenvolvida por ele. Outro possível autor seria Michael Abrash, conhecido como um dos mais extraordinários otimizadores de assembly x86. Entretanto, o próprio Carmack já negou sua participação e afirmou não acreditar que tenha sido o Michael quando respondeu a um e-mail do portal Beyond3D: "Não fui eu, e não acho que foi o Michael. Terje Mathison talvez?".

Terje Mathison é outro mestre em otimização de código para microprocessadores x86. O portal Beyond3D também entrou em contato com ele, que respondeu agradecendo por ter sido considerado um possível autor, e disse que escreveu um código para calcular a raiz quadrada inversa "uns 5 anos atrás" (possivelmente entre 1999 e 2000), tendo o intuito de solucionar o problema de um sueco com fluídos químicos. Todavia Terje negou sua autoria, apontando as diferenças no Fast InvSqrt() ausentes na solução que ele havia criado. Ele também confirmou que o código não foi escrito por ele.

Após mais um período de pesquisas, o Beyond3D conseguiu a informação com um funcionário da NVIDIA de que o nome mais provável de merecer autoria era Gary Tarolli (Tarolli), um dos fundadores da 3dfx Interactive, empresa pioneira em gráficos 3d para computadores domésticos. É importante mencionar que o método Fast InvSqrt() foi implementado posteriormente em hardware nas placas gráficas 3dfx, o que tornou a pista de Tarroli ainda mais "quente". Em resposta, apesar de afirmar não merecer os créditos, Tarolli confirmou ter usado o algoritmo muitas vezes (o que contribuiu para a popularização e longevidade desta heurística) e mostrou bastante familiaridade com ele, explicando as passagens difíceis bem como a origem de cada um delas. Tarolli também afirmou ter "mexido" no número mágico (a constante utilizada na Aproximação de Newton, quarta linha) para refinar a precisão do resultado. Com isso, é possível concluir que, apesar de não ter todo o crédito, Gary Tarolli foi uma das últimas pessoas a refinar o método Fast InvSqrt()(RYS, 2004).

Conclusão

Em um período de grandes avanços dos ambientes tridimensionais em jogos eletrônicos, a heurística Fast InvSqrt() mostrou-se extremamente útil para minimizar esforços desnecessários de processamento e permitir a criação de jogos com visuais estonteantes. Embora não seja mais utilizado, o recurso foi tão útil que chegou a ser implementado em hardware nas placas gráficas 3dfx (RYS, 2004). A constante utilizada no algoritmo original pode ser substituída por "0x5f375a86", resultando em desempenho ligeiramente melhor (LOMONT, 2003).

Referências

LOMONT, Chris. Fast inverse square root. Disponível em <http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf>. Acesso em: 5 de janeiro de 2016.

RYS. Origin of Quake3's Fast InvSqrt(). Disponível em <https://www.beyond3d.com/content/articles/8/>. Acesso em: 5 de janeiro de 2016.

Agradeço ao meu pai Jorge de Jesus Ganassim revisar o texto e apontar melhorias e aos meus amigos Adriano Rezende (engenheiro de software) e Heider Carlos (futuro engenheiro civil) o lerem e apoiarem e apontarem erros menores. Publicado originalmente neste endereço: https://jorgelucasti.blogspot.com/2016/01/quake-3-arena-e-o-metodo-fast-invsqrt.html