Jogo #05

Roda da Riqueza

Volatilidade
Grid
RTP
90% / 94% / 97%

Game Design Document (GDD) - Roda da Riqueza

Projeto: 05 - Roda da Riqueza Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná / Lottopar) Referência: Wheel of Fortune (IGT) Volatilidade: Baixa


1. Visão Geral


2. Configuração Técnica

Aspecto Especificação
Reels 3x3 (3 rolos, 3 linhas visíveis)
Linhas 5 Linhas Fixas
Aposta Base R$ 0,50 a R$ 50,00 por spin
Velocidade 3 segundos/spin (rápido)
Bonus Frequency 1/65 spins (muito frequente!)
Volatilidade Baixa (ganhos constantes)

3. Tabela de Símbolos

Símbolo 3x Função
Diamante (Top) 500x Prêmio máximo do jogo base
RODA (Bonus) Gatilho Ativa a Roleta Gigante no topo
Cifrão ($) 50x Símbolo de média
Barras (BAR) 10x Clássico de VLT
Sacos de Dinheiro 5x Símbolo baixo
7 de Ouro (Wild) Multiplicador Substitui; Multiplica 2x/5x/10x

4. Bônus: A Roda Gigante

4.1 Ativação

4.2 Mecânica da Roda

A roleta tem 12 fatias com pesos diferentes:

Fatia Multiplicador Peso (RTP 94%) Função
Consolação 5x 50% "Tente Novamente" disfarçado
Pequeno Prêmio 10x 30% Ganho baixo mas satisfatório
Médio Prêmio 25x 12% Ganho real
Grande Prêmio 50x 5% Big Win local
Mega Prêmio 100x 2% Prêmio massivo
JACKPOT Progressivo 1% Acumulado (R$ 10.000+)

4.3 Dinâmica de Parada

A roda gira por 4-6 segundos com efeito de "travagem": 1. Começa em 720°/s (2 rotações completas/segundo) 2. Desacelera gradualmente 3. Para na fatia "designada" com som de clique sincronizado

Psicologia: Roda "passa raspando" por fatias altas antes de parar em ganho verdadeiro.


5. Wild Multiplicador (7 de Ouro)

Função no Jogo Base

Exemplo de Ganho com Wild

Linha: Sacos(5x) - 7-Ouro(Wild) - Sacos(5x) Ganho Normal: 5 × 5 = 25x Com Wild 2x: 5 × 10 = 50x Com Wild 5x: 5 × 25 = 125x Com Wild 10x: 5 × 50 = 250x


6. Distribuição de RTP (94% Padrão)

Componente % RTP
Jogo Base (1-500x) 88%
Roda Bônus 6%
Overhead 6%

7. Reel Stops (3x3 Layout)

Configuração Densa (Baixa Volatilidade)

Rolo Total RODA 7-Wild Diamante Blanks
1 30 4 2 1 23
2 30 4 2 1 23
3 30 4 2 1 23

Estratégia de Visibilidade


8. Simulação Financeira (30 dias, RTP 94%)

Métrica Cálculo Resultado
Aposta Média R$ 5,00 (jogadores apostam alto em jogo simples)
Giros Diários 7.500
Coin-In Diário 7.500 × R$ 5,00 R$ 37.500,00
Coin-In Mensal R$ 37.500 × 30 R$ 1.125.000,00
GGR (6%) 6% R$ 67.500,00

Nota: Maior Coin-In do portfólio devido à velocidade de giros + aposta média alta.


9. Hit Frequency e Ciclo de Jogo

``` Frequência de Ganho: 33% (1 a cada 3 giros) Ciclo Típico: Giro 1: Ganho (Sacos×5) Giro 2: Perda Giro 3: Ganho (Barras×10) Giro 4: Perda Giro 5: Ganho (RODA - ativa bônus da roleta!)

Tempo Médio de Sessão: 35-50 minutos Expectativa: Girar a roda a cada ~6-8 minutos de jogo ```


10. Perfil de Jogador


11. Design de Áudio

Evento Som
Spin Normal Clique suave de engrenagem (som clássico VLT)
Ganho Pequeno Moeda tilintando (sons baixos/médios)
Ganho Grande Sinos alegres + fanfarra
2 RODA Visível Som de suspense (triângulo)
3 RODA (Gatilho) Explosão de sinos + "Vira a roda!" (voz)
Roda Girando Clique ritmado acelerado
Roda Para Pino batendo (clique final)
Jackpot Sirene + aplausos

