Jogo #17

Dragão da Fortuna

Volatilidade
Extrema (Jackpots raros mas altos)
Grid
RTP

Game Design Document (GDD)

Jogo 17 - Dragão da Fortuna

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Referência Zitro: Dragon Lamp / Dragon Link (Hold & Spin com Expansão) Desenvolvedor: Oktop.AI - BuildSense Vertical


1. Resumo Executivo

Dragão da Fortuna é um jogo de bingo intermediário com mecânica Hold & Spin (Link), combinando a familiareidade do bingo com a tensão de um slot progressivo. Jogadores acumulam símbolos especiais ("Orbes de Fogo") para desbloquear um bônus de alta volatilidade com tela cheia.

Classificação


2. Identidade Visual e Atmosfera

Tema

Dragão Mitológico Asiático - "A Fortuna do Oriente" - Referência: Imigração asiática no Paraná (forte presença nipônica + tailandesa) - Cores Predominantes: Vermelho Brilhante, Dourado, Preto Profundo, Verde Jade - Elementos: Lanternas de papel, dragões estilizados, moedas de ouro, fumaça de incenso

Elementos Visuais Principais

  1. Fundo: Templo oriental ao anoitecer. Lanternas acesas balançam suavemente. Fumaça vermelha/azul sobe dos incensários.
  2. Cartelas: Apresentadas em estilo "tecelado" (borda dourada, padrão de madeira). Números em estilo caligráfico (fonte semi-serif).
  3. Orbes de Fogo: 6 esferas resplandecentes na barra superior da tela. Cada uma tem um dragão miniatura dentro que gira.
  4. Painel de Bônus: Quando Link é acionado, explode para uma tela de "Tela Cheia" com posições para 15 esferas.

Paleta de Cores

Vermelho Brilhante: #FF3333 Dourado: #FFD700 Preto: #1A1A1A Verde Jade: #00AA66 Azul Noturno: #001A4D


3. Mecânica Core

3.1 Estrutura Base (Bingo Clássico)

Cartelas Ativas: - 4 Cartelas Simultâneas - Formato: Grade 5×3 (15 números cada) - Universo: 90 bolas

Sorteio Inicial: - 30 bolas em 5 segundos (mais lento que Power Bingo para tensão narrativa) - Padrão-alvo: Qualquer linha (Linha Simples)

3.2 Mecânica de "Bola de Fogo" (Link Trigger)

Conceito: Além dos números normais, cada bola pode ser uma "Bola de Fogo" (~15% das 90 bolas = ~13-15 bolas de fogo no universo).

Comportamento Duplo: 1. Funcionalidade 1 (Bingo): A Bola de Fogo marca um número normal na cartela 2. Funcionalidade 2 (Link): Simultaneamente, adiciona uma Esfera à barra superior

Progresso para Link Bonus: - Necessário: 6 Bolas de Fogo coletadas - Cada coleta anima: Uma esfera nova aparece na barra superior e é preenchida - Som: Grito de dragão suave ("Shhhhiiiii!") a cada esfera

Mecanismo de Tensão: Quando o jogador coleta a 5ª esfera, a música muda para tom mais agudo. Na 6ª esfera, toda a tela pisca em vermelho e o dragão voa em volta das cartelas.


3.3 Hold & Spin Progressivo (Dragon Link Bonus)

3.3.1 Trigger Automático

Quando 6 Bolas de Fogo são coletadas → LINK BONUS ATIVADO A tela transiciona para o modo Link automaticamente (sem necessidade de clique).

3.3.2 Layout da Tela Link

Grade de 15 Posições (Link Spin): ``` ┌─────────────────────────────┐ │ [⬜] [⬜] [⬜] [⬜] [⬜] │ │ [⬜] [⬜] [⬜] [⬜] [⬜] │ │ [⬜] [⬜] [⬜] [⬜] [⬜] │ └─────────────────────────────┘

Quadrados = Posições vazias A cada respin, 1-3 esferas caem aleatoriamente ```

Contador de Respins: 3 respins iniciais (pode ser incrementado)

3.3.3 Mecânica de Respin

