Jogo #12

Bloco da Sorte

Volatilidade
Grid
RTP

Bloco da Sorte — Game Design Document (GDD)

Versão: 1.0 Data: 2026-04-03 Mercado: Paraná, Brasil (Regulação Lottopar) Referência Global: Sweet Bonanza (Pragmatic Play) / Aloha! Cluster Pays (NetEnt)


1. Identificação do Jogo

Campo Valor
Nome do Jogo Bloco da Sorte
Código Interno PROJETO_12
Tipo de Slot Cluster Pays / Grid Slot
Grid 7x7 (49 posições)
Aposta Fixa 20 créditos
Tipo de Pagamento Agrupamentos conectados (5+)
RTP Alvo 90% (Rua) / 94% (Standard) / 97% (VIP)
Volatilidade Baixa (Base) / Altíssima (Bônus)
Hit Frequency 38% (Alta)
Jackpot Progressivo Não

2. Tema e Identidade Visual

2.1 Narrativa Temática

Bloco da Sorte celebra a alegria explosiva do Carnaval de Rua. A mecânica de Cluster Pays (agrupar símbolos adjacentes) replica a experiência satisfatória de jogos mobile como Candy Crush, mas em um ambiente de Carnaval com cores, confete e sons de bateria.

O objetivo é manter o jogador em "transe hipnótica" — girando constantemente mesmo que ganhe pequenas quantias, na esperança de acertar a "Bomba de Confete" 100x durante o bônus.

2.2 Paleta de Cores

2.3 Símbolos Temáticos

2.4 Animações Principais


3. Estrutura Mecânica

3.1 Layout e Configuração

``` ┌────┬────┬────┬────┬────┬────┬────┐ │ S1 │ S2 │ S3 │ S4 │ S5 │ S6 │ S7 │ ├────┼────┼────┼────┼────┼────┼────┤ │ S8 │ S9 │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ │ │ │ │ │ └────┴────┴────┴────┴────┴────┴────┘

Grid: 7 Colunas x 7 Linhas = 49 Células ```

Coordenadas: (coluna, linha) onde (0,0) é topo-esquerdo.

3.2 Condição de Vitória

Cluster: 5 ou mais símbolos idênticos conectados horizontal ou verticalmente (não diagonal).

Não Contam: - Conectados apenas na diagonal - Menos de 5 símbolos - Símbolos diferentes

Exemplo Vitorioso: [R] [R] [R] [ ] [ ] ← Pandeiro (5 symbols) = VITÓRIA [R] [ ] [ ] [ ] [ ]

Exemplo Não Vitorioso: [P] [ ] [P] [ ] [ ] ← Pandeiros NÃO conectados [ ] [P] [ ] [ ] [ ]

3.3 Mecanismo de Cascata (Tumble)

Quando um cluster é vitorioso:

  1. Pausa 0.3s: Cluster pisca 3x para confirmar ao jogador
  2. Explosão: Cluster desaparece em partículas de confete
  3. Queda: Símbolos acima caem (gravity)
  4. Entrada: Novos símbolos caem do topo
  5. Verificação: Sistema verifica se há nova vitória
  6. Repetição: Se há vitória, volta ao passo 1; se não, termina

Multiplicador de Cascata: (não se aplica em base, apenas em bônus)


4. Tabela de Símbolos e Paytable

4.1 Paytable Completo (em % da aposta)

Símbolo 15+ 11-14 9-10 7-8 5-6 Função
Rei Momo 500% 250% 100% 50% 20% Premium. Raro. Max Win potencial.
Rainha 200% 100% 50% 25% 15% Alto. Efeito feminino (marketing).
Tambor 100% 50% 25% 15% 10% Médio. Sustém cascatas.
Pandeiro 50% 25% 12% 8% 5% Médio. Frequente.
Máscara Ouro 25% 12% 6% 4% 2% Baixo. Lixo 1.
Máscara Azul 10% 5% 2% 1% 0.5% Muito Baixo. Lixo 2.
Máscara Verde 10% 5% 2% 1% 0.5% Muito Baixo. Lixo 3.
Carro Alegórico (Scatter) 4+ dispara Free Spins (não precisa conectar)
Bomba de Confete Multiplicador do bônus (2x, 5x, 10x, 50x, 100x)

