Jogo #22

Cigana da Sorte

Volatilidade
Desvio padrão máximo 3%
Grid
RTP

22 - CIGANA DA SORTE

Game Design Document (GDD)

Referência: Lucky Lady's Charm (Novomatic) Gênero: High Volatility / Multiplier Slot Status: Design Finalizado Data: 2026-04-03 Mercado: Brasil (Lottopar / Paraná)


1. IDENTIDADE E ATMOSFERA

Tema

Tenda de Vidente, Misticismo, Sorte e Superstições. Uma Cigana mística revela o futuro através de símbolos mágicos e cristais.

Personagem Principal

Madame Sara - Cigana animada que pisca e beija em vitórias. Reações emotivas ao ganho (palmas, riso).

Paleta de Cores

Visual de Fundo


2. DESIGN DE ÁUDIO

Trilha Sonora Base

Efeitos Sonoros

Evento Som Duração Detalhes
Spin Mecânico seco (clique-clique) 0.6s Som de bobina desacoplando
Parada "Ding" cristalino 0.3s Campaninha delicada
Win Pequeno Bleeps eletrônicos que sobem 1s 3 notas em escala crescente
Big Win Fanfarra eletrônica + sino 2s Triunfo clássico
Tease (2 Scatters) Batida de coração acelerada 1.5s Efeito "dum-dum-dum"
Free Spin Ativado Harpa mágica + efeito de cristal 2s Celebração mística

Sistema Dinâmico de Áudio (Ducking)

Quando o Tease (batida de coração) toca, a música de fundo reduz 40% de volume (ducking automático).


3. MECÂNICA CORE

Grade e Linhas

Padrão das 10 Linhas

``` Linha 1: [0, 0, 0, 0, 0] - Topo Linha 2: [1, 1, 1, 1, 1] - Meio Linha 3: [2, 2, 2, 2, 2] - Fundo

Linha 4: [0, 1, 1, 1, 0] - "V" Invertida Linha 5: [2, 1, 1, 1, 2] - "V" Normal

Linha 6: [0, 0, 1, 0, 0] - Topo com cume Linha 7: [2, 2, 1, 2, 2] - Fundo com cume

Linha 8: [0, 1, 2, 1, 0] - Zig-Zag descendo Linha 9: [2, 1, 0, 1, 2] - Zig-Zag subindo

Linha 10: [1, 0, 1, 0, 1] - Alternada ```

Volatilidade

Aposta

RTP (Return to Player)


4. TABELA DE SÍMBOLOS

Wild (Cigana Sara) - ESPECIAL

Características: Substitui qualquer símbolo MENOS Scatter Propriedade Multiplicadora: Qualquer linha com Wild vale 2x o prêmio original

Ocorrências Valor Multiplicador
5 na Linha 500x Aposta 2x (ao participar)
4 na Linha 100x Aposta 2x (ao participar)
3 na Linha 20x Aposta 2x (ao participar)
2 na Linha 0x Não paga
1 na Linha 0x Não paga

Exemplo de Multiplicação: - Linha com: Wild + Lucky + Lucky + Lucky + Lucky (4 Lucky's + 1 Wild) - Prêmio base: 80x (por 4 Lucky's) - Multiplicador Wild: 80x × 2 = 160x

Scatter (Bola de Cristal) - BONUS TRIGGER

Posição: Qualquer lugar na grade Frequência: Aparece em todos os rolos

Quantidade Valor Ação
3 Scatters 1x Total Bet Ativa 15 Giros Grátis
4 Scatters 5x Total Bet Ativa 20 Giros Grátis
5 Scatters 20x Total Bet Ativa 25 Giros Grátis

Som Especial (Tease): Som de batida de coração acelerada quando 2 Scatters aparecem (criando tensão para o 3º)

High Pay (Prêmios Altos)

Símbolo Tema 5x 4x 3x 2x
Lucky Joaninha vermelha 400x 80x 20x 5x
Clover Trevo de 4 folhas 350x 70x 18x 4x
Horseshoe Ferradura dourada 300x 60x 15x 3x

Low Pay (Prêmios Baixos)

Símbolo 5x 4x 3x 2x
A 100x 20x 5x 1,5x
K 80x 16x 4x 1x
Q 60x 12x 3x 1x
J 40x 8x 2x 0,5x
10 30x 6x 1,5x 0,5x
9 20x 4x 1x 0x

