Como citei no artigo anterior artigo 3 criei o projeto de organização de decks apenas com o intuito simples de colocar em prática os aspectos técnicos que geralmente são demandados nas entrevistas de emprego. E também porque gosto de codar nessas horas vagas. Por mais que eu tente assumir uma postura de responsabilidade com o código desse side-project é nele que acabo me permitindo errar sem as consequências diretas de um war-room inesperado ou alguma bronca no fim do dia.
Do ponto de vista do back-end, o projeto se encontra em um nível de maturidade bastante interessante. Tenho serviços com domínios bem definidos que trabalham de forma individual sem acoplamento e seguindo os principais microservices patterns. A aplicação é disposta de acordo com as práticas sugeridas pela arquitetura hexagonal.
Assim que eu estava desenvolvendo o community-service(uma das partes integrantes do projeto que permite encontrar jogadores através do recurso de geolocalização) e o vi funcionando na prática, tive a ideia de estender esse projeto. Essa situação me fez lembrar de quando jogava Yu-Gi-Oh! Nos simuladores de código aberto, como edo-pro, ygo-pro, entre outros. Lembro que era possível criar um host de uma sala com regras personalizadas, mas não era possivel delimitar o range para encontrar um duelista. Isso era uma das opções de que sempre senti falta.
Então pensei que seria interessante integrar o "community-service" que desenvolvi, dessa forma poderíamos então encontrar pessoas próximas que também jogam, dando um maior senso de comunidade durante a gameplay. Imediatamente baixei as versões mais usadas atualmente e fiquei um tanto descontente com o visual. Esses simuladores pareciam parados no tempo, especificamente em 2010, sem mudanças significativas de UX. Resolvi então investigar a viabilidade de criar um sistema de duelos online para se integrar não somente com o community-service, mas também com os outros serviços que eu havia desenvolvido no monorepo.
E é aqui que entra o uso do Claude Code para agilizar as coisas. Lembrei desse post aqui que vi no twitter: um teste interessante usando de uma carcaça de card-gaming, pesquisando mais a fundo encontrei também esse artigo referente a um projeto que lida com efeitos semelhantes.
E a maior maior referência visual que me inspirei, foi o poke-holo onde os efeitos de holografia são implementados com maestria para as cartas do Pokémon OCG.
É importante falar do Claude porque foi graças a essa ferramenta que entendi os requisitos necessários para implementar esse sistema de duelos. Descobri que as diferentes versões dos simuladores gratuitos usam um core único, o ocgcore, que é feito inteiramente em C++ sendo os cards escritos em lua. link do projeto: ocgcore-KCG
Esse core funciona como um processo/servidor. Cada ação do jogador vira uma mensagem binária enviada pro core, e o core responde com o novo estado do jogo. O front é essencialmente um renderer burro que exibe o que o core manda.
Basicamente ele é um motor C++ que carrega as regras oficiais de Yu-Gi-Oh, o mesmo usado pelo YGOPro/EDOPro. Ele roda num servidor separado e se comunica via protocolo binário sobre WebSocket. Dessa forma a comunicação com a minha aplicação front vai se dar da seguinte maneira:
Obs: Decidi em deixar o front como react para fortalecer os estudos recentes que tenho feito desse framework.
O duel-system vai ser um serviço isolado do deck-management(mas que usará seus recursos), um sistema web feito em Java/Spring Boot que vai intermediar a comunicação entre o react e o core em C++. Basicamente ele entraria em ação com a biblioteca JNI (Java Native Interface) que vai me permitir chamar funções nativas do ocgcore. O fluxo seria esse aqui:
Nesse ponto, acabei tendo um salto muito grande, do ponto de vista do escopo da atuação. Passei da ideia de projetar o deck-management não apenas como um fim em si mesmo, mas como um meio facilitador de um novo sistema web de duelos. Pretendo torna-lo um sistema tão completo que sinceramente acredito numa recepção bastante positiva da comunidade.
link do repositório, apenas uma poc inicial contendo o front-end em react, ainda sem a implementação do core em C++: deck-management-front-end


Top comments (0)