12. Mecânica de "Nudge" (Empurrão)

Para aumentar a retenção sem alterar RTP, implementamos um "nudge" aleatório:

``` Cenário: RODA parou logo acima da linha de pagamento

Probabilidade: 20% de chance (em RTP 94%) Ação: A tela "tremula"; RODA sai da linha e "cai" para dentro Resultado: Bônus é ativado sem alterar RTP (nudge não conta em balanço)

Efeito Psicológico: "Quase ganhei... consegui!" ```


13. Pool Finito Integration

``` Servidor Lottopar: "O prêmio desta rodada é R$ 500 (100x a aposta de R$ 5)"

Cliente VLT: Opção 1: Gira a roda que para em "50x" e aplica multiplicador 2x Opção 2: Garante RODA normal que paga 100x direto no jogo base Opção 3: RODA + Roda que para em "20x"

Resultado: Prêmio entregue de forma "natural" e surpresa ```


14. Compliance Lottopar


15. Hardware Recomendado


Status: Pronto para TDD Versão: 1.0

Technical Design Document (TDD) - Roda da Riqueza

Projeto: 05 - Roda da Riqueza Versão: 1.0 Data: 2026-04-03


1. Wheel Engine Architecture

```csharp public class WheelBonusEngine { private Wheel wheelInstance; private int[] selectedFatias; // Fatias sorteadas (1-12)

public void TriggerWheel(decimal originalWager) {
    // 1. Servidor já determinou o prêmio
    int targetPrize = PoolFiniteClient.GetWheelPrize();

    // 2. Seleciona fatia que será "paragem"
    int winningFatiaIndex = SelectWinningFatia(targetPrize);

    // 3. Inicia animação da roda
    StartWheelAnimation(winningFatiaIndex);

    // 4. Paga prêmio
    Player.Balance += targetPrize;
}

private int SelectWinningFatia(int targetPrize) {
    // Encontra uma fatia que resulta no prêmio alvo
    // Exemplo: se alvo é 5.000 centavos e aposta foi 5.000, fatia = 100x

    for (int i = 0; i < 12; i++) {
        if (wheelInstance.Fatias[i].Multiplicador * originalWager == targetPrize) {
            return i;
        }
    }
    return 0;  // Fallback
}

public void StartWheelAnimation(int targetFatiaIndex) {
    const int startAngularVelocity = 720;  // °/s (2 revolutions/sec)
    const float totalDuration = 5.0f;       // seconds
    const float anglePerFatia = 30;         // 360/12

    // Calcula ângulo alvo
    float targetAngle = (targetFatiaIndex * anglePerFatia) % 360;

    // Simula "fricção" da roda
    RotateWheelWithFriction(startAngularVelocity, targetAngle, totalDuration);

    // Toca som do "clique" final
    PlayWheelClickSound();
}

private void RotateWheelWithFriction(int startVel, float targetAngle, float duration) {
    // Implementação de deceleration via keyframe animation
    // Frame 1: 720°/s
    // Frame (0.5s): 600°/s
    // Frame (1.0s): 400°/s
    // Frame (2.0s): 100°/s (começando a desacelerar visivelmente)
    // Frame (3.0s): 20°/s
    // Frame (5.0s): 0°/s (para exatamente no alvo)

    float elapsedTime = 0;
    while (elapsedTime < duration) {
        float progress = elapsedTime / duration;  // 0.0 to 1.0
        float easeOutFactor = 1 - (progress * progress);  // quadratic easing

        float currentVelocity = startVel * easeOutFactor;
        wheelInstance.RotateBy(currentVelocity * Time.DeltaTime);

        elapsedTime += Time.DeltaTime;
    }

    // Final snap to exact position
    wheelInstance.SetAngle(targetAngle);
}

} ```


2. Wheel Fatia Weights (RTP Configuration)

