Voltar ao blog

Como os caça-níqueis são programados: arquitetura HTML5

Capa do artigo: Como os caça-níqueis são programados: arquitetura HTML5

Pesquise “como os caça-níqueis são programados” e você recebe dois tipos de resposta: a teoria da conspiração (“o cassino aperta o jogo pelo painel”) e o clichê (“é tudo um gerador de números aleatórios”). Nenhuma das duas descreve o que um desenvolvedor de slots realmente escreve. Abaixo está a arquitetura de um slot HTML5 moderno, camada por camada, do número que decide o resultado até o pixel que o mostra.

Camada 1: o resultado

Uma rodada é decidida por uma coisa só: um conjunto de posições de parada das bobinas (ou, em jogos de grade, um conjunto de símbolos). Onde essa decisão é tomada depende da plataforma.

  • RNG no servidor. O modelo clássico. O servidor do jogo sorteia números de um gerador certificado, mapeia para paradas nas fitas virtuais, avalia os ganhos e devolve o resultado ao cliente. O cliente é um dispositivo de exibição: não tem como influenciar o resultado.
  • Resultados pré-computados. O modelo mais novo, usado por plataformas como a Stake Engine. O estúdio simula o jogo antecipadamente; cada rodada possível é armazenada com um peso, e a rodada servida é sorteada desse conjunto. Muda o pipeline de produção, não a lógica: continua havendo um gerador certificado escolhendo a entrada.

Em ambos os casos o cliente nunca decide nada. É por isso que a ideia de “apertar o jogo pelo back office” não se sustenta: mudar o retorno significa trocar a configuração matemática certificada, e isso é um novo build com nova verificação.

Camada 2: o módulo de matemática

É o coração do jogo: fitas de bobina, tabela de pagamentos, lógica dos recursos e código de avaliação. Estúdios sérios mantêm esse módulo independente de plataforma, escrito uma vez (em Python, C# ou TypeScript) e executado em três lugares: no simulador que produz a PAR sheet, no servidor (ou no pipeline de pré-computação) e — apenas para apresentação — no cliente, que precisa saber quais posições destacar. Se os três divergirem, a certificação falha; por isso o módulo é versionado por hash e tratado como fonte da verdade.

Camada 3: o protocolo da rodada

Cliente e servidor trocam um conjunto pequeno de mensagens: autenticar, obter a configuração do jogo (tabela de pagamentos, níveis de aposta, saldo), apostar, receber o resultado, confirmar o fim da rodada e, em recursos, mensagens de “continuar” ou “escolher”. O payload do resultado carrega tudo o que o cliente precisa para reproduzir a rodada de forma determinística: paradas, ganhos com posições, passos do recurso, saldo antes e depois. O tratamento de reconexão faz parte do protocolo: ao reabrir, o cliente pergunta se existe rodada inacabada e retoma a apresentação do estado salvo, não do começo. Os laboratórios testam exatamente isso.

Camada 4: o cliente como máquina de estados

O cliente HTML5 é uma máquina de estados desenhada sobre um canvas WebGL. Estados típicos: ocioso → aposta feita → bobinas girando → bobinas parando (com antecipação) → avaliação → apresentação do ganho em níveis → intro do recurso → rodadas do recurso → saída do recurso → ocioso. Cada estado é dono das próprias animações, sons e disponibilidade de interface (não dá para mudar a aposta com as bobinas girando). O motor por baixo costuma ser o PixiJS — o mesmo renderizador sobre o qual o SDK de front-end da Stake é construído — ou uma camada própria em cima dele. Quem pergunta se é melhor Phaser ou PixiJS para slots costuma descobrir que a resposta é a segunda opção quando o jogo precisa de controle fino sobre lotes de sprites e shaders.

Componentes principais do cliente:

  • Renderizador de bobinas — uma fita rolante de sprites com desfoque, quique e capacidade de parar em uma posição dada; a antecipação desacelera as últimas bobinas quando falta um símbolo para o recurso.
  • Apresentador de ganhos — destaca linhas ou clusters, anima símbolos por faixa, conta o valor e escala para telas de Big / Mega / Epic em limiares configurados.
  • Carregador de recursos — atlas de texturas, sprite sheets, rigs Spine e áudio, carregados por prioridade para que o jogo fique jogável antes de a sequência de grande ganho terminar de baixar.
  • Controlador de áudio — música em camadas por estado, stems de antecipação, pool de efeitos, regras de ducking.
  • Camada de interface — controles de aposta, saldo, autoplay, turbo, tabela de pagamentos, configurações, além das flags por jurisdição que escondem ou restringem controles.

Camada 5: desempenho

Um slot precisa sustentar 60 quadros por segundo em um Android de três anos, em conexão móvel. Isso dita todo o resto: atlas abaixo de 2048 pixels, folhas de símbolos compartilhadas entre estados, contagem de partículas limitada, áudio comprimido a poucos megabytes e um primeiro carregamento total de 8 a 12 MB, com o restante transmitido depois. A otimização de slots HTML5 costuma ser o que separa uma avaliação de duas estrelas de uma de três numa plataforma curada — não a matemática, mas uma cena de grande ganho que engasga. O carregamento de recursos em ordem de prioridade é a alavanca mais barata: o jogador começa a jogar enquanto o resto chega.

Camada 6: testes

São três tipos. Testes de simulação no módulo de matemática, que confirmam RTP, frequência de acerto e distribuição do prêmio máximo em bilhões de rodadas. Testes funcionais no cliente, com resultados forçados para percorrer cada regra e cada caso de borda. E testes de dispositivo: os mesmos cinco aparelhos baratos, sempre, medindo quadros por segundo, memória e tempo de carregamento.

O que isso significa na prática

Programar um slot é muito menos “escrever um RNG” e muito mais montar uma cadeia auditável entre um número e uma animação, em que cada elo pode ser verificado por terceiros. É por isso que a matemática mora fora do cliente, o protocolo é determinístico e o build é congelado por hash.

Se você está avaliando um fornecedor, vale ler o que olhar em um provedor de jogos e como funciona a produção na Stake Engine. Na Giro Games, essa arquitetura completa — matemática, protocolo, desempenho e builds de certificação — é o serviço de desenvolvimento de slots em HTML5, entregue na Stake Engine ou contra o RGS do próprio cliente.

Continue lendo

Você também pode gostar