Ciclo de Respin: 1. 3 posições aleatórias na grade são preenchidas com Esferas 2. Cada Esfera revela um prêmio ou modificador: - Prêmio em Dinheiro: R$ 50, R$ 100, R$ 250, R$ 500 - Multiplicador: 2x, 3x, 5x (aplicado ao total acumulado) - Respin Extra: +1 respin adicional - Tela Cheia: Todas as 15 posições são preenchidas = GRAND JACKPOT

  1. Animar queda de esferas (som de vidro tocando vidro)
  2. Ao preencher linha completa (5 esferas horizontais), som de alerta

Condição de Encerramento: - Nenhuma nova esfera em um respin → Bônus encerra - Tela cheia (15 esferas) → JACKPOT MÁXIMO - Respins zerados → Bônus encerra

3.3.4 Exemplo de Sequência

``` Estado Inicial: 3 respins, 0 esferas na grade

Respin 1: Posições preenchidas: [0, 5, 10] (canto superior-esq, meio, canto inferior-dir) Valores: 100, 2x, 50 Acumulado: R$ 150 (com multiplicador pendente) Respins restantes: 2

Respin 2: Posições preenchidas: [1, 7, 14] Valores: 3x, 250, Respin Extra Acumulado: R$ 150 (anterior) + 250 = R$ 400 Aplicar 2x (do respin anterior): R$ 400 × 2 = R$ 800 Respins restantes: 2 + 1 = 3

Respin 3: Posições preenchidas: [2, 6, 11] Valores: 500, 5x, 100 Acumulado: R$ 800 + 500 + 100 = R$ 1400 Aplicar 3x: R$ 1400 × 3 = R$ 4200 Respins restantes: 2

Respin 4: Posições preenchidas: NENHUMA Bônus Encerra Total Ganho: R$ 4200 ```


3.4 Animação do Dragão

Elemento Narrativo: Durante todo o bônus Link, um dragão 3D voa em volta da tela: - Fase 1: Voo lento, expectativa - Fase 2 (Respin Extra): Voo mais rápido, aceleração - Fase 3 (Tela Cheia Próxima): Voo frenético, giro em torno da grade - Fase 4 (Tela Cheia Acionada): Dragão SOLTA FOGO (animação de chamas amarelas/vermelhas)

Som de fundo: Orquestra oriental épica (flautas, gongos)


4. Tabela de Pagamentos

Bingo Base (Antes do Link)

Padrão Multiplicador Prêmio (Base R$10)
Linha Simples 20x R$ 200,00
Linha Dupla 50x R$ 500,00
Perímetro 150x R$ 1.500,00
Bingo Completo 500x R$ 5.000,00

Link Bonus (Adicional)

Evento Prêmio
6 Bolas de Fogo Coletadas Entrada no Link
Tela Cheia (15 esferas) R$ 10.000,00 + 5x multiplicador
10 esferas + Respin Extra R$ 2.000,00 base

5. Engenharia de RTP

5.1 Target RTP: 95%

Decomposição: RTP Jogo Base (Bingo): 78% RTP Link Bonus: 15% RTP Efeito de Cascata: 2% Total: 95%

5.2 Volatilidade Controlada

Algoritmo de Entrega do Link: Se o bilhete do Pool = R$ 0,00 (Perdedor): - As 6 Bolas de Fogo aparecem lentamente (após as 30 iniciais) - Quando Link é acionado, o algoritmo distribui valores pequenos (R$ 50 + R$ 100 + Respin Extra) - Respins são "ricos em multiplicadores vazios" (3x, 2x sem prêmios combinados)

Se o bilhete do Pool = R$ 5.000,00+ (JACKPOT): - Bolas de Fogo aparecem mais cedo (dentro das 30 iniciais) - Link já entra com 2-3 esferas pré-colocadas (animação de "queda rápida") - Respins entregam valores grandes (R$ 500, R$ 1000, Tela Cheia)


6. Simulação Financeira (30 Dias)

Perfil de Jogador

Métricas Operacionais