5. FUNCIONALIDADES ESPECIAIS

5.1 Wild Multiplicador (Base Game)

Mecânica: Qualquer linha que contém um Wild (Cigana) paga o dobro (2x).

Exemplo Completo: ``` Linha encontrada: [Horseshoe, Wild, Lucky, Clover, Lucky]

Paytable lookup: Horseshoe (não aparece em posição 1) Fallback: Lucky (4 vezes na linha): - Base: 80x - Com Wild: 80x × 2 = 160x - Ganho final: 160x × Aposta_por_linha ```

5.2 Multiplicador Global no Bônus (Free Spins)

Trigador: 3+ Scatters

Modificação: Todas as vitórias durante Free Spins são multiplicadas por 3x

Poder Combinado: Se uma linha contém tanto Wild quanto está no Bônus: - Base: X - Com Wild: X × 2 - No Bônus: X × 2 × 3 = 6x o valor original

Exemplo Prático: Aposta: R$ 1,00 Linha: [Lucky, Lucky, Lucky, Lucky, Wild] Base payout: 80x Com Wild: 80x × 2 = 160x = R$ 160 Se no Bônus: 160x × 3 = 480x = R$ 480

5.3 Retrigger Free Spins

Condição: 3+ Scatters durante Free Spins Prêmio: +15 Giros (máximo 50 giros por ativação) Frequência: Permitido até 3 retríggers por rodada de bônus


6. BÔNUS: "DESTINO REVELADO"

Estrutura Geral

Sequência de Apresentação

``` 1. INTRO (2s) - Fade in: Tenda de circo em close - Madame Sara pisca para câmera - Som: Harpa mágica + efeito cristal

  1. PRÊMIO ANUNCIADO (1s)
  2. "Você ganhou X Giros Grátis!"
  3. Número em letras grandes + animação de cristal

  4. AUTO-PLAY (Durante o bônus)

  5. Cada giro avança automaticamente
  6. Contador no canto exibe giros restantes
  7. Efeito de "queimação" de giro no visor

  8. RETRIGGER DETECTOR

  9. Se 3+ Scatters aparecem:

    • Screen freeze (0.5s)
    • Animação de Madame Sara saltando de alegria
    • Som: Sinos de cristal tocam
    • "Você ganhou +15 Giros!"
  10. END SCREEN (Bônus terminou)

  11. Resumo de ganhos: "Total Bônus: R$ XXX,XX"
  12. Madame Sara beija um beijo ao ar (celebração)
  13. Som: Fanfarra eletrônica
  14. Botão: "Nova Rodada" ou "Sair" ```

Paytable Modificado (Bônus)

Todos os ganhos multiplicados por 3x:

Símbolo 5x 4x 3x Modificado
Lucky 400x 80x 20x 1200x / 240x / 60x
Clover 350x 70x 18x 1050x / 210x / 54x
Horseshoe 300x 60x 15x 900x / 180x / 45x
Wild + Lucky (combo) - - - Base × 2 × 3 = 6x

7. TABELA DE PAGAMENTO COMPLETA

Ordem de Verificação

  1. Scatters (paga independente)
  2. Wilds (substituem símbolos)
  3. Linhas de pagamento (esquerda para direita)

Exemplos de Ganhos

``` Aposta: R$ 0,50

Cenário 1: Linha com Joaninha (Lucky) Encontrado: [Lucky, Lucky, Lucky, X, X] Ganho: 20x × R$ 0,05 = R$ 1,00

Cenário 2: Mesma linha com Wild Encontrado: [Lucky, Lucky, Lucky, Wild, X] Ganho: 20x × 2 × R$ 0,05 = R$ 2,00

Cenário 3: No bônus Encontrado: [Lucky, Lucky, Lucky, Wild, X] (durante Free Spins) Ganho: 20x × 2 × 3 × R$ 0,05 = R$ 6,00

Cenário 4: 3 Scatters Scatter payout: 1x × R$ 5,00 total bet = R$ 5,00 Ação: 15 Giros Grátis ativados ```


8. EXPERIÊNCIA DE USUÁRIO

Interface Principal

Animações Críticas

Evento Duração Efeito
Spin Normal 3s Rolos giram suavemente, som mecânico
Parada 0.5s Frenagem Ease-Out, clique sonoro
2 Scatters 2s Tease (batida de coração), escuro avermelhado
3 Scatters 3s Screen flash, Madame Sara pisca, harpa mágica
Wild Ativo 1s Halo dourado ao redor do Wild, brilho
Free Spin Ganho Dinâmico Pop-up "Ganhou X Giros!" com animação cristal

