EN / PT

Bem Vindo!

Vamos resolver seus problemas de TI!

Meu nome é Marcelo L. Lotufo, Eu comecei a programar quando eu tinha 15 anos para que eu pudesse criar meus próprios mapas de Warcraft 3 e meus próprios jogos em Flash. No final eu me apaixonei pela arte e hoje sou um engenheiro de software trabalhando na Lotuz, uma pequena agência de desenvolvimento.

Modando Shapez.io

03/08/2020

Alguns dias atrás eu vi um jobo chamado shapez.io e para minha surpresa o jogo tinha código aberto e foi feito usando tecnologias para a internet.

Eu joguei por um tempo e comecei a imaginar como alguém poderia criar um mod para o jogo, infelizmente o jogo não foi exatamente pensado com a ideia de suportar mods, então o único modo de adicionar alguma coisa era editar o seu código fonte.

O jogo foi construído em cima de um motor próprio, que até onde eu entendi foi adaptado de um outro jogo que o desenvoler tinha feito anteriormente. O motor não é muito caprichado com muitas frescuras, mas faz o que precisa ser feito, afinal ningúem precisa de funções que não irá usar.

O código é bem documentado e em geral tem um arquitetura legal, o principal programador tobspr fez um bom trabalho com o código. O código usa entidade-componente-sistema (ECS) para estruturar suas várias partes, cada Entidade pode ter vários Componentes que está relecionado a um Sistema.

O Componente adiciona atributos (rotação, variação, força) para a Entidade, enqaunto o Sistema adicionar a logic de fato.

Acredito que a Unity também usa essa arquitetura para seu motor.

De qualquer forma...

A ideia do mod

Eu queria me manter com os pés no chão e começar simples, então a primeira coisa que pensei foi em adicionar esteiras de cores diferentes no jogo. Como o jogo usa muito as cores aditivas básicas, eu achei que essa seria uma boa aposta para manter as novas esteiras coloridas com o mesmo tema do jogo.

Criando as Sprites

Por mais que no passado eu já tenha feito pixeal art para um jogo na faculdade, não me considero um arties, então eu tinha que achar uma forma fácil de criar as novas sprites para as esteiras, talvez pintar cada uma das setas em cada uma das sprites... Nossa, teria sido um inferno fazer isso, por sorte o desenvolvedor criou um script node/canvas para gerar cada uma das sprites para a esteira.

Eu só precisei adicionar umas cores em hexa e um for e o trabalho estava feito.

Criando o Atlas

O jogo usa sprite sheet para suas images e Texture Packer para criar seus atlas de sprites e você tem que pagar para usar, então eu tinha que achar uma alternativa grátis.

Eu dei uma olhada pelo npm por alguma coisa que iria ajuda. Spritesmith era promissor, mas não parecia que iria resolver. Eu tentei o Spritesheet.js e ele quase resolveu... QUASE!

O código tinha duas falhas: uma chamada de uma API node depreciada e não passava o valor de escala (scale) para o atlas json gerado.

Não importava o que eu colocasse como scale, o json de saida sempre aparecia como "1", então eu arrumei o código diretamente no node_modules e depois eu criei um for do spritesheet.js. (provavelmente eu vou criar um pull request com o que eu arrumei)

Escrevi alguns scripts npm para gerar os atlas que precisava e pronto!

A única coisa que é importante saber é que o Texture Packer tem mais funções e gera sprite sheets melhores, da forma que eu gere algumas sprites tremem nas bordas e no momento eu não estava disposto a gastar mais tempo arrumando isso.

Criando as construções

Olhando pelo código, cada construção é criado com a possibilidade de ter variações. A cesta de lixo tem a variação de armazém, o cortador de 2 lados tem a variação de 4 lados e por ai vai.

Sabendo disso, a forma mais simples de adicionar as esteiras coloridas seria adicionar variações para a esteira sem mexer em nenhuma das partes da lógica. Afinal, é só um mod de auxílio visual.

Eu adicionei as variações de esteiras, mas o jogo continuava quebrando falando que não entendia o código das construções.

Tinha que existir um registro em algum lugar...

Alguns greps depois, eu e

Alguns greps depois, eu encontrei o código que registra as construções e os ids das contruções era incrementais e escritos diretamente no código, que é ruim na minha opinião. Se fosse existir algum tipo de carregador de mods e cada mod fosse chamar o registro tendo que se preocupar em não colidir ids, as coisas iriam dar errado e MUITO rápido. Acredito que o minecraft teve um problema similar antes do Forge.

Esteiras registradas!

O Mod estava pronto e funcionando!

Se você quiser ver de fato o código para o mod, de uma olhada no github.

Espero que tenha aproveitado, continue programando!

marcel0ll