Duração do Sorteio: 5.0 segundos Duração do Link Bonus: ~2 minutos (média) Ciclo Completo: 7-10 minutos (com bônus eventual) Sessões por Mês: 8-10 Rodadas por Sessão: 20 (se sem bônus) ou 5 (se com bônus) Total Rodadas/Mês: ~150 rodadas normais + 10 bônus

Projeção Mensal

``` Rotação Esperada: R$ 3.000,00 (150 × R$ 20) Bônus Entregues: R$ 2.000,00 (10 Link × R$ 200 avg)

TOTAL COIN-IN: R$ 5.000,00

GGR (Gross Gaming Revenue) @ 95% RTP: ├─ GGR = Coin-In × (1 - RTP) ├─ GGR = 5.000 × 0.05 └─ GGR MENSAL: R$ 250,00

Nota: Este jogo é LOW VOLUME em relação a Power Bingo, mas ALTO VALOR MÉDIO POR SESSÃO (maior variância). ```


7. Áudio Design

7.1 Voz Narrador

Ator: Homem adulto com sotaque oriental leve (tom misterioso e épico)

Frases: ``` Bingo Base: ├─ "LINHA PRONTA!" (tom moderado) ├─ "BOLA DE FOGO!" (tom elevado) └─ "PRIMEIRA ESFERA! CONTINUA!" (entusiasmado)

Link Bonus: ├─ "SEIS ESFERAS! LINK ATIVADO!" (grito épico) ├─ "NOVO RESPIN!" (tom resoluto) ├─ "MULTIPLICADOR ATIVO!" (tom épico) └─ "TELA CHEIA! GRAND JACKPOT!" (grito máximo) ```

7.2 Efeitos Sonoros

Bola de Fogo: "Zzzzzzzzzt!" (som elétrico) Esfera Preenchida: "Ding!" (nota Ré agudo) Respin Disparo: "Whoooosh!" + ar comprimido Multiplicador Ativo: "Viiiiim!" (ascensão tonal) Dragão Grita: "SHHHHHIIIIIII!" (grito épico) Tela Cheia: Gongo gigante (5 segundos de ressonância)

7.3 Música de Fundo

Gênero: Orquestra Oriental (Instrumentos: Shamisen, Flauta Shakuhachi, Gongos) Tempo: 90 BPM Dinâmica: Aumenta gradualmente conforme esferas são coletadas


8. Conformidade Lottopar

8.1 Licença e Requisitos

8.2 Mensagens Obrigatórias

``` ANTES DO BÔNUS LINK: "Você entrou em um bônus com alto risco. Seus ganhos podem ser multiplicados por 5x ou zerarem. Quer continuar?"

PÓS-TELA CHEIA: "Parabéns! Você atingiu o Grand Jackpot!" ```

8.3 Limite de Sessão


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

9.1 Plataforma

9.2 Integração


10. Notas de Implementação

  1. Constraint Solver Estendido: Deve validar que as 6 Bolas de Fogo necessárias não criam conflitos com outras cartelas.
  2. State Machine para Link: Implementar transição suave entre "Bingo Mode" e "Link Mode".
  3. Animação do Dragão: Usar Animator e Timeline para controlar precisamente. Sincronizar som de fundo.

Versão

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

Technical Design Document (TDD)

Jogo 17 - Dragão da Fortuna

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Arquitetura: Pool Finito + State Machine (Link Mode)


1. Visão Geral Técnica

Dragão da Fortuna usa uma arquitetura dual-mode: - Modo 1 (Base): Bingo clássico de 30 bolas - Modo 2 (Link): Slot-like de 15 posições com respins

A transição entre modos é acionada por um evento (6 Bolas de Fogo coletadas) que é pré-decidido pelo bilhete do Pool.


2. Estado de Bilhete Estendido

json { "ticket_id": "TKT-17-20260403-001", "base_mode": { "prize_tier": "LINK_TRIGGER", "prize_amount": 0, "winning_cartela": 2, "winning_pattern": "LINK_BONUS_ENTRY" }, "link_mode": { "enabled": true, "initial_spheres": 6, "respins": 3, "grid_configuration": [ { "position": 0, "value": 100, "type": "MONEY" }, { "position": 5, "value": 2, "type": "MULTIPLIER" }, { "position": 10, "value": 50, "type": "MONEY" }, { "position": 1, "value": 3, "type": "MULTIPLIER" }, { "position": 7, "value": 250, "type": "MONEY" }, { "position": 14, "value": null, "type": "EMPTY" } ], "final_total": 4200, "multiplier_chain": [2, 3, 5] }, "fire_balls_required": [12, 25, 33, 41, 58, 71] }