4.2 Notas Importantes

  1. Escalabilidade Não-Linear: Um cluster de 15 não paga 3x um cluster de 5. O sistema está escalado para ser exponencial até o topo.

  2. Piso de Ganho: Clusters de 5-6 geralmente pagam MENOS que a aposta inicial (0.5x a 1x), mantendo saldo vivo mas criando antecipação.

  3. Bomba (Bônus Exclusivo): Não aparece no jogo base. Exclusive to Free Spins. Multiplicadores: 2x, 5x, 10x, 50x, 100x com distribuição própria.


5. Mecanismo de Bônus: "Bomba de Confete"

5.1 Gatilho

5.2 Mecânica das Bombas de Multiplicador

Durante Free Spins, um novo símbolo aparece: Bomba de Confete

Características: - Aparece aleatoriamente durante o bônus - Contém um multiplicador fixo (2x, 5x, 10x, 50x, ou 100x) - NÃO explode durante cascatas — permanece na grade até o final do giro

Cálculo Final do Giro com Bombas:

Prêmio Final = (Soma de Clusters Deste Giro) × (Soma de Multiplicadores das Bombas)

Exemplo: - Clusters ganham: R$ 5,00 - Cascata! Novos clusters ganham: R$ 15,00 - Total de clusters: R$ 20,00 - Bombas na tela: 10x + 5x = 15x de multiplicador - Prêmio Final: R$ 20,00 × 15 = R$ 300,00

5.3 Retrigger

5.4 Segurança do Multiplicador

Embora teoricamente ilimitado, o multiplicador é controlado internamente: - RTP 90%: Multiplicador máx observado 10x (100x nunca aparece) - RTP 94%: Multiplicador máx observado 50x (100x raro) - RTP 97%: Multiplicador máx observado 100x (frequência: 1 a cada 20 bônus)


6. Análise de RTP e Volatilidade

6.1 Curva de Volatilidade

RTP Hit Frequency Volatilidade (Base) Volatilidade (Bônus)
90% 36% Baixa Altíssima
94% 38% Baixa Altíssima
97% 40% Baixa Altíssima

Interpretação: - Base: Jogador ganha pequenas quantias 35-40% do tempo, mantendo saldo vivo - Bônus: Risco/recompensa extremo. Pode ganhar 0 ou 500x+ em um bônus

6.2 Diferenciadores por RTP

RTP 90% (Rua): - Clusters de 5-6 mais frequentes - Bombas de Multiplicador limitadas a 10x máx - Bônus triggerado raramente (1 em 200 spins)

RTP 94% (Standard): - Clusters equilibrados entre 5 e 10 - Bombas até 50x aparecem ocasionalmente - Bônus triggerado 1 em 150 spins

RTP 97% (VIP): - Clusters maiores (10+) mais comuns - Bombas de 100x aparecem 1 em cada 20 bônus - Bônus triggerado 1 em 120 spins


7. Integração com Pool Finito (Lottopar)

7.1 Modelo de Pré-Determinação

Como um cluster é "forjado" para pagar um valor específico?

Processo (Reverse Cluster Builder):

  1. Entrada: "Prêmio Final = R$ 60,00"
  2. Decomposição: Motor quebra em clusters menores
  3. Cluster 1: 8 Pandeiros = R$ 12,00
  4. Cluster 2: 6 Reis Momos = R$ 48,00
  5. Construção Visual:
  6. Posiciona 8 Pandeiros adjacentes na grade
  7. Posiciona 6 Reis Momos adjacentes em outro local
  8. Bloqueadores: Preenche resto com símbolos que NUNCA conectarão (padrão checkerboard)
  9. Validação: Verifica que nenhuma outra vitória acidental ocorre

8. Algoritmo Flood Fill (Detecção de Clusters)

