Jogo #20

Código Secreto

Volatilidade
Extrema (Jackpot Código muito raro)
Grid
RTP

Game Design Document (GDD)

Jogo 20 - O Código Secreto

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Referência Zitro: Da Vinci Secret / Codex (Bingo + Puzzle) Desenvolvedor: Oktop.AI - BuildSense Vertical


1. Resumo Executivo

O Código Secreto é um jogo de bingo híbrido que adiciona uma mecânica de puzzle (Cryptex) ao lado das cartelas. Jogadores tentam acertar tanto os padrões de bingo quanto desvendar um código secreto de 6 números. Tema de mistério e aventura.

Classificação


2. Identidade Visual e Atmosfera

Tema

Mistério e Antiguidade - "O Código Perdido" - Referência: Filmes de tesouro (Indiana Jones, National Treasure), criptografia - Estilo: Antigo/Retro com toques de steampunk - Elementos: Livros antigos, códigos, códigos de máquina (Enigma)

Cores Principais

Dourado Envelhecido: #B8860B Marrom Sépia: #704214 Preto Profundo: #0A0A0A Verde Oliva: #6B8E23 Prata Metálica: #C0C0C0

Elementos Visuais

  1. Topo da Tela: Cryptex (cilindro giratório) com 6 anéis
  2. Números do Código: [10], [20], [30], [40], [50], [60] (pre-configurados, aleatórios a cada rodada)
  3. Cartelas: Design antigo (papiro)
  4. Painel de Status: Mostra quantos números do Código já foram descobertos
  5. Animação de Desbloqueio: Quando código é completado, cofre explode/abre

3. Mecânica Core

3.1 Bingo Padrão

3.2 Código Secreto (Side Bet)

Conceito: 6 números aleatórios aparecem no topo da tela (ex: 10, 20, 30, 40, 50, 60). Se esses números aparecerem no sorteio, eles são coletados para desbloquear um bônus.

Visualização: ``` Cryptex Meter (Topo da Tela): ┌─────────────────────────────────────────┐ │ [10] [20] [30] [40] [50] [60] │ │ ✓ ✗ ✗ ✓ ✗ ✗ │ │ 2/6 Números do Código Descobertos │ │ Prêmio Acumulado: R$ 100,00 │ └─────────────────────────────────────────┘

✓ = Coletado ✗ = Faltando ```

Mecânica de Coleta: - Se bola 10 é sorteada → Marca-se na cartela AND no Código - Visual: Símbolo especial pisca no Cryptex - Som: "Ding!" agudo + efeito de traço no papel

Progressão: - 0-3 números: Pequeno prêmio (R$ 20-50) - 4-5 números: Prêmio médio (R$ 100-200) - 6 números: JACKPOT CÓDIGO (R$ 10.000+)


3.3 Bônus Duplo (Combinado)

Cenário 1: Linha Completa ANTES de Código Completo - Jogador ganha prêmio da linha (ex: R$ 100) - Bônus termina - Código retorna a R$ 0 (reset)

Cenário 2: Código Completo ANTES de Linha - Jogador ganha JACKPOT CÓDIGO (R$ 10.000) - Bônus termina - Próxima rodada começa novo código

Cenário 3: Ambos Simultâneos - Prêmio total = Linha + Código - Possibilidade rarísima (extrema volatilidade)


4. Tabela de Pagamentos

Bingo Base (Tradicional)

Padrão Prêmio (Base R$10)
Linha Simples R$ 50,00
Coluna R$ 50,00
Diagonal R$ 75,00
Linha Dupla R$ 100,00
Perímetro R$ 150,00
Bingo Completo R$ 500,00

Código Secreto (Side Bet)

Números Coletados Prêmio
1 número R$ 5,00
2 números R$ 10,00
3 números R$ 25,00
4 números R$ 50,00
5 números R$ 200,00
6 números (COMPLETO) R$ 10.000,00

5. Engenharia de RTP

5.1 Target RTP: 94%

Decomposição: RTP Bingo Base: 80% RTP Código: 12% RTP Cruzamento: 2% Total: 94%