3. Algoritmo de Engenharia Reversa (Link Edition)

3.1 Cenário: JACKPOT Grande (R$ 10.000,00)

``` Entrada: - Bilhete: Prize = R$ 10.000,00 - Trigger: Tela Cheia no Link (15 esferas preenchidas)

Execução Backend:

  1. Definir Objetivo do Link: LINK_TARGET = FULL_GRID (15 esferas) TOTAL_WIN = 10.000

  2. Construir Sequência de Respins (Reverse): Preciso entregar R$ 10.000 em 3 respins máximo.

Respins = [ { spheres: 3, values: [100, 2x, 50], subtotal: 150 }, { spheres: 3, values: [3x, 250, +1respin], subtotal: 400 × 2 = 800 }, { spheres: 3, values: [500, 5x, 100], subtotal: 1400 × 3 = 4200 }, { spheres: 6, values: [multiplos], subtotal: (10000 - 4200) / 6 ≈ 967 cada } ]

  1. Definir Bolas de Fogo Necessárias (Base Mode): FIRE_BALLS_REQUIRED = 6 (fixo) Distribuí-las nas 30 bolas iniciais para garantir Link Trigger

  2. Validação de Constraint: As 6 Bolas de Fogo não devem acidentalmente completar um BINGO (verifica contra padrões de todas as 4 cartelas)

  3. Renderização: Cliente recebe: FIRE_BALLS_REQUIRED = [12, 25, 33, 41, 58, 71] Cliente renderiza Bingo Mode até as 6 esferas Transição automática para Link Mode Cliente renderiza respins conforme sequência pré-definida ```

3.2 Código C# - Reverse Link Builder

```csharp public class LinkBonusReverseBuilder { public LinkBonusConfiguration BuildLinkBonusFromTicket( decimal targetWin, int maxRespins = 3) { // Passo 1: Determinar número de esferas necessárias int spheresToPlace = DetermineSpheresToPlace(targetWin); // Exemplo: R$ 10.000 → 15 esferas (FULL GRID)

    // Passo 2: Construir sequência de respins
    var respinSequences = BuildRespinSequence(
        targetWin: targetWin,
        maxRespins: maxRespins,
        targetSpheres: spheresToPlace);

    // Passo 3: Distribuir valores entre respins
    var gridValues = DistributeValuesAcrossGrid(
        totalWin: targetWin,
        respins: respinSequences);

    // Passo 4: Gerar números de Bolas de Fogo para Base Mode
    var fireBalls = GenerateFireBallNumbers(count: 6);

    return new LinkBonusConfiguration
    {
        TotalTargetWin = targetWin,
        GridSpheres = spheresToPlace,
        Respins = respinSequences,
        GridValues = gridValues,
        FireBallsForBaseMode = fireBalls,
        MultiplicatorChain = CalculateMultipliers(respinSequences)
    };
}

private int DetermineSpheresToPlace(decimal targetWin)
{
    // Lógica: Jackpots altos = tela cheia (15)
    // Prêmios médios = 10-12 esferas
    // Pequenos = 5-8 esferas

    if (targetWin >= 5000m) return 15; // FULL GRID
    if (targetWin >= 2000m) return 12;
    if (targetWin >= 1000m) return 10;
    if (targetWin >= 500m) return 8;
    return 6; // Mínimo para triggar Link
}

private List<RespinSequence> BuildRespinSequence(
    decimal targetWin,
    int maxRespins,
    int targetSpheres)
{
    var respins = new List<RespinSequence>();

    // Distribuir esferas entre respins
    int spheresPerRespin = targetSpheres / maxRespins;
    int remainder = targetSpheres % maxRespins;

    for (int i = 0; i < maxRespins; i++)
    {
        int spheresThisRespin = spheresPerRespin + (i < remainder ? 1 : 0);

        respins.Add(new RespinSequence
        {
            RespinIndex = i + 1,
            SpheresToPlace = spheresThisRespin,
            Values = GenerateValuesForRespin(targetWin / maxRespins)
        });
    }

    return respins;
}

private List<SphereValue> DistributeValuesAcrossGrid(
    decimal totalWin,
    List<RespinSequence> respins)
{
    var gridValues = new List<SphereValue>();
    decimal accumulatedValue = 0m;
    var multipliers = new List<int> { 1 };

    foreach (var respin in respins)
    {
        foreach (var value in respin.Values)
        {
            if (value.Type == "MULTIPLIER")
            {
                multipliers.Add(value.MultiplierValue);
            }
            else if (value.Type == "MONEY")
            {
                accumulatedValue += value.MoneyAmount;
                // Aplicar multiplicador do respin anterior
                if (multipliers.Count > 1)
                {
                    value.MoneyAmount *= multipliers.Last();
                }
            }

            gridValues.Add(value);
        }
    }

    // Ajustar último valor para garantir total exato
    if (accumulatedValue != totalWin)
    {
        decimal adjustment = totalWin - accumulatedValue;
        gridValues.Last().MoneyAmount += adjustment;
    }

    return gridValues;
}

private List<int> GenerateFireBallNumbers(int count)
{
    var fireBalls = new List<int>();
    var random = new Random();

    while (fireBalls.Count < count)
    {
        int num = random.Next(1, 91);
        if (!fireBalls.Contains(num))
        {
            fireBalls.Add(num);
        }
    }

    return fireBalls;
}

} ```


