Jogo #03

Cangaço Luck

Volatilidade
Grid
RTP
90% / 94% / 97%

Game Design Document (GDD) - Cangaço Luck

Projeto: 03 - Cangaço Luck Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná / Lottopar) Referência: Lightning Link (Aristocrat) Volatilidade: Alta


1. Visão Geral


2. Configuração Técnica

Aspecto Especificação
Reels 5x3 (5 colunas, 3 linhas)
Linhas 50 linhas fixas
Aposta Base 50 créditos (R$ 0,50)
Velocidade 4 segundos/spin
Bonus Frequency 1/145 spins

3. Tabela de Símbolos (50 Linhas, Aposta 50 Créditos)

Símbolo 5x 4x 3x Função
Cangaceiro (Top) 500 100 20 Símbolo de topo; Stacked (2 de altura)
Moeda de Prata Gatilho do Hold & Spin (6+)
Pistola 200 50 15 Símbolo médio
Chapéu/Sanfona 100 30 10 Temáticos
A/K/Q/J/10/9 50 15 5 Cartas baixas
Sertão (Wild) Substitui tudo exceto Moeda e Scatter

4. Bônus: Hold & Spin (A Alma do Jogo)

4.1 Ativação

4.2 Mecânica de Respin

  1. Estado Inicial: 6+ Moedas na tela; 3 Respins
  2. Cada Spin:
  3. Se nova Moeda cai → reseta contador para 3
  4. Se nenhuma nova Moeda cai → contador diminui em 1
  5. Fim: Quando contador atinge 0 ou grid fica cheio (15/15)

4.3 Valores das Moedas (Pool Finito)

RTP 90%: Moedas variam de 1x a 20x a aposta total Distribuição: 65% baixas (1-3x), 25% médias (5-10x), 8% altas (20x), 2% Jackpots

RTP 94% (Padrão): Moedas variam de 1x a 50x a aposta total Distribuição: 55% baixas, 30% médias, 12% altas, 3% Jackpots

RTP 97%: Moedas variam de 2x a 100x a aposta total + "Super Moeda" que coleta todos os valores da tela e multiplica por 2 Distribuição: 45% baixas, 35% médias, 15% altas, 5% Super + Jackpots

4.4 Jackpots Progressivos


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

Componente % RTP
Jogo Base (prêmios 1-50x) 40%
Hold & Spin Bônus 54%
Overhead 6% (House Edge)

6. Reel Stops (50 Linhas)

Configuração Técnica

Rolo Total Moedas Wilds Cangaceiro Blanks
1 40 3 1 36
2 50 5 4 1 40
3 50 5 4 1 40
4 50 5 4 1 40
5 40 3 1 36

Near Miss Strategy


7. Engenharia das Moedas (Weighted Distribution)

Valor por Moeda | Peso RTP 94% 1x a 3x | 65% (mantém o jogador no respin) 5x a 10x | 25% (ganho real) 20x a 50x | 8% (Big Win) Mini Jackpot | 1,5% Minor Jackpot | 0,5%

Psicologia: Muitas moedas baixas mantêm "esperança" de completar as 15 posições.


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

Métrica Cálculo Resultado
Aposta Média 50 créditos R$ 2,50
Giros Diários 7.500
Coin-In Diário 7.500 × R$ 2,50 R$ 18.750,00
Coin-In Mensal R$ 18.750 × 30 R$ 562.500,00
GGR (6%) 6% de Coin-In R$ 33.750,00

9. Classificação de Volatilidade


10. Design de Áudio

Evento Som
Moeda Caindo Bumbo seco de forró (tom grave)
1-5 Moedas Percussão leve; som de moeda metálica
6ª Moeda (Gatilho) Chicote + Grito "Ê-ta! Cangaço!"
Hold & Spin Music Trilha acelerada de triângulo/sanfona; BPM cresce a cada moeda
Respins Batida de tamborim acelerada
Jackpot Explosão suave + Flauta

11. Compliance Lottopar


12. Próximos Passos


Status: Pronto para TDD Versão: 1.0

Technical Design Document (TDD) - Cangaço Luck

Projeto: 03 - Cangaço Luck Versão: 1.0 Data: 2026-04-03


1. Hold & Spin Engine Architecture