Responsividade


9. CONFORMIDADE REGULATÓRIA

Exigências Lottopar (Paraná)

Segurança de Dados


10. ANÁLISE COMPETITIVA

Versus Lucky Lady's Charm Original

Aspecto Original Nossa Versão
Tema Europeu clássico Brasileiro (Cigana)
RTP Variável (até 97%) Fixo 94% (Lottopar)
Hit Freq. 24% 24% (mantido)
Max Win 10.000x 1.500x (regulado)
Bônus 10 FS base 15 FS base
Multiplicador 3x 6x máx (2 Wild + 3 Bônus)

Público-Alvo


11. NOTAS DE DESENVOLVIMENTO

Prioridades

  1. P1: Multiplicador Wild, Scatter Tease, Free Spins
  2. P2: Audio Ducking, Animação Madame Sara
  3. P3: Efeitos de cristal, tenda animada
  4. P4: Temas alternativos

Riscos Identificados


12. GLOSSÁRIO


Documento Finalizado: 03/04/2026 Versão: 1.0 - Draft Final Aprovação Lottopar Requerida

22 - CIGANA DA SORTE

Technical Design Document (TDD)

Referência: Lucky Lady's Charm (Novomatic) Arquitetura: Lottopar Core (Pool Finito) Status: Design Finalizado Data: 2026-04-03


1. VISÃO GERAL TÉCNICA

Este documento especifica a implementação técnica do Cigana da Sorte com foco em: - Gestão de multiplicadores compostos (2x Wild + 3x Bônus = 6x) - Reel strip otimizado para 10 linhas - Tease system (batida de coração com 2 Scatters) - Sincronismo de audio com game events - Integração VltCore.dll


2. REEL STRIPS E CONFIGURAÇÃO

Configuração Geral

Reel Strip Mapping

Reel 1 (Esquerda - Wild Focus)

Posição | Símbolo | Frequência | Tipo --------|------------|------------|------- 0-3 | Wild | 4x | Normal 4-6 | Lucky | 3x | High 7-9 | Clover | 3x | High 10-12 | Horseshoe | 3x | High 13-15 | A | 3x | Low 16-18 | K | 3x | Low 19-21 | Q | 3x | Low 22-24 | J | 3x | Low 25-27 | 10 | 3x | Low 28-30 | 9 | 3x | Low 31-33 | Scatter | 3x | Bonus Trigger 34-39 | [Reserved] | 6x | Buffer

Proporção: Wild 10%, Scatter 7.5%, High 22.5%, Low 60%

Reel 2, 3, 4 (Universais)

Idêntico ao Reel 1 para balanceamento de distribuição

Reel 5 (Direita - Wild Focus)

Idêntico ao Reel 1 para correlação visual direita-esquerda

Probabilidades Derivadas

Evento Prob. Teórica Freq. (1000 giros)
3 Scatters 1.07% ~10.7 giros
4 Scatters 0.08% ~0.8 giros
5 Scatters 0.004% ~0.04 giros
3+ Wilds em linha 3.2% ~32 giros
Tease (2 Scatters) 0.32% ~3.2 giros

3. ALGORITMO DE FATORAÇÃO REVERSA (REVERSE MATH)

Problema: Multiplicadores Compostos

O Pool Finito devolve um TicketWin (ex: R$ 54,00). O OutcomeBuilder deve encaixar este valor nos multiplicadores: - 2x (Wild) - 3x (Free Spins) - 6x (Wild + FS combinado)

Solução: Algoritmo em Cascata

```csharp public decimal FindOptimalPayline(decimal targetWin, decimal betPerLine) {

// Fase 1: Tentativa de 6x (Wild + Bônus)
decimal basePay6x = targetWin / 6m;
if (IsValidPaytableValue(basePay6x)) {
    return basePay6x; // Usar Wild no Bônus
}

// Fase 2: Tentativa de 3x (Bônus sem Wild)
decimal basePay3x = targetWin / 3m;
if (IsValidPaytableValue(basePay3x)) {
    return basePay3x; // Usar Bônus sem Wild
}

// Fase 3: Tentativa de 2x (Wild no Base)
decimal basePay2x = targetWin / 2m;
if (IsValidPaytableValue(basePay2x)) {
    return basePay2x; // Usar Wild no Base Game
}

// Fase 4: Sem multiplicador
if (IsValidPaytableValue(targetWin)) {
    return targetWin; // Pagar direto
}

// Fase 5: Fallback - Ajuste fino com resíduo
return ApplyResidueCorrection(targetWin);

}

private bool IsValidPaytableValue(decimal value) { // Verificar se existe na tabela de pagamentos var validEntries = paytable.Where(x => Math.Abs(x - value) < 0.01m).ToList(); return validEntries.Count > 0; } ```