4. State Machine para Link Mode

```csharp public enum LinkGameState { WAITING_FOR_FIRE_BALLS, FIRE_BALL_COLLECTED, LINK_ACTIVATED, RESPIN_ROLLING, RESPIN_COMPLETE, CHECKING_GRID, LINK_ENDED, FULL_GRID_ACHIEVED }

public class LinkStateMachine { private LinkGameState currentState = LinkGameState.WAITING_FOR_FIRE_BALLS; private int fireballsCollected = 0; private int currentRespin = 0; private List revealedSpheres = new();

public void OnFireballDetected()
{
    fireballsCollected++;
    currentState = LinkGameState.FIRE_BALL_COLLECTED;

    if (fireballsCollected == 6)
    {
        currentState = LinkGameState.LINK_ACTIVATED;
        TransitionToLinkMode();
    }
}

public void OnRespinComplete()
{
    currentRespin++;
    currentState = LinkGameState.RESPIN_COMPLETE;

    if (revealedSpheres.Count == 15)
    {
        currentState = LinkGameState.FULL_GRID_ACHIEVED;
        PlayGrandJackpotAnimation();
    }
    else if (currentRespin >= maxRespins)
    {
        currentState = LinkGameState.LINK_ENDED;
        EndLinkBonus();
    }
    else
    {
        currentState = LinkGameState.RESPIN_ROLLING;
    }
}

private void TransitionToLinkMode()
{
    // Pausar renderização de Bingo
    // Mostrar tela de transição (dragão voando)
    // Ativar grid de 15 posições
    // Iniciar primeiro respin automaticamente
}

private void PlayGrandJackpotAnimation()
{
    // Dragão solta fogo
    // Esferas brilham
    // Áudio épico
    // Confetti
}

} ```


5. Sincronização de Respins com Pool Finito

5.1 Problema: "Entrega de Esferas"

O desafio é que o cliente não pode "saber" quais esferas vão aparecer até que as revelar. Mas o servidor já decidiu o padrão (Reverse Builder).

Solução: O cliente solicita cada respin como um "Mini-Ticket" do Pool.