```csharp public class HoldAndSpinEngine { private List activeCoinsMoedas; private int gridPositions = 15; // 3x5 grid private int respinsRemaining = 3;

public void OnHoldAndSpinTriggered(int[] reelStops) {
    // Extrai todas as Moedas dos rolos
    activeCoinsMoedas = ExtractCoins(reelStops);

    if (activeCoinsMoedas.Count >= 6) {
        InitializeGrid();
        ShowHoldAndSpinScreen();
    }
}

public void OnRespin() {
    respinsRemaining--;

    int newCoinCount = SimulateRespin();
    if (newCoinCount > 0) {
        respinsRemaining = 3;  // Reset
        activeCoinsMoedas.AddRange(newCoinCount);
    }

    if (respinsRemaining == 0 || activeCoinsMoedas.Count == 15) {
        CalculateTotalWin();
        ExitHoldAndSpin();
    }
}

private int SimulateRespin() {
    // Requisita novo outcome do servidor para 1 spin
    Outcome respin = PoolFiniteClient.RequestRespin();
    return CountCoinsInOutcome(respin);
}

} ```


2. Weighted Distribution of Coins

```csharp public class CoinWeightEngine { private Dictionary rtpWeights = new Dictionary();

public CoinWeightEngine(string rtpMode) {
    if (rtpMode == "94") {
        rtpWeights[1] = 0.30;   // 1x-3x: 30%
        rtpWeights[5] = 0.35;   // 5x-10x: 35%
        rtpWeights[20] = 0.28;  // 20x-50x: 28%
        rtpWeights[100] = 0.05; // Mini+: 5%
    }
}

public int GenerateCoinValue() {
    Random rand = new Random();
    double roll = rand.NextDouble();
    double cumulative = 0;

    foreach (var kvp in rtpWeights) {
        cumulative += kvp.Value;
        if (roll <= cumulative) {
            return PickValueInRange(kvp.Key);
        }
    }
    return 1;  // Fallback
}

private int PickValueInRange(int baseValue) {
    // Para 1: retorna 1-3
    // Para 5: retorna 5-10
    // Etc.
    Random rand = new Random();
    return baseValue + rand.Next(0, 4);
}

} ```


3. Outcome Builder para Hold & Spin

```csharp public int[] BuildHoldAndSpinOutcome(int targetPrize, VirtualReels reels, string rtpMode) { // Encontra todas as paradas que geram 6+ Moedas List validCombinations = new List();

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++) {
            for (int r4 = 0; r4 < reels[3].Count; r4++) {
                for (int r5 = 0; r5 < reels[4].Count; r5++) {
                    int coinCount = CountCoins(reels, r1, r2, r3, r4, r5);
                    if (coinCount >= 6) {
                        // Gera composição de moedas que soma targetPrize
                        var coinComposition = DecomposeIntoCoins(targetPrize, coinCount, rtpMode);
                        if (coinComposition != null) {
                            validCombinations.Add(new int[] { r1, r2, r3, r4, r5 });
                        }
                    }
                }
            }
        }
    }
}

return validCombinations[new Random().Next(validCombinations.Count)];

}

private List DecomposeIntoCoins(int targetTotal, int coinCount, string rtpMode) { // Distribui targetTotal entre coinCount moedas // Exemplo: 5.000 centavos (50x) em 8 moedas // Resultado: [100, 200, 150, 500, 800, 1000, 1000, 250]

CoinWeightEngine weightEngine = new CoinWeightEngine(rtpMode);
List<int> coins = new List<int>();

for (int i = 0; i < coinCount; i++) {
    coins.Add(weightEngine.GenerateCoinValue());
}

// Ajusta a última moeda para acertar o total
int current = coins.Sum();
coins[coins.Count - 1] += (targetTotal - current);

return coins;

} ```


4. Reel Strips (50 Linhas)

Parada Estratégica (RTP 94%)

Rolo 2 Exemplo: Index 00-04: Moeda (zona de coleta) Index 05-08: Wild Index 09-14: Cangaceiro (agrupado) Index 15-44: Cartas baixas (preenchimento) Index 45-49: Moeda novamente (near miss)

Dynamic Adjustment


5. Markov Chain for Respins

``` Estados: Nenhuma Nova Moeda | 1 Nova Moeda | 2+ Novas Moedas

Matriz (RTP 94%): Nenhuma Uma Duas Nenhuma [0.70 0.20 0.10] Uma [0.00 0.75 0.25] Duas [0.00 0.00 1.00]

Interpretação: - 70% de chance: nenhuma nova moeda (respin count diminui) - 20% de chance: 1 nova moeda (respin count reseta) - 10% de chance: bônus visual (2 moedas ao mesmo tempo) ```


6. Grand Jackpot Mechanics