```csharp public class WheelFatiaConfiguration {

public static Dictionary<int, WheelFatia> GetFatiasRTP94() {
    return new Dictionary<int, WheelFatia> {
        { 0, new WheelFatia(5, 0.50) },     // 50% - Consolação
        { 1, new WheelFatia(10, 0.30) },    // 30% - Pequeno
        { 2, new WheelFatia(25, 0.12) },    // 12% - Médio
        { 3, new WheelFatia(50, 0.05) },    // 5% - Grande
        { 4, new WheelFatia(100, 0.02) },   // 2% - Mega
        { 5, new WheelFatia(1000, 0.01) },  // 1% - Jackpot
        // Repetir para todas as 12 fatias (mesmas proporções)
    };
}

public static Dictionary<int, WheelFatia> GetFatiasRTP97() {
    // RTP 97%: Aumenta pesos das fatias altas
    return new Dictionary<int, WheelFatia> {
        { 0, new WheelFatia(5, 0.30) },     // 30% (reduzido)
        { 1, new WheelFatia(10, 0.35) },    // 35%
        { 2, new WheelFatia(25, 0.20) },    // 20% (aumentado)
        { 3, new WheelFatia(50, 0.10) },    // 10% (aumentado)
        { 4, new WheelFatia(100, 0.04) },   // 4%
        { 5, new WheelFatia(1000, 0.01) },  // 1% - Jackpot
        // ... repete
    };
}

}

public class WheelFatia { public int Multiplicador { get; set; } public double Weight { get; set; }

public WheelFatia(int mult, double weight) {
    Multiplicador = mult;
    Weight = weight;
}

} ```


3. Reel Strips para 3x3 Layout

Ultra-Densa (Baixa Volatilidade)

``` Rolo 1 (30 paradas): 00-03: RODA (cluster) 04-05: 7-Wild 06-09: RODA again 10-11: Diamante 12-29: Símbolos Baixos + Blanks

Rolo 2 (30): Idêntico Rolo 3 (30): Idêntico ```

Efeito: Símbolos RODA são vistos constantemente, criando antecipação contínua.

Near Miss Engineering