```csharp public class RespinTicketSystem { public async Task RequestNextRespin( string linkSessionId, int respinNumber) { // Cliente envia requisição var request = new RespinRequest { LinkSessionId = linkSessionId, RespinNumber = respinNumber, CurrentSphereCount = currentSphereCount, ExpectedPattern = expectedGridPattern // Para validação };

    // Servidor retorna dados pré-decididos
    var respinTicket = await LottoparServer.GetRespinTicket(request);

    // respinTicket contém:
    // - SpherePositions: [0, 5, 10] (onde colocar)
    // - SphereValues: [100, 2x, 50] (valores revelar)
    // - MultiplierApplied: 2 (de respin anterior)

    return RevealSpheres(respinTicket);
}

private RespinResult RevealSpheres(RespinTicket ticket)
{
    // Animar queda de esferas nos positions específicos
    var animationSequence = new List<SphereAnimation>();

    for (int i = 0; i < ticket.SpherePositions.Count; i++)
    {
        animationSequence.Add(new SphereAnimation
        {
            Position = ticket.SpherePositions[i],
            DropDuration = 0.5f,
            Value = ticket.SphereValues[i],
            DelayBetweenSpheres = 0.3f
        });
    }

    return new RespinResult
    {
        Animations = animationSequence,
        AccumulatedValue = ticket.FinalTotal,
        RespinsRemaining = ticket.RespinsRemaining
    };
}

} ```

5.2 Validação de Integridade

```csharp public class LinkIntegrityValidator { public bool ValidateRespinSequence( List completedRespins, LinkBonusConfiguration expectedConfig) { // Verificação 1: Total de esferas int totalSpheres = completedRespins.Sum(r => r.SpheresPlaced); if (totalSpheres > expectedConfig.GridSpheres + 1) { // ERRO: Muitas esferas colocadas LogSecurityAlert("LINK_INTEGRITY_VIOLATION: Too many spheres"); return false; }

    // Verificação 2: Valor acumulado
    decimal accumulatedValue = 0m;
    foreach (var respin in completedRespins)
    {
        accumulatedValue = (accumulatedValue + respin.SumOfValues)
                           * respin.AppliedMultiplier;
    }

    decimal tolerance = expectedConfig.TotalTargetWin * 0.02m; // ±2%
    if (Math.Abs(accumulatedValue - expectedConfig.TotalTargetWin) > tolerance)
    {
        LogSecurityAlert("LINK_INTEGRITY_VIOLATION: Invalid accumulated value");
        return false;
    }

    return true;
}

} ```


6. Detecção de Eventos Críticos

6.1 Eventos que Geram Logs Obrigatórios

```csharp public class LinkEventLogger { public void LogFireballCollected(int ballNumber, int totalCollected) { AuditLog.Record(new { event_type = "FIREBALL_COLLECTED", ball_number = ballNumber, total_collected = totalCollected, progress_percentage = (totalCollected / 6f) * 100, timestamp = DateTime.UtcNow, session_id = CurrentSession.Id }); }

public void LogLinkActivated()
{
    AuditLog.Record(new
    {
        event_type = "LINK_BONUS_ACTIVATED",
        timestamp = DateTime.UtcNow,
        expected_final_win = LinkConfig.TotalTargetWin
    });
}

public void LogRespinComplete(int respinNumber, decimal accumulatedValue)
{
    AuditLog.Record(new
    {
        event_type = "RESPIN_COMPLETE",
        respin_number = respinNumber,
        accumulated_value = accumulatedValue,
        timestamp = DateTime.UtcNow
    });
}

public void LogLinkEnded(decimal finalWin, string reason)
{
    AuditLog.Record(new
    {
        event_type = "LINK_ENDED",
        final_win = finalWin,
        reason = reason, // "NO_MORE_RESPINS" | "FULL_GRID" | "NO_NEW_SPHERES"
        timestamp = DateTime.UtcNow
    });
}

} ```


7. Performance e Otimização

7.1 Animação do Dragão (GPU-Instanced)

```hlsl // Vertex Shader para Dragão

pragma vertex vert

pragma fragment frag

sampler2D _MainTex; float4x4 _DragoonTransform;

v2f vert(appdata v) { v2f o; // Aplicar rotação do dragão ao redor da cena float angle = _Time.y * 2.0; float4x4 rotMatrix = createRotationMatrix(angle);

o.vertex = mul(rotMatrix, v.vertex);
o.uv = v.texcoord;
return o;

}

fixed4 frag(v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ```