5.2 Volatilidade Extrema do Código

Algoritmo de Liberação:

Se bilhete = R$ 0,00 (Perdedor): - Código aparece com números "inúteis" - Exemplo: Código = [07, 14, 23, 38, 51, 76] - Essas bolas aparecem raramente nas 30 iniciais - Jogador coleta 0-2 números (pequeno prêmio)

Se bilhete = R$ 10.000+ (Jackpot Código): - Código aparece com números "frequentes" - Exemplo: Código = [05, 15, 25, 35, 45, 55] (todos terminados em 5) - Servidor garante que todas as 6 aparecem nas 30 bolas - Jogador coleta todos e ganha JACKPOT


6. Simulação Financeira

Perfil

Projeção Mensal

``` Rodadas/Mês: ~60 Aposta Média: R$ 17,50

Coin-In: R$ 1.050,00

Jackpot Código Entregues: 0-1 por mês (Raridade extrema)

GGR @ 94% RTP: R$ 63,00 ```


7. Áudio Design

7.1 Voz

Ator: Narrador misterioso / aventureiro (Tom épico)

Frases: ``` Código Descoberto: ├─ "NÚMERO ENCONTRADO!" (alerta) ├─ "O CÓDIGO REVELA!" (progressão) └─ "CÓDIGO COMPLETO! TESOURO DESBLOQUEADO!" (épico)

Padrões Bingo: └─ (Padrão do Power Bingo) ```

7.2 SFX

Coleta de Número: "Ding!" + efeito de vidro Código Progresso: "Bzzzzt!" (eletrônico) Código Completo: Sino épico + efeito de explosão Cofre Abrindo: Engrenagem pesada girando (3s) Jackpot: Campainha grandiosa

7.3 Música

Gênero: Orquestra Dramática / Tema de Aventura Tempo: 100 BPM Dinâmica: Aumenta quando Código progride


8. Conformidade Lottopar

8.1 Aposta Lateral (Side Bet)

8.2 Mensagens

ANTES DE COMEÇAR: "Este jogo inclui duas mecânicas de ganho: 1. Padrões de Bingo (cartelas) 2. Código Secreto (números no topo) Ganhe em ambos para maximizar seu prêmio!"


9. Especificações Técnicas (Resumo)

9.1 Plataforma

9.2 Componentes Críticos


10. Notas de Implementação

  1. Ordem de Geração (Critical): Gerar BOLAS primeiro, depois CARTELAS que não conflitem
  2. Código Secreto: Pré-definir 6 números ANTES de gerar as 30 bolas
  3. Dual Constraint: Impossível ter os 6 números do Código completando BINGO por acaso

Versão

v1.0 - 2026-04-03 Autor: BuildSense / Oktop.AI Status: Pronto para Prototipagem

Technical Design Document (TDD)

Jogo 20 - O Código Secreto

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Arquitetura: Pool Finito + Dual Constraint Solver


1. Visão Geral Técnica

O Código Secreto implementa o mais complexo algoritmo deste portfólio: Um Constraint Solver duplo que valida simultaneamente: 1. Padrões de Bingo nas 4 cartelas 2. Coleta de 6 números específicos (Código)

A inovação: As bolas são geradas PRIMEIRO, as cartelas DEPOIS (oposto dos outros jogos).


2. Estrutura de Bilhete

```json { "ticket_id": "TKT-20-20260403-001", "bingo_prize": 100, "code_prize": 0, "total_prize": 100,

"winning_cartela": 2, "winning_bingo_pattern": "SINGLE_LINE",

"code_numbers": [05, 15, 25, 35, 45, 55], "code_completion": false,

"drawn_balls": [05, 15, 25, 12, 33, 35, 18, 41, 27, 45, ...], "total_balls_to_draw": 30,

"constraint_metadata": { "cartela_1_must_not_match": ["BINGO", "PERIMETER"], "cartela_2_partial_marks": 4, // Vai marcar 4 para chegar a linha depois "cartela_3_safe_numbers": [...] } } ```