Tabela de Paylines Otimizada

A tabela deve conter valores que sejam divisíveis por 1, 2, 3 e 6:

Símbolo | 5x | 4x | 3x | Nota ---------|-------|------|-----|----- Lucky | 600 | 120 | 30 | Divisível por 6 Clover | 540 | 108 | 27 | Divisível por 6 Horse. | 480 | 96 | 24 | Divisível por 6 A | 300 | 60 | 15 | Divisível por 6 K | 240 | 48 | 12 | Divisível por 6 Q | 180 | 36 | 9 | Divisível por 6 J | 120 | 24 | 6 | Divisível por 6 10 | 90 | 18 | 4.5 | Divisível por 3 9 | 60 | 12 | 3 | Divisível por 3

Regra de Design: Todos os valores devem ser múltiplos de 6 quando possível.


4. CÁLCULO DE MULTIPLICADORES

Matriz de Multiplicação

``` Base Game Multiplicador: ┌─────────────────────────────┐ │ Nenhum Wild → 1x │ │ Com Wild → 2x │ └─────────────────────────────┘

Free Spin Multiplicador: ┌─────────────────────────────┐ │ Nenhum Wild → 3x │ │ Com Wild → 2x × 3x = 6x │ └─────────────────────────────┘ ```

Exemplo Completo de Cálculo

``` Aposta: R$ 6,00 (R$ 0,60 por linha × 10 linhas) Combinação encontrada: [Lucky, Lucky, Lucky, Lucky, Wild]

Paytable lookup: - Lucky (4x) = 120x valor base - Com Wild = 120x × 2 = 240x

Ganho total: 240x × R$ 0,60 = R$ 144,00

Se em Free Spins: - Ganho base: 120x × R$ 0,60 = R$ 72,00 - Com multiplicador bônus (3x): R$ 72,00 × 3 = R$ 216,00 - Com Wild adicional (2x): R$ 72,00 × 2 × 3 = R$ 432,00 ```


5. SISTEMA TEASE (BATIDA DE CORAÇÃO)

Detecção de 2 Scatters

```csharp public class TeaseDetectionSystem {

public bool DetectTease(Symbol[,] grid) {
    int scatterCount = 0;
    List<Vector2> scatterPositions = new();

    foreach (var pos in grid.GetAllPositions()) {
        if (grid[pos].IsScatter) {
            scatterCount++;
            scatterPositions.Add(pos);
        }
    }

    return scatterCount == 2; // Exatamente 2 (não 3+)
}

public void TriggerTease(Symbol[,] grid) {
    // 1. Pausar animação de reels
    reelController.Pause();

    // 2. Carregar som pré-buffer (crítico para latência)
    audioManager.PreloadTease();

    // 3. Fade escuro avermelhado
    screenFade.To(new Color(0.5f, 0, 0), 0.5f);

    // 4. Iniciar loop de batida de coração
    audioManager.PlayTease();

    // Duração: 1.5 segundos
    // Efeito: "dum-dum-dum" acelerado

    // 5. Esperar 1.5s
    yield return new WaitForSeconds(1.5f);

    // 6. Restaurar visual normal
    screenFade.To(Color.white, 0.3f);

    // 7. Continuar reels normalmente
    reelController.Resume();
}

} ```

Audio Latency & Pre-Load

Problema crítico: Som de Tease deve tocar instantaneamente ao detectar 2 Scatters. Latência = ruim.

Solução: 1. O JSON do Pool já traz flag: tease_detected: true 2. Unity carrega arquivo de áudio na memória RAM (buffer) 3. Ao receber outcome, toca de forma síncrone (latência < 10ms)