8.1 Pseudocódigo

```python def find_all_winning_clusters(grid): """ Usa Flood Fill para encontrar TODOS os clusters que têm 5+ símbolos conectados """ visited = [[False] * 7 for _ in range(7)] winning_clusters = []

for row in range(7):
    for col in range(7):
        if not visited[row][col]:
            cluster = flood_fill(row, col, grid, visited)
            if len(cluster) >= 5:
                symbol_id = grid[row][col]
                payout = calculate_cluster_payout(symbol_id, len(cluster))
                winning_clusters.append({
                    "symbol": symbol_id,
                    "cells": cluster,
                    "count": len(cluster),
                    "payout": payout
                })

return winning_clusters

def flood_fill(row, col, grid, visited): """ Flood Fill clássico (algoritmo Paint Bucket) Conecta apenas horizontal/vertical (não diagonal) """ if row < 0 or row >= 7 or col < 0 or col >= 7: return [] if visited[row][col]: return []

symbol = grid[row][col]
if symbol == EMPTY or symbol == SCATTER:
    return []

visited[row][col] = True
cluster = [(row, col)]

# Verificar 4 vizinhos (cima, baixo, esquerda, direita)
neighbors = [
    (row - 1, col),  # CIMA
    (row + 1, col),  # BAIXO
    (row, col - 1),  # ESQUERDA
    (row, col + 1)   # DIREITA
]

for nr, nc in neighbors:
    neighbor_cluster = flood_fill(nr, nc, grid, visited)
    cluster.extend(neighbor_cluster)

return cluster

```

8.2 Complexidade Computacional


9. Estrutura do Phantom Buffer

9.1 Dimensionamento

Viewport (visível): 7x7 = 49 células Phantom Buffer (acima): 7x14 = 98 células Total na memória: 7x21 = 147 células

Por quê 14 linhas? Em uma super cascata (ex: 20 símbolos explodem), quase metade da tela desaparece. Se houver uma segunda cascata, você precisa de muitos símbolos prontos para não travar animação.

9.2 Estratégia de Preenchimento

```python def build_phantom_buffer(target_prize, expected_cascades): """ Pré-constrói conteúdo do buffer para garantir que cascatas renderizarão o prêmio correto """ phantom = [[EMPTY] * 7 for _ in range(14)] remaining_prize = target_prize

for cascade_idx in range(expected_cascades):
    prize_this_cascade = remaining_prize / (expected_cascades - cascade_idx)

    # Selecionar símbolos que renderizam este prêmio
    symbols = select_symbols_for_prize(prize_this_cascade)

    # Preencher linha do buffer
    for col in range(7):
        phantom[cascade_idx][col] = symbols[col]

    remaining_prize -= prize_this_cascade

# Preencher resto com lixo (non-winning)
for row in range(expected_cascades, 14):
    for col in range(7):
        phantom[row][col] = random_non_connecting_symbol()

return phantom

```


10. Máximo Potencial de Ganho (Max Win)

10.1 Cálculo Teórico

Max Win = Maior Cluster Possível × Max Multiplicador Max Win = (Rei Momo 49 símbolos × 500%) × (100x Bomba) Max Win = 245x × 100x = 24.500x de aposta

10.2 Caps Lottopar (Reais)

RTP Cap por Aposta
90% R$ 50.000
94% R$ 100.000
97% R$ 250.000

Assim, em uma aposta de R$ 1,00: - RTP 90%: Máx observable R$ 50.000 - RTP 94%: Máx observable R$ 100.000 - RTP 97%: Máx observable R$ 250.000


11. Simulação Financeira (30 Dias / 1 Máquina)

11.1 Parâmetros

Parâmetro Valor
Aposta Média R$ 20,00 (20 créditos × R$ 1,00)
Giros por Hora 80 giros (mais rápido que Megaways)
Horas Diárias 12 horas
Dias no Mês 30 dias

11.2 Projeção