7.2 Profiling Target

Frame Time: 16.67 ms (60 FPS) ├─ Rendering: 8 ms ├─ Link State Machine: 2 ms ├─ Audio (Dragão): 1.5 ms ├─ Reserve: 5 ms


8. Integração com VltCore.dll

```csharp public class LinkVltCoreInterface { [DllImport("VltCore.dll")] public static extern int VLT_RequestLinkRespins( int sessionId, int respinNumber, out LinkRespinData respinData);

public struct LinkRespinData
{
    public int[] SpherePositions;
    public int[] SphereValues;
    public int AppliedMultiplier;
    public decimal FinalTotal;
    public int RespinsRemaining;
}

public async Task<LinkRespinData> GetNextRespin(int sessionId, int respinNumber)
{
    int result = VLT_RequestLinkRespins(
        sessionId: sessionId,
        respinNumber: respinNumber,
        out LinkRespinData data);

    if (result == 0) // SUCCESS
    {
        return data;
    }
    else
    {
        throw new VltCoreException($"Link respins request failed: {result}");
    }
}

} ```


9. Banco de Dados de Link Sessions

```sql CREATE TABLE link_bonus_sessions ( link_session_id TEXT PRIMARY KEY, round_id INTEGER NOT NULL, ticket_id TEXT NOT NULL,

fire_balls_required TEXT, -- JSON array
fire_balls_collected INTEGER DEFAULT 0,

grid_configuration TEXT, -- JSON de 15 posições
respins_allowed INTEGER DEFAULT 3,
respins_completed INTEGER DEFAULT 0,

accumulated_value DECIMAL(10, 2) DEFAULT 0,
final_win DECIMAL(10, 2),

grid_state TEXT, -- "IN_PROGRESS" | "COMPLETED" | "ENDED"
end_reason VARCHAR(50),

started_at DATETIME DEFAULT CURRENT_TIMESTAMP,
ended_at DATETIME,

FOREIGN KEY (round_id) REFERENCES game_rounds(round_id),
FOREIGN KEY (ticket_id) REFERENCES game_rounds(ticket_id)

);

CREATE TABLE link_respins ( respin_id INTEGER PRIMARY KEY AUTOINCREMENT, link_session_id TEXT NOT NULL, respin_number INTEGER NOT NULL,

spheres_placed INTEGER,
sphere_values TEXT, -- JSON
multiplier_applied INTEGER,
subtotal_before_multiplier DECIMAL(10, 2),
subtotal_after_multiplier DECIMAL(10, 2),

completed_at DATETIME DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (link_session_id) REFERENCES link_bonus_sessions(link_session_id)

); ```


10. Testes de Validação

10.1 Casos Críticos

Teste Entrada Saída Critério
T001 Bilhete R$ 10k + Full Grid 15 esferas 100% entrega
T002 Bilhete R$ 0 + Link Trigger Abandono rápido Sem esfera extra
T003 Constraint Bolas de Fogo 6 Bolas Sem Bingo acidental
T004 Respins Sequenciais 3 respins Total = Bilhete ±2%

Versão

v1.0 - 2026-04-03 Arquiteto: 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, Oriental palace with dragon guardian, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, powerful, fortunate, mythical, cinematic lighting with golden hour sun rays, color palette: dragon red, gold, emerald green, 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 "Dragão da Fortuna", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from dragon red to gold, intricate decorative borders with Asian dragon 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, Asian dragon creature highly detailed, photorealistic rendering, vibrant colors emphasizing dragon red, gold, emerald green, 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: gold coins, ornate design with dragon red, gold, emerald green 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: oriental symbols, sparkling crystal or gem-like appearance, dragon red 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, fortune wheels, animated energy radiating from center, multiple layers of glow effects in emerald green, 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 incense imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich dragon red, gold, emerald green 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, dragon red, gold, emerald green 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, dragon red, gold, emerald green 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 Asian dragon, intense powerful, fortunate, mythical atmosphere, dragon red, gold, emerald green color palette, volumetric lighting effects, large title text with "Dragão da Fortuna", 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