3. Algoritmo de Construção (Reverse Builder)

3.1 Fluxo Crítico: Bolas Primeiro, Cartelas Depois

``` ENTRADA: - Bilhete: Bingo Prize = R$ 100 (Linha), Code Prize = R$ 0 (Não completo)

PASSO 1: Definir Código Secreto ├─ Código = [05, 15, 25, 35, 45, 55] │ (Números que podem ser sorteados ou não, dependendo do prêmio de Código) └─ Se Code Prize = R$ 0 → Código aparecerá em ~3 das 30 bolas (por acaso)

PASSO 2: Gerar as 30 Bolas (ANTES das Cartelas!) ├─ Incluir obrigatoriamente: alguns números do Código (se pagando) ├─ Distribuição: [05, 15, 25, 12, 33, 35, 18, 41, 27, 45, ...] └─ Total: 30 bolas ordenadas

PASSO 3: Gerar Cartelas (AGORA, com Constraint) ├─ Preencher Cartela 1: Números aleatórios que NÃO completam bingo ├─ Preencher Cartela 2: Números que completarão exatamente 1 linha ├─ Preencher Cartela 3: Números aleatórios ├─ Preencher Cartela 4: Números aleatórios └─ Validação: Com as 30 bolas, apenas Cartela 2 completa padrão (e Cartelas 1, 3, 4 NÃO completam Bingo acidentalmente)

PASSO 4: Validação Final ├─ Rodar simulação: Sortear as 30 bolas ├─ Verificar Código: Quantos dos 6 foram coletados? (Deve ser 3) ├─ Verificar Bingo: Qual padrão completado? (Deve ser Linha em Cartela 2) └─ Se validação falhar: RETRY com diferentes números de cartela ```


3.2 Código C# - Dual Constraint Solver