```csharp public class AudioPreloader {

private Dictionary<string, AudioClip> buffers = new();

public void Initialize() {
    // Carregar sons críticos no boot
    buffers["tease"] = Resources.Load<AudioClip>("Sounds/Tease");
    buffers["freeSpinTrigger"] = Resources.Load<AudioClip>("Sounds/FreeSpinActivated");
    buffers["winChime"] = Resources.Load<AudioClip>("Sounds/WinChime");
}

public void PlayTease() {
    audioSource.PlayOneShot(buffers["tease"]); // Latência < 10ms
}

} ```


6. GERENCIAMENTO DE FREE SPINS

Estrutura de Sessão

```csharp public class FreeSpinSession { public int InitialSpins { get; set; } = 15; public int CurrentSpins { get; set; } public decimal TotalAccumulated { get; set; } = 0; public int RetriggerCount { get; set; } = 0; public const int MAX_RETRIGGERS = 3;

public void ProcessSpin(decimal spinResult) {
    AccumulateWin(spinResult);
    CurrentSpins--;

    // Detectar retrigger
    if (DetectRetrigger()) {
        if (RetriggerCount < MAX_RETRIGGERS) {
            CurrentSpins += 15;
            RetriggerCount++;
        }
    }
}

private void AccumulateWin(decimal result) {
    TotalAccumulated += result;
}

private bool DetectRetrigger() {
    // Verificar se Pool sinalizou retrigger
    return JsonPayload.ContainsKey("retrigger_flag");
}

} ```

Pool Request com Flags

json { "round_id": "CIGANA_555", "round_type": "BASE_GAME", "total_bet": 6.00, "bet_per_line": 0.60, "total_ticket_win": 54.00, "multiplicand": { "wild_active": true, "multiplier_2x": true, "bonus_active": false, "effective_multiplier": 2.0 }, "tease_detected": false, "hash": "xyz789abc", "timestamp": "2026-04-03T14:25:10Z" }

Pool Request para Free Spin com Retrigger

json { "round_id": "CIGANA_556", "round_type": "FREE_SPIN", "spin_number": 7, "total_bet": 6.00, "bet_per_line": 0.60, "total_ticket_win": 216.00, "multiplicand": { "wild_active": true, "bonus_active": true, "multiplier_2x": true, "multiplier_3x": true, "effective_multiplier": 6.0 }, "retrigger_flag": true, "additional_spins": 15, "hash": "abc123xyz", "timestamp": "2026-04-03T14:25:15Z" }


7. PATTERN MATCHING PARA 10 LINHAS

Definição de Linhas

```csharp private int[][] paylines = new int[][] { new int[] {0, 0, 0, 0, 0}, // Linha 1: Topo new int[] {1, 1, 1, 1, 1}, // Linha 2: Meio new int[] {2, 2, 2, 2, 2}, // Linha 3: Fundo

new int[] {0, 1, 1, 1, 0}, // Linha 4: V invertida
new int[] {2, 1, 1, 1, 2}, // Linha 5: V normal

new int[] {0, 0, 1, 0, 0}, // Linha 6: Topo com cume
new int[] {2, 2, 1, 2, 2}, // Linha 7: Fundo com cume

new int[] {0, 1, 2, 1, 0}, // Linha 8: Zig-zag descendo
new int[] {2, 1, 0, 1, 2}, // Linha 9: Zig-zag subindo

new int[] {1, 0, 1, 0, 1}  // Linha 10: Alternada

}; ```

Algoritmo de Verificação

```csharp public decimal CheckPayline(int[] lineConfig, Symbol[,] grid, decimal betPerLine) {

Symbol firstSymbol = grid[lineConfig[0], 0];

// Rejeitar linhas começadas por Scatter
if (firstSymbol.IsScatter) return 0;

int matches = 0;
decimal wildMultiplier = 1m;

for (int reel = 0; reel < 5; reel++) {
    Symbol current = grid[lineConfig[reel], reel];

    // Detectar Wild
    if (current.IsWild) {
        wildMultiplier = 2m;
        current = firstSymbol; // Substitui
    }

    if (current == firstSymbol) {
        matches++;
    } else {
        break; // Combinação quebrada
    }
}

if (matches < 3) return 0; // Mínimo 3 símbolos

decimal basePayment = GetPaytableValue(firstSymbol, matches);
decimal wildcardPayment = basePayment * wildMultiplier;
decimal lineWin = wildcardPayment * betPerLine;

return lineWin;

} ```