```csharp public class GrandJackpotEngine { private decimal jackpotAccumulation = 50.00m; // Começa em R$ 50

public void OnSpinCompleted(decimal bet) {
    // 1% de cada aposta vai para o Grand
    jackpotAccumulation += (bet * 0.01m);
}

public bool CheckGrandTrigger() {
    // Triggered somente ao completar 15/15 no Hold & Spin
    // Probabilidade: 1 em 50.000 spins
    Random rand = new Random();
    return rand.Next(50000) == 0;
}

public void DeliverGrand(int[] reelStops) {
    if (CheckGrandTrigger()) {
        ShowGrandJackpotAnimation();
        Player.Balance += jackpotAccumulation;
        jackpotAccumulation = 50.00m;  // Reset
    }
}

} ```


7. Respin Simulation Logic

```csharp public class RespinSimulation {

public RespinResult SimulateNextRespin() {
    // 1. Requisita novo spin do servidor
    Outcome respinOutcome = PoolEngine.FetchRespin();

    // 2. Obtém paradas de rolos
    int[] stops = OutcomeBuilder.GetReelStops(respinOutcome.Prize);

    // 3. Conta Moedas
    int coinCount = CountCoins(stops);

    // 4. Atualiza UI
    return new RespinResult {
        CoinCount = coinCount,
        NewTotalValue = RecalculateTotal(),
        RespinsLeft = (coinCount > 0) ? 3 : respinsRemaining - 1
    };
}

} ```


8. G2S Integration for Hold & Spin

Respin Request: json { "terminal_id": "000003", "spin_id": "parent_spin_id", "respin_number": 1, "coins_so_far": 7, "grid_positions_filled": 7 }

Respin Response: json { "respin_id": "RS1_20260403_000003", "new_coin_value": 250, "new_coins_count": 2, "total_prize_so_far": 5000, "grand_jackpot_check": false }


9. Near Miss Engineering for Coins

```csharp public class NearMissEngine {

public void ApplyNearMissStrategy(VirtualReels reels, string rtpMode) {
    if (rtpMode == "97") {
        // Coloca Moedas logo antes/depois de posições de parada
        // Aumenta visibilidade psicológica
        for (int r = 1; r < 4; r++) {  // Rolos 2-4
            for (int i = 0; i < reels[r].Count; i++) {
                if (reels[r][i] == Coin) {
                    // Blank depois de Moeda (near miss effect)
                    reels[r][(i + 1) % reels[r].Count] = Blank;
                }
            }
        }
    }
}

} ```


10. Audio Sync

```csharp public void PlayHoldAndSpinAudio() { AudioManager.PlayBackground("forroPercussion.wav", loop: true);

OnCoinAdded(() => {
    AudioManager.PlayEffect("coin_metallic.wav");
    AudioManager.IncreaseBPM(respinsRemaining == 3 ? 10 : 5);
});

OnRespinCounterReset(() => {
    AudioManager.PlayEffect("chicote_grito.wav");  // Whip + "Ê-ta!"
});

OnHoldAndSpinComplete(() => {
    AudioManager.PlayBackground("flauta_jackpot.wav");
});

} ```


11. Hardware Spec Notes


12. Testing Metrics

Métrica Target
Coin Trigger (6+) Frequency 1/145 spins ±2%
Retrigger Frequency 1/18 (RTP 94%) ±3%
Grand Jackpot 1/50.000 spins
RTP Convergence ±1% em 100k spins

Status: Pronto para Lab Testing 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, Brazilian Northeast sertão desert, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, rustic, outlawish, wild west, cinematic lighting with golden hour sun rays, color palette: dusty orange, burnt sienna, sandy beige, 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 "Cangaço Luck", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from dusty orange to burnt sienna, intricate decorative borders with leather hats 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, leather hats creature highly detailed, photorealistic rendering, vibrant colors emphasizing dusty orange, burnt sienna, sandy beige, 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: cacti, ornate design with dusty orange, burnt sienna, sandy beige 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: bandits, sparkling crystal or gem-like appearance, dusty orange and burnt sienna 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, desert landscape, animated energy radiating from center, multiple layers of glow effects in sandy beige, 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 six-shooters imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich dusty orange, burnt sienna, sandy beige 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, dusty orange, burnt sienna, sandy beige 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, dusty orange, burnt sienna, sandy beige 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 leather hats, intense rustic, outlawish, wild west atmosphere, dusty orange, burnt sienna, sandy beige color palette, volumetric lighting effects, large title text with "Cangaço Luck", 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