``` Giros Mensais = 80 × 12 × 30 = 28.800 giros Coin-In = 28.800 × R$ 20 = R$ 576.000 GGR (6% esperado) = R$ 34.560

Hit Frequency: 38% × 28.800 = 10.944 giros vencedores Média de ganho por vitória: R$ 34.560 / 10.944 = R$ 3,16 ```


12. Design de Som (Soundscape)

12.1 Música Ambiente

12.2 SFX Detalhados

Evento Som Descrição
Giro Base Rolos caindo "Whoosh" suave
Cluster Encontrado Apito duplo Confirma ao jogador
Cluster Explode "Pop" agudo Tipo estourar bolha plástico
Cascata Série de "pops" Cada símbolo que cai, um pop
Bomba Caindo Sino musical Nota grave (C3)
Bomba Disparando Zap futurista Efeito de laser suave
Big Win Fanfarra + sirene Celebração
Scatter Ding-ding-ding Sino de caixa

12.3 Dinâmica de Volume


13. Conformidade Lottopar

13.1 Checklist de Compliance

13.2 Documentação Obrigatória


14. Diferencial de Marketing

14.1 Por que "Bloco da Sorte" vai vender

  1. Visual Adictivo: Cores vibrantes, explosões constantes = dopamine hit
  2. Pacing Rápido: 80 giros/hora vs 60 em Megaways = mais ação
  3. Familiar Mechanic: Jogadores de celular (Candy Crush) já entendem cluster
  4. Hit Frequency Alta: 38% significa ganhar algo a cada 2-3 giros
  5. Bomba 100x: Vídeo viral em redes sociais (1 a cada 20 bônus em RTP 97%)

14.2 KPIs Esperados


Glossário de Termos

Termo Definição
Cluster 5+ símbolos idênticos conectados horizontal/vertical
Tumble Cascata de quedas e novos símbolos
Scatter Símbolo que não precisa conectar para ativar bônus
Bomba Multiplicador especial do bônus
Flood Fill Algoritmo que detecta clusters
Phantom Buffer Área de memória com símbolos de reposição
Kill Screen Validação de que não há vitória acidental
Max Win Prêmio máximo teórico

Documentação Completa Assinada Documento Versão 1.0 — Apto para Desenvolvimento Data: 2026-04-03

Bloco da Sorte — Technical Design Document (TDD)

Versão: 1.0 Data: 2026-04-03 Arquitetura: Cluster Pays Engine com Flood Fill Algorithm Plataforma: Lottopar (PR Regulation)


1. Visão Geral Técnica

Bloco da Sorte implementa mecânica Cluster Pays em grade 7x7. A complexidade computacional está na detecção de clusters (Flood Fill) e na construção reversa (Reverse Builder) para entregar um prêmio específico.

Stack Recomendado: - Front-end: Unity WebGL ou HTML5/Pixi.js - Back-end: C# .NET Core ou Node.js - DB: PostgreSQL + Redis cache


2. Flood Fill Algorithm (Core)

2.1 Implementação Python

```python class ClusterGrid: def init(self, grid): self.grid = grid # 7x7 self.visited = [[False] * 7 for _ in range(7)]

def find_all_clusters(self):
    """Encontra todos clusters >= 5"""
    clusters = []

    for row in range(7):
        for col in range(7):
            if not self.visited[row][col] and self.grid[row][col] not in [EMPTY, SCATTER]:
                cluster = self.flood_fill(row, col)
                if len(cluster) >= 5:
                    symbol_id = self.grid[row][col]
                    clusters.append({
                        "symbol": symbol_id,
                        "cells": cluster,
                        "size": len(cluster)
                    })

    return clusters

def flood_fill(self, start_row, start_col):
    """Flood Fill recursivo"""
    stack = [(start_row, start_col)]
    cluster = []
    symbol = self.grid[start_row][start_col]

    while stack:
        row, col = stack.pop()

        if row < 0 or row >= 7 or col < 0 or col >= 7:
            continue
        if self.visited[row][col]:
            continue
        if self.grid[row][col] != symbol:
            continue

        self.visited[row][col] = True
        cluster.append((row, col))

        # 4 vizinhos (não diagonal)
        stack.extend([
            (row-1, col), (row+1, col),
            (row, col-1), (row, col+1)
        ])

    return cluster

def calculate_payout(self, clusters):
    """Calcula ganho total"""
    total = 0
    for cluster in clusters:
        symbol = cluster['symbol']
        size = cluster['size']

        # Lookup paytable
        payout = PAYTABLE[symbol].get(size, 0)
        total += payout

    return total

```