8. VALIDAÇÃO PRÉ-APRESENTAÇÃO

Server-Side Validation

```csharp public bool ValidateOutcome(Outcome outcome) {

// 1. Verificação de hash
string computed = SHA256(outcome.rawData);
if (computed != outcome.hash) {
    LogError("Hash validation failed");
    return false;
}

// 2. Verificação de RTP
decimal rtp = outcome.totalWin / outcome.totalBet;
if (rtp < 0.92m || rtp > 1.98m) { // 92% - 198%
    LogError($"RTP out of bounds: {rtp}");
    return false;
}

// 3. Verificação de Multiplicadores
if (outcome.wildActive && outcome.bonusActive) {
    if (outcome.effectiveMultiplier != 6m) {
        LogError("Multiplier mismatch for Wild+Bonus");
        return false;
    }
}

// 4. Recalcular ganho a partir da grade
decimal recalc = RecalculateWinFromGrid(outcome.grid);
if (Math.Abs(recalc - outcome.totalWin) > 0.01m) {
    LogError($"Win calculation mismatch");
    return false;
}

// 5. Validar Scatters
int scatterCount = outcome.grid.CountScatters();
if (scatterCount > 5) {
    LogError("Excessive scatter count");
    return false;
}

return true;

} ```


9. SINCRONISMO CRÍTICO

Animação de Spin com Audio Ducking

```csharp public class SpinController : MonoBehaviour {

public IEnumerator ExecuteSpin(Outcome outcome) {

    // 1. Receber outcome do Pool
    ValidateOutcome(outcome);

    // 2. Iniciar animação de rolos
    StartCoroutine(AnimateReels(3.5f));

    // 3. Detectar Tease
    if (outcome.teaseDetected) {
        yield return new WaitForSeconds(1.5f); // Deixar rolos girarem

        // 4. Pausar rolos
        reelController.Pause();

        // 5. Iniciar Tease com Audio Ducking
        audioManager.DuckMusic(0.6f); // Reduz música para 60%
        audioManager.PlayTease();

        yield return new WaitForSeconds(1.5f);

        // 6. Restaurar
        audioManager.UnDuck(0.3f);
        reelController.Resume();

        yield return new WaitForSeconds(2.0f); // Continuar giro
    }

    // 7. Parar rolos nos índices do outcome
    for (int reel = 0; reel < 5; reel++) {
        StopReelAtIndex(reel, outcome.reel_stops[reel], 0.4f);
    }

    yield return new WaitForSeconds(0.5f);

    // 8. Apresentação de Ganhos
    StartCoroutine(PresentWins(outcome));
}

private void StopReelAtIndex(int reel, int index, float duration) {
    float targetRotation = index * 24f; // 360 / 15 posições = 24°
    DOTween.To(
        () => reels[reel].rotation.z,
        x => reels[reel].rotation = new Vector3(0, 0, x),
        targetRotation,
        duration
    ).SetEase(Ease.OutQuart); // Frenagem suave
}

} ```


10. RTP BANKING (RESÍDUO)

Gestão de Resíduos Decimais

```csharp public class ResidueWallet {

private decimal balance = 0m;
private const decimal MIN_RESIDUE = 0.01m; // 1 centavo

public decimal ApplyResidue(decimal expectedWin, decimal achievedWin) {

    decimal difference = expectedWin - achievedWin;

    if (difference > 0) {
        // Sobra: guardar para próxima rodada
        balance += difference;
    } else if (difference < 0) {
        // Déficit: tirar do banco se tiver
        decimal needed = Math.Abs(difference);
        if (balance >= needed) {
            balance -= needed;
            return achievedWin + needed;
        }
    }

    // Se banco vazio, retornar ganho ajustado
    return achievedWin;
}

public void FlushIfPossible() {
    // Se banco atingiu R$ 0,01, devolver ao jogador
    if (balance >= MIN_RESIDUE) {
        player.Balance += balance;
        LogTransaction($"RESIDUE_FLUSH: {balance}");
        balance = 0;
    }
}

} ```


11. JSON PAYLOAD EXEMPLO COMPLETO

Free Spin com Retrigger