```csharp public class DualConstraintSolver { private List drawnBalls = new(); private int[][] cartelas = new int[4][]; private List codeNumbers; private decimal targetBingoPrize; private decimal targetCodePrize;

public BingoConfiguration BuildConfigurationReverseMode(
    List<int> codeNumbers,
    decimal bingoPrize,
    decimal codePrize,
    int maxRetries = 100)
{
    this.codeNumbers = codeNumbers;
    this.targetBingoPrize = bingoPrize;
    this.targetCodePrize = codePrize;

    // PASSO 1: Gerar bolas (com ou sem números do código)
    drawnBalls = GenerateDrawnBalls(codeNumbers, codePrize);

    // PASSO 2: Tentar gerar cartelas válidas
    int retryCount = 0;
    while (retryCount < maxRetries)
    {
        cartelas = GenerateCartelasAroundBalls(codeNumbers, bingoPrize);

        // Validar
        if (ValidateConfiguration())
        {
            return new BingoConfiguration
            {
                DrawnBalls = drawnBalls,
                Cartelas = cartelas,
                CodeNumbers = codeNumbers,
                ValidBingo = true,
                ValidCode = (codePrize > 0)
            };
        }

        retryCount++;
    }

    // FALLBACK: Se não conseguir, usar configuração padrão
    return GenerateDefaultConfiguration();
}

private List<int> GenerateDrawnBalls(List<int> codeNumbers, decimal codePrize)
{
    var balls = new List<int>();

    if (codePrize > 0)
    {
        // Se código vai ser completo, incluir TODOS os números do código
        balls.AddRange(codeNumbers);
    }
    else
    {
        // Se código não completa, incluir ~50% dos números (aleatório)
        var random = new Random();
        var codeSubset = codeNumbers
            .Where(x => random.Next(0, 2) == 0)
            .ToList();
        balls.AddRange(codeSubset);
    }

    // Preencher com números aleatórios
    var usedNumbers = new HashSet<int>(balls);
    while (balls.Count < 30)
    {
        int randomBall = new Random().Next(1, 91);
        if (!usedNumbers.Contains(randomBall))
        {
            balls.Add(randomBall);
            usedNumbers.Add(randomBall);
        }
    }

    // Embaralhar (parecer aleatório)
    Fisher_YatesShuffle(balls);
    return balls;
}

private int[][] GenerateCartelasAroundBalls(List<int> codeNumbers, decimal bingoPrize)
{
    var cartelas = new int[4][];
    int winningCartelaIndex = new Random().Next(0, 4);

    for (int i = 0; i < 4; i++)
    {
        if (i == winningCartelaIndex)
        {
            // Esta cartela vai ganhar
            cartelas[i] = GenerateWinningCartela(bingoPrize);
        }
        else
        {
            // Cartelas perdedoras
            cartelas[i] = GenerateNonWinningCartela();
        }
    }

    return cartelas;
}

private int[] GenerateWinningCartela(decimal bingoPrize)
{
    // Gerar cartela que completa padrão com as 30 bolas sorteadas
    var cartela = new int[15];
    var random = new Random();

    // Determinar quantos números da bola já são suficientes para ganhar
    int patternLength = GetPatternLength(bingoPrize);
    var necessaryNumbers = drawnBalls.Take(patternLength).ToList();

    // Preencher cartela com os números necessários
    for (int i = 0; i < necessaryNumbers.Count; i++)
    {
        cartela[i] = necessaryNumbers[i];
    }

    // Preencher resto com números aleatórios
    for (int i = necessaryNumbers.Count; i < 15; i++)
    {
        int randomNum = random.Next(1, 91);
        while (cartela.Contains(randomNum) || drawnBalls.Contains(randomNum))
        {
            randomNum = random.Next(1, 91);
        }
        cartela[i] = randomNum;
    }

    Fisher_YatesShuffle(cartela);
    return cartela;
}

private int[] GenerateNonWinningCartela()
{
    // Cartela que NÃO completa nenhum prêmio com as 30 bolas
    var cartela = new int[15];
    var random = new Random();

    for (int i = 0; i < 15; i++)
    {
        int randomNum = random.Next(1, 91);

        // CRITÉRIO: Número NÃO deve estar entre as 30 bolas sorteadas
        // (A menos que combinado com outros, não cause vitória)
        while (drawnBalls.Contains(randomNum) || cartela.Contains(randomNum))
        {
            randomNum = random.Next(1, 91);
        }

        cartela[i] = randomNum;
    }

    Fisher_YatesShuffle(cartela);
    return cartela;
}

private bool ValidateConfiguration()
{
    // Simulação de sorteio
    int codeCollected = 0;
    BingoPattern bingoResult = BingoPattern.NONE;

    foreach (int ball in drawnBalls)
    {
        // Contar código
        if (codeNumbers.Contains(ball))
        {
            codeCollected++;
        }

        // Verificar bingo
        foreach (int cartelaIndex = 0; cartelaIndex < 4; cartelaIndex++)
        {
            var pattern = CheckPattern(cartelas[cartelaIndex], drawnBalls);
            if (pattern != BingoPattern.NONE && cartelaIndex != 0) // Cartela 0 não deve ganhar
            {
                bingoResult = pattern;
                break;
            }
        }
    }

    // Validar
    bool codeValid = (targetCodePrize == 0 && codeCollected < 6)
                  || (targetCodePrize > 0 && codeCollected == 6);

    bool bingoValid = bingoResult != BingoPattern.NONE;

    return codeValid && bingoValid;
}

} ```


4. Detecção Dual (Bingo + Código)

```csharp public class DualGameEventDetector { public class GameResult { public BingoPattern BingoPattern; public int CodeNumbersCollected; public decimal BingoPrize; public decimal CodePrize; public decimal TotalPrize; }

public GameResult DetectResult(List<int> drawnBalls, List<int> codeNumbers)
{
    // Conta código simultâneo com bingo
    int codeCount = drawnBalls.Intersect(codeNumbers).Count();

    // Detecta padrão de bingo (como sempre)
    var bingoPattern = patternDetector.CheckPattern(drawnBalls);

    return new GameResult
    {
        BingoPattern = bingoPattern,
        CodeNumbersCollected = codeCount,
        BingoPrize = GetBingoPrize(bingoPattern),
        CodePrize = GetCodePrize(codeCount),
        TotalPrize = GetBingoPrize(bingoPattern) + GetCodePrize(codeCount)
    };
}

private decimal GetCodePrize(int numbersCollected)
{
    return numbersCollected switch
    {
        6 => 10000m,  // JACKPOT
        5 => 200m,
        4 => 50m,
        3 => 25m,
        2 => 10m,
        1 => 5m,
        _ => 0m
    };
}

} ```