2.2 Complexidade


3. Reverse Cluster Builder (Pool Finito)

3.1 Algoritmo de Construção

```python def build_winning_grid(target_prize, rtp_curve): """ Dado um prêmio, constrói uma grade que pague exatamente isso """

# Passo 1: Decompor prêmio
components = decompose_prize_into_components(target_prize)
# Exemplo retorno:
# [
#   {"symbol": "PANDEIRO", "size": 7, "payout": 35},
#   {"symbol": "REI_MOMO", "size": 5, "payout": 100}
# ]

# Passo 2: Inicializar grade vazia
grid = [[EMPTY] * 7 for _ in range(7)]

# Passo 3: Plantar clusters vencedores
occupied = set()  # Rastreia posições já usadas

for component in components:
    # Escolher posição aleatória para este cluster
    start_row, start_col = find_free_position(occupied)

    # Plantar cluster organicamente
    cluster_cells = grow_cluster_organic(
        grid, start_row, start_col,
        component['symbol'], component['size']
    )

    occupied.update(cluster_cells)

# Passo 4: Preencher resto com bloqueadores
fill_with_blockers(grid, occupied)

# Passo 5: Validar nenhuma vitória acidental
clusters = find_all_clusters(grid)
calculated_payout = calculate_payout(clusters)

assert abs(calculated_payout - target_prize) < 0.01, \
    f"Prize mismatch: {calculated_payout} vs {target_prize}"

return grid

def grow_cluster_organic(grid, start_row, start_col, symbol, target_size): """ Crescer cluster de forma orgânica (tetris shapes) não apenas quadrados """ cluster = [(start_row, start_col)] grid[start_row][start_col] = symbol

attempts = 0
while len(cluster) < target_size and attempts < 100:
    # Selecionar célula de bordo aleatória
    edge_cell = random.choice(cluster)
    row, col = edge_cell

    # Expandir em 1 direção aleatória
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
    random.shuffle(directions)

    for dr, dc in directions:
        new_row, new_col = row + dr, col + dc

        # Validar espaço livre
        if (0 <= new_row < 7 and 0 <= new_col < 7 and
            grid[new_row][new_col] == EMPTY):

            grid[new_row][new_col] = symbol
            cluster.append((new_row, new_col))
            break

    attempts += 1

return cluster

def fill_with_blockers(grid, occupied): """ Preencher células vazias com padrão checkerboard que previne conexões acidentais """ for row in range(7): for col in range(7): if (row, col) not in occupied and grid[row][col] == EMPTY: # Alternar A, B para evitar conexões symbol = BLOCKER_A if (row + col) % 2 == 0 else BLOCKER_B grid[row][col] = symbol ```

3.2 Decomposição de Prêmio

```python def decompose_prize_into_components(target_prize): """ Quebra prêmio em componentes de cluster realizáveis """ components = [] remaining = target_prize

# Estratégia: usar símbolos premium primeiro
symbols_by_value = sorted(PAYTABLE.items(),
                         key=lambda x: x[1]['max_payout'],
                         reverse=True)

for symbol, payouts in symbols_by_value:
    if remaining <= 0.01:
        break

    # Encontrar tamanho de cluster que cabe neste remaining
    for size in range(15, 4, -1):  # 15, 14, 13...5
        payout = payouts.get(size, 0)

        if payout <= remaining:
            components.append({
                "symbol": symbol,
                "size": size,
                "payout": payout
            })
            remaining -= payout
            break

return components

```


4. Cascade Processing