json { "game_id": 22, "round_id": "CIGANA_999", "round_type": "FREE_SPIN", "spin_number": 3, "total_bet": 6.00, "bet_per_line": 0.60, "lines": 10, "expected_win": 216.00, "actual_win": 216.00, "game_state_before": { "balance": 150.00, "spins_remaining": 5 }, "game_state_after": { "balance": 366.00, "spins_remaining": 20 }, "reel_stops": [0, 4, 2, 3, 1], "grid": [ ["Lucky", "Lucky", "Lucky", "Clover", "Lucky"], ["Clover", "Wild", "Wild", "Lucky", "Horseshoe"], ["Horseshoe", "A", "Clover", "Clover", "A"] ], "winning_lines": [1, 2, 3, 5], "individual_line_wins": { "line_1": 54.00, "line_2": 54.00, "line_3": 54.00, "line_5": 54.00 }, "multiplicands": { "wild_active": true, "bonus_active": true, "wild_multiplier": 2.0, "bonus_multiplier": 3.0, "effective_multiplier": 6.0 }, "retrigger": { "detected": true, "scatter_count": 3, "additional_spins": 15, "new_total_spins": 20 }, "tease_detected": false, "audio_cues": ["freeSpinRetrigger", "chime"], "presentation_type": "RETRIGGER", "hash": "d4c3b2a1f9e8d7c6b5a4f3e2d1c0b9a8", "timestamp": "2026-04-03T14:26:45.123Z", "session_id": "sess_abc123xyz789" }


12. ESPECIFICAÇÕES DE HARDWARE

Requisitos Mínimos

Requisitos de Rede


13. PROTOCOLO SAS/G2S

Configuração

``` Machine Address: [Conforme instalação] Game Number: 22 Game Version: 1.0

Fluxo de Auditoria: 1. SPIN_INITIATED → Log SAS imediato 2. TICKET_GENERATED → ID único 3. OUTCOME_PRESENTED → Ganho exibido 4. TICKET_REDEEMED → Saldo atualizado ```


14. TESTES E VALIDAÇÃO

Test Case 1: Retrigger

``` Input: Free Spin com 3 Scatters na tela Expected: +15 Giros, Pop-up "Ganhou +15 Giros!"

Verificações: 1. RetriggerCount incrementa 2. Giros atualizados corretamente 3. Som de sino toca 4. Madame Sara pisca 5. Multiplicador continua 6x (se Wild presente) ```

Test Case 2: Tease System

``` Input: Outcome com exatamente 2 Scatters Expected: Audio Tease (batida de coração), screen fade

Verificações: 1. Rolos pausam corretamente 2. Batida toca sem latência (<10ms) 3. Música faz ducking para 60% 4. Fade avermelhado ativa 5. Após 1.5s, restaura tudo normalmente ```

Test Case 3: Multiplicador Composto

``` Input: Wild + Free Spin (Bônus) Expected: Ganho × 2 × 3 = 6x

Exemplo: - Base payout: Lucky (4x) = 80x - Com Wild: 80x × 2 = 160x - No Bônus: 160x × 3 = 480x - Final: 480x × R$ 0,60 = R$ 288,00 ```

Stress Test (1M giros)

Métricas: - RTP: 94% ± 2% - Hit Frequency: 24% ± 1% - Average Spin Duration: 4.2s - Memory Leak: None (monitored) - Tease Accuracy: 100% (quando 2 Scatters)


15. CONFORMIDADE LOTTOPAR

Documentação Requerida


Documento Finalizado: 03/04/2026 Versão: 1.0 - Draft Final Certificação: Pendente Lottopar

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, Gypsy fortune teller's mystical tent, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, mystical, fortunate, magical, cinematic lighting with golden hour sun rays, color palette: mystical purple, golden amber, deep crimson, 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 "Cigana da Sorte", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from mystical purple to golden amber, intricate decorative borders with gypsy fortune teller 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, gypsy fortune teller creature highly detailed, photorealistic rendering, vibrant colors emphasizing mystical purple, golden amber, deep crimson, 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: crystal ball, ornate design with mystical purple, golden amber, deep crimson 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: mystical cards, sparkling crystal or gem-like appearance, mystical purple and golden amber 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, incense, animated energy radiating from center, multiple layers of glow effects in deep crimson, 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 mystical symbols imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich mystical purple, golden amber, deep crimson 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, mystical purple, golden amber, deep crimson 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, mystical purple, golden amber, deep crimson 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 gypsy fortune teller, intense mystical, fortunate, magical atmosphere, mystical purple, golden amber, deep crimson color palette, volumetric lighting effects, large title text with "Cigana 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