csharp public void ApplyNearMissTo3x3(VirtualReels reels) { // Coloca 2 RODA visíveis frequentemente for (int reel = 0; reel < 3; reel++) { for (int i = 0; i < reels[reel].Count - 1; i++) { if (reels[reel][i] == Symbol.RODA && reels[reel][i + 1] == Symbol.RODA) { // Mantém agrupamento // Próxima parada tem alta chance de RODA também if (i < reels[reel].Count - 2) { if (new Random().Next(100) < 60) { // 60% chance reels[reel][i + 2] = Symbol.RODA; } } } } } }


4. Wild Multiplier Mechanics

```csharp public class WildMultiplierEngine {

public int GetMultiplier() {
    double roll = new Random().NextDouble();

    // RTP 94%:
    if (roll < 0.70) return 2;  // 70% chance
    if (roll < 0.95) return 5;  // 25% chance
    return 10;                   // 5% chance
}

public int ApplyWildMultiplier(int baseLineWin) {
    int multiplier = GetMultiplier();
    return baseLineWin * multiplier;
}

} ```


5. Outcome Builder para 3x3 (5 Linhas)

```csharp public int[] BuildWheelOutcome(int targetPrize) { VirtualReels reels = ReelManager.GetReels("94");

for (int r1 = 0; r1 < reels[0].Count; r1++) {
    for (int r2 = 0; r2 < reels[1].Count; r2++) {
        for (int r3 = 0; r3 < reels[2].Count; r3++) {
            int win = Calculate5LinesPay(reels, r1, r2, r3);

            if (win == targetPrize) {
                return new[] { r1, r2, r3 };
            }

            // Também verifica se RODA está presente (prêmio vem da roda)
            if (HasRODA(reels, r1, r2, r3) && targetPrize > 50000) {
                // Roda entregará o prêmio
                return new[] { r1, r2, r3 };
            }
        }
    }
}
return null;

} ```


6. Nudge Algorithm

```csharp public class NudgeEngine {

public bool ShouldApplyNudge() {
    // 20% chance em RTP 94%
    return new Random().Next(100) < 20;
}

public void ApplyNudge(int[] reelStops) {
    // Desloca RODA para a linha de pagamento visível
    for (int reel = 0; reel < 3; reel++) {
        Symbol symbol = GetSymbolAt(reel, reelStops[reel]);
        if (symbol == Symbol.RODA) {
            // "Empurra" para a linha
            reelStops[reel] = FindNearestRODAStop(reel, reelStops[reel]);
            PlayNudgeAnimation(reel);
        }
    }
}

private int FindNearestRODAStop(int reel, int currentStop) {
    // Procura RODA a até 2 posições de distância
    for (int offset = 1; offset <= 2; offset++) {
        int candidate = (currentStop + offset) % ReelManager.GetReelLength(reel);
        if (GetSymbol(reel, candidate) == Symbol.RODA) {
            return candidate;
        }
    }
    return currentStop;
}

} ```


7. G2S Protocol for Wheel Bonus

Spin Request (Normal): json { "terminal_id": "000005", "game_id": "05_RODA_RIQUEZA", "wager": 50000, // R$ 5,00 (5000 centavos) "request_type": "spin" }

Spin Response (Com Roda): json { "spin_id": "SP5_20260403_000005", "prize": 50000, // 100x a aposta (100x 500 centavos) "wheel_bonus_triggered": true, "wheel_fatia_index": 4, // Fatia 100x "crc": "0xDEADBEEF" }


8. Hardware: Wheel Motor Control

```csharp public class PhysicalWheelController { private SerialPort motorPort;

public void InitializeWheel() {
    motorPort = new SerialPort("COM3", 9600);
    motorPort.Open();
}

public void SpinWheelToFatia(int fatiaIndex) {
    // Calcula ângulo alvo
    float targetAngle = (fatiaIndex * 30) % 360;

    // Envia comando ao motor de passo
    byte[] command = new byte[] {
        0x01,  // Motor 1
        (byte)(targetAngle / 1.8),  // Passos (cada passo = 1.8°)
        0x80   // Velocidade/direção
    };

    motorPort.Write(command, 0, command.Length);

    // Aguarda confirmação
    WaitForMotorComplete();
}

private void WaitForMotorComplete() {
    while (motorPort.BytesToRead == 0) {
        System.Threading.Thread.Sleep(10);
    }
    byte response = (byte)motorPort.ReadByte();
    if (response != 0x06) throw new Exception("Motor error");
}

} ```


9. Coin-In Optimization

Devido ao hit frequency alto (33%) e aposta média alta (R$ 5), este jogo processa mais dinheiro/hora:

``` Giros por Hora: 14h × 60 × 60 / 3 = 16.800 giros/hora Coin-In por Hora: 16.800 × R$ 5,00 = R$ 84.000/hora

Vs Jogo 01 (Tesouros - 4s): Giros por Hora: 12.600 giros/hora Coin-In por Hora: 12.600 × R$ 2,00 = R$ 25.200/hora ```

Conclusão: Roda da Riqueza é a máquina de maior volume.


10. Testing Metrics

Métrica Target Método
Wheel Frequency 1/65 spins ±2% Contador
Hit Frequency 33% ±1% Simulação 100k spins
Wild Multiplier Distribution 70/25/5 Contador
Wheel Angle Accuracy ±2° Motor feedback
Audio Sync <100ms delay Waveform analysis

11. Security & Fraud Prevention

```csharp public class WheelSecurityModule {

public bool ValidateWheelResult(int fatiaIndex, byte[] signature) {
    // HMAC-SHA256 do resultado
    byte[] expectedSignature = HMACSHA256.Compute(
        fatiaIndex.ToString(),
        serverSecret
    );

    return signature.SequenceEqual(expectedSignature);
}

} ```


Status: Pronto para Hardware Integration Versão: 1.0

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, Royal palace treasure chamber, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, fortunate, luxurious, spinning, cinematic lighting with golden hour sun rays, color palette: gold, crimson red, navy blue, 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 "Roda da Riqueza", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from gold to crimson red, intricate decorative borders with spinning wheel 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, spinning wheel creature highly detailed, photorealistic rendering, vibrant colors emphasizing gold, crimson red, navy blue, 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: coins, ornate design with gold, crimson red, navy blue 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: jewels, sparkling crystal or gem-like appearance, gold and crimson red 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 symbols, animated energy radiating from center, multiple layers of glow effects in navy blue, 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 ornate details imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich gold, crimson red, navy blue 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, gold, crimson red, navy blue 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, gold, crimson red, navy blue 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 spinning wheel, intense fortunate, luxurious, spinning atmosphere, gold, crimson red, navy blue color palette, volumetric lighting effects, large title text with "Roda da Riqueza", 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