4.1 Loop de Cascata

```python class CascadeProcessor: def init(self, grid, phantom_buffer): self.grid = grid # 7x7 viewport self.phantom = phantom_buffer # 7x14 self.cascades = []

def process_cascades(self):
    """Processa todas as cascatas até não haver mais vitórias"""
    cascade_num = 0

    while True:
        cascade_num += 1

        # 1. Detectar clusters
        clusters = self.find_all_clusters()

        if not clusters:
            break  # Sem mais vitórias

        # 2. Registrar cascata
        cascade_data = {
            "num": cascade_num,
            "clusters": clusters,
            "payout": sum(c['payout'] for c in clusters)
        }
        self.cascades.append(cascade_data)

        # 3. Remover símbolos
        self.remove_winning_symbols(clusters)

        # 4. Aplicar gravidade (queda)
        self.apply_gravity()

        # 5. Repor do buffer
        self.replenish_from_phantom()

    return self.cascades

def remove_winning_symbols(self, clusters):
    """Remove símbolos vencedores"""
    for cluster in clusters:
        for row, col in cluster['cells']:
            self.grid[row][col] = EMPTY

def apply_gravity(self):
    """Símbolos caem"""
    for col in range(7):
        # Compactar coluna
        symbols = [self.grid[row][col] for row in range(7)
                  if self.grid[row][col] != EMPTY]

        # Preencher com vazios no topo
        for row in range(7 - len(symbols)):
            self.grid[row][col] = EMPTY

        # Preencher com símbolos embaixo
        for i, sym in enumerate(symbols):
            self.grid[7 - len(symbols) + i][col] = sym

def replenish_from_phantom(self):
    """Puxa símbolos do phantom buffer"""
    for col in range(7):
        # Contar vazios no topo da coluna
        empty_count = 0
        for row in range(7):
            if self.grid[row][col] != EMPTY:
                break
            empty_count += 1

        # Puxa do phantom (bottom to top)
        for i in range(empty_count):
            symbol = self.phantom[13 - i][col]
            self.grid[i][col] = symbol

        # Scroll phantom
        self.phantom.pop()  # Remove última linha
        # Adicionar nova linha (será populada em próxima cascata)
        new_row = [RANDOM_NON_WINNING() for _ in range(7)]
        self.phantom.insert(0, new_row)

```


5. Phantom Buffer Management

5.1 Pre-computation do Buffer

```python def build_phantom_for_cascades(target_prize, expected_cascades=3): """ Pré-constrói phantom buffer para garantir cascatas renderizam o prêmio correto """ phantom = [[EMPTY] * 7 for _ in range(14)] remaining = target_prize

for cascade_idx in range(expected_cascades):
    prize_per_cascade = remaining / (expected_cascades - cascade_idx)

    # Gerar símbolos que renderizam este prêmio
    symbols = generate_symbols_for_prize(prize_per_cascade)

    # Preencher linha do phantom
    for col in range(7):
        phantom[cascade_idx][col] = symbols[col]

    remaining -= prize_per_cascade

# Preencher resto com lixo
for row in range(expected_cascades, 14):
    for col in range(7):
        phantom[row][col] = random_non_winning_symbol()

return phantom

```

5.2 Buffer Lifecycle

``` Inicial (14 linhas): [P0] ← Próxima a cair [P1] ... [P13]

Após 1ª cascata (1 linha usada): [P1] [P2] ... [P13] [NEW] ← Nova linha gerada aleatoriamente

Após 2ª cascata: [P2] ... [NEW1] [NEW2] ```


6. Paytable Implementation

6.1 Estrutura de Dados

```python PAYTABLE = { "REI_MOMO": { 5: 20, # 5 símbolos = 20% da aposta 6: 20, 7: 50, 8: 50, 9: 100, 10: 100, 11: 250, 12: 250, 13: 250, 14: 250, 15: 500 # 15+ = 500% }, "RAINHA": { 5: 15, 6: 15, 7: 25, # ... 15: 200 }, "PANDEIRO": { 5: 5, 6: 5, 7: 8, # ... 15: 50 }, # ... resto dos símbolos }

def calculate_payout(symbol, size): """Lookup seguro com fallback""" if size >= 15: size = 15 # Max cap

return PAYTABLE.get(symbol, {}).get(size, 0)

```