5. Animação do Cryptex

```csharp public class CryptexAnimator : MonoBehaviour { public void RevealCodeNumber(int numberIndex, bool isCollected) { if (isCollected) { // Girar anel para mostrar número StartCoroutine(RotateCryptexRing( ringIndex: numberIndex, angle: 360f, duration: 0.8f, easeFunction: EaseOutQuad));

        // Som
        audioManager.Play("code_reveal.wav");

        // Efeito de luz
        CryptexRings[numberIndex].GetComponent<Light>().Intensity = 1.5f;
    }
}

public void CompleteCode()
{
    // Todos os 6 anéis completados
    StartCoroutine(OpenSafe());
}

private IEnumerator OpenSafe()
{
    // Sequência épica
    audioManager.Play("safe_opening.wav");

    // Rotação de todos os anéis simultaneamente
    for (int i = 0; i < 6; i++)
    {
        StartCoroutine(RotateCryptexRing(i, 720f, 2.0f, EaseOutBounce));
        yield return new WaitForSeconds(0.1f);
    }

    yield return new WaitForSeconds(2.5f);

    // Explosão/Abertura
    particleSystem.Play();
    cameraShake.Shake(duration: 0.5f, intensity: 0.3f);
}

} ```


6. Banco de Dados

```sql CREATE TABLE code_secret_rounds ( code_round_id INTEGER PRIMARY KEY AUTOINCREMENT, round_id INTEGER NOT NULL,

code_numbers TEXT, -- JSON [5, 15, 25, 35, 45, 55]
code_numbers_collected INT DEFAULT 0,
code_prize DECIMAL(10, 2) DEFAULT 0,

bingo_pattern VARCHAR(50),
bingo_prize DECIMAL(10, 2),

total_prize DECIMAL(10, 2),

timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (round_id) REFERENCES game_rounds(round_id)

); ```


7. Performance

``` Constraint Solver Retries: Máx 100 CPU per Configuration Build: ~5 ms Total Config Time: < 50 ms

Runtime per round: ├─ Ball drawing: 1 ms ├─ Code detection: 0.5 ms ├─ Bingo detection: 1.5 ms └─ Total: < 5 ms ```


8. Testes QA

Teste Entrada Esperado Critério
T001 Código completo 6/6 coletados Jackpot pago
T002 Bingo + Código Ambos Total correto
T003 Cartela 1-3 safe Sem vitória Validação 100%
T004 Dual constraint Nenhum conflito Loop 0 falsos
T005 RTP final 1M rodadas 94% ± 1%

Versão

v1.0 - 2026-04-03 Arquiteto: Algorithm/Backend - Oktop.AI Status: Pronto para Implementação

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, Spy thriller digital realm, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, mysterious, secretive, coded, cinematic lighting with golden hour sun rays, color palette: dark blue, electric green, metallic gray, 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 "Código Secreto", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from dark blue to electric green, intricate decorative borders with binary code 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, binary code creature highly detailed, photorealistic rendering, vibrant colors emphasizing dark blue, electric green, metallic gray, 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: spy theme, ornate design with dark blue, electric green, metallic gray 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: secret symbols, sparkling crystal or gem-like appearance, dark blue and electric green 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, locks, animated energy radiating from center, multiple layers of glow effects in metallic gray, 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 digital matrix imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich dark blue, electric green, metallic gray 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, dark blue, electric green, metallic gray 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, dark blue, electric green, metallic gray 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 binary code, intense mysterious, secretive, coded atmosphere, dark blue, electric green, metallic gray color palette, volumetric lighting effects, large title text with "Código Secreto", 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