7. Feature Buy Integration (Optional)

7.1 Fluxo

```python def trigger_feature_buy_bonus(feature_buy_cost, num_spins=10): """ Feature Buy = aposta de alta denominação que força entrada em bônus """

# 1. Débito
player_balance -= feature_buy_cost

# 2. Enviar para Lottopar como aposta normal
response = lottopar_server.place_bet({
    "game_id": "BLOCO_DA_SORTE",
    "amount": feature_buy_cost
})

prize = response['prize']  # Ex: R$ 450

# 3. Construir script de bônus
bonus_script = build_bonus_script(prize, num_spins)

# 4. Executar bônus
for spin_data in bonus_script:
    render_spin(spin_data)

return sum(spin['final_win'] for spin in bonus_script)

```


8. JSON Payload Structure

8.1 Spin Response

json { "spin_id": "CARNAVAL_001", "grid": [ ["PANDEIRO", "PANDEIRO", "BLOCKER_A", "REI_MOMO", "REI_MOMO", "BLOCKER_B", "BLOCKER_A"], ["RAINHA", "BLOCKER_B", "RAINHA", "REI_MOMO", "BLOCKER_A", "BLOCKER_B", "RAINHA"], ... ], "winning_clusters": [ { "symbol": "PANDEIRO", "size": 8, "cells": [[0,0], [0,1], [1,0], [1,1], [2,0], [2,1], [3,0], [3,1]], "payout": 40 } ], "cascades": [ { "cascade_num": 1, "removed_cells": [[0,0], [0,1], ...], "new_symbols": [["RAINHA", "BLOCKER_A", ...]], "clusters_this_cascade": [{"symbol": "RAINHA", "size": 6, "payout": 30}] } ], "total_win": 70, "bonus_triggered": false }

8.2 Bonus Response

json { "bonus_id": "BONUS_2026040312", "num_spins": 10, "spins": [ { "spin_num": 1, "grid": [...], "clusters": [...], "cascades": [...], "bombs": [{"pos": [1,2], "multiplier": 10}], "spin_win": 50, "total_multiplier": 10, "spin_total": 500 }, ... ], "total_bonus_win": 3500 }


9. RTP Validation

9.1 Math Testing

```python def validate_rtp(num_spins=50000, target_rtp=0.94): """Testa se RTP observado bate com esperado""" total_in = 0 total_out = 0

for _ in range(num_spins):
    spin = run_spin()
    total_in += spin['bet']
    total_out += spin['payout']

observed_rtp = total_out / total_in
deviation = abs(observed_rtp - target_rtp)

assert deviation < 0.02, \
    f"RTP Deviation: {deviation*100:.2f}%"

print(f"✓ RTP Test: {observed_rtp:.4f}")

```


10. Hardware & Performance

10.1 Mobile Optimization

```csharp // Object Pooling para símbolos public class SymbolPool { private Queue pool = new Queue();

public Symbol Get() => pool.Count > 0 ?
    pool.Dequeue() : new Symbol();

public void Return(Symbol sym) => pool.Enqueue(sym);

}

// Usar Sprite Atlas Texture2D atlas = Resources.Load("sprites/carnival_atlas"); // Evita múltiplas draw calls

// Desabilitar partículas em Low-End if (SystemInfo.systemMemorySize < 2048) { particleSystem.enabled = false; } ```


11. SAS 6.02 Protocol Integration

Eventos reportados: - Machine Cash In/Out - Game Round Results - Bonus Triggered - Feature Buy - Meters Update


12. Debugging Tools

```python

Debug mode: CMD + SHIFT + D

Permite clicar na grade para alterar símbolos

Testa detecção de clusters sem depender da sorte

if DEBUG_MODE: # Visualizar Flood Fill em tempo real draw_flood_fill_visualization()

# Inspector para reel strips
show_reel_inspector()

```


Conclusão

Bloco da Sorte é computacionalmente simples (Flood Fill O(1)) mas exige integração cuidadosa com Pool Finito. O Reverse Cluster Builder é a chave para entregar prêmios precisos.

Data: 2026-04-03 Status: Pronto para Desenvolvimento

Prompts de Geração de Arte IA

Clique em qualquer prompt para copiar. Os prompts abaixo são otimizados para Midjourney v6, DALL-E 3, e Stable Diffusion.

🎨 Cenário Principal
Proporção: 16:9
Professional slot game art, Brazilian street carnival parade, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, celebratory, joyful, festive, cinematic lighting with golden hour sun rays, color palette: carnival rainbow, gold, electric colors, depth of field creating focal point on game area, hyper-realistic textures, trending on ArtStation, Unreal Engine 5 quality, vibrant and saturated colors, --ar 21:9 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🏷️ Logo/Título
Proporção: 16:9
Logo design for "Bloco da Sorte", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from carnival rainbow to gold, intricate decorative borders with carnival blocks motifs, 3D dimensional effect with shadow depth, cinematic lighting, professional branding, high contrast, designed for high-visibility gaming cabinet, --ar 16:9 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎰 Símbolo 1
Proporção: 1:1
Premium game symbol for slot machine, carnival blocks creature highly detailed, photorealistic rendering, vibrant colors emphasizing carnival rainbow, gold, electric colors, centered composition with transparent background, dramatic lighting with golden highlights, intricate feather/fur textures, 3D depth, game-ready asset, --ar 1:1 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎰 Símbolo 2
Proporção: 1:1
Game symbol: dancers, ornate design with carnival rainbow, gold, electric colors color scheme, highly detailed intricate patterns, luxurious appearance, centered on clean background, dimensional shadow effect, professional slot machine graphics, golden accents, --ar 1:1 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎰 Símbolo 3
Proporção: 1:1
Collectible symbol: confetti, sparkling crystal or gem-like appearance, carnival rainbow and gold dominant colors, glowing effect with light rays, highly detailed with reflective surfaces, centered composition, professional gaming asset quality, --ar 1:1 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎰 Símbolo 4
Proporção: 1:1
Bonus trigger symbol, celebration, animated energy radiating from center, multiple layers of glow effects in electric colors, ornate frame decoration, detailed fine art illustration, professional casino game quality, shimmering and ethereal, --ar 1:1 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎰 Símbolo 5
Proporção: 1:1
Premium scatter symbol, luxurious golden coin with street party imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich carnival rainbow, gold, electric colors palette, high-end game graphics, professional quality, --ar 1:1 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🎁 Tela de Bônus
Proporção: 16:9
Bonus round screen for slot game, explosive energy and celebration theme, multiple layers of special effects, carnival rainbow, gold, electric colors dominant colors, dramatic lighting with particle effects, progress bars and multiplier counters visible, luxurious animation frames, cinematic composition, game-ready quality, professional casino graphics, --ar 16:9 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
🖥️ Mockup UI
Proporção: 16:9
Complete game UI mockup for slot machine cabinet, professional layout with reels center stage, carnival rainbow, gold, electric colors theme throughout, game statistics visible (RTP, lines, bet), ornate frame decoration, luxury gaming interface, clear typography, buttons and controls well-positioned, premium aesthetic, high contrast readability, arcade cabinet quality, --ar 16:9 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado
Tela de Carregamento
Proporção: 21:9
Splash art loading screen for slot game, dramatic cinematic scene featuring carnival blocks, intense celebratory, joyful, festive atmosphere, carnival rainbow, gold, electric colors color palette, volumetric lighting effects, large title text with "Bloco da Sorte", game studio logo placement, trending on gaming platforms, highly detailed and professionally rendered, advertisement-quality, --ar 21:9 --quality 2 --style raw
Dica: Use --no 'text, watermark, logo' para melhor resultado