Jogo #18

Pesca Premiada

Volatilidade
Média (Prêmios previsíveis e transparentes)
Grid
RTP

Game Design Document (GDD)

Jogo 18 - Pesca Premiada

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Referência Zitro: Fishmania / Fish Catch (Coleta de Dinheiro + Mecânica Física) Desenvolvedor: Oktop.AI - BuildSense Vertical


1. Resumo Executivo

Pesca Premiada é um jogo de bingo casual e temático focado em interação física simulada. Um pescador coleta valores monetários visíveis na tela. O diferencial está na ilusão de "habilidade" (mecânica Press & Hold) combinada com determinismo matemático do Pool Finito.

Classificação


2. Identidade Visual e Atmosfera

Tema

Pesca Artesanal Brasileira - "Ribeirão de Ouro" - Referência: Rios do Paraná, vida fluvial, pescadores tradicionais - Ambiente: Beira de rio ao anoitecer, palmeiras, canoagem - Cores: Azul-Turquesa, Verde Floresta, Laranja Pôr do Sol, Dourado

Elementos Visuais

  1. Cenário: Rio tranquilo com vegetação. Luz natural dourada. Ondas suaves.
  2. Cartelas: Apresentadas como "bilhetes de pesca" (pergaminho estilizado).
  3. Peixes: Animais 2D nado suave com valores monetários flutuantes acima deles.
  4. Pescador: Personagem animado que lança anzol com mecânica "Press & Hold".
  5. Barra de Força: Representada visualmente como "tensão na linha" (escala 0-100%).

Paleta de Cores

Azul Turquesa: #00D9FF Verde Floresta: #228B22 Laranja Sunset: #FF8C00 Dourado: #FFD700 Marrom Madeira: #8B4513


3. Mecânica Core

3.1 Bingo Base (Igual ao Power Bingo)

3.2 Mecânica de "Pesca" (Coleta)

Trigger: Padrão "Duplo H" (formato de H - colunas 1 e 5 completas)

Padrão Duplo H (Exemplo): ┌─────────────────┐ │ X [ ] [ ] [ ] X │ │ X [ ] [ ] [ ] X │ │ X [ ] [ ] [ ] X │ └─────────────────┘ Colunas marcadas: 0 e 4 (todas as 3 linhas)

Acionamento: Quando o padrão é detectado: 1. Áudio de sucesso ("Ding!") 2. Tela transiciona para "Tela de Pesca" 3. Anzol aparece no topo 4. Peixes aparecem em 3 camadas (profundidade visual)

3.3 Interface de Pesca (Press & Hold)

Visual: - Barra de Força: Mede de 0 a 100%, com agulha animada oscilando - Feedback: Visual com cor (verde → amarelo → vermelho conforme aumenta) - Som: Tremendo de linha ("Tssshhhhh" contínuo)

Mecânica: 1. Jogador aperta o botão PESCAR 2. Barra de força começa a encher 3. Agulha sobe de 0 a 100 em ~3 segundos 4. Se soltar cedo (0-40%): Anzol fraco, pega peixes pequenos 5. Se soltar médio (40-70%): Anzol médio, pega peixes de tamanho variado 6. Se soltar forte (70-100%): Anzol forte, pega peixes grandes 7. TWIST: A força NÃO importa. O peixe capturado é pré-determinado.

3.4 O Segredo: Inverse Kinematics (IK)

O Problema: No Pool Finito, o prêmio já está decidido. Não pode parecer que a "habilidade" do jogador determina a captura.

A Solução: O sistema renderiza um alvo visual (posição na água), e o servidor já decidiu que peixe será capturado. O anzol usa Inverse Kinematics (IK) para sempre acertar o peixe correto, independente da força aplicada.

``` Exemplo: - Bilhete: Prêmio = R$ 100,00 (correspondente a 1 Peixe Dourado) - Servidor define: Posição do Peixe Dourado = [640px, 400px] - Jogador aplica força = 35% (fraco) - Anzol deveria cair em [400px, 500px] (posição fraca) - MAS: Sistema IK ajusta a trajetória do anzol - Resultado final: Anzol acerta o Peixe Dourado

Feedback ao Jogador: "Que sorte! O peixe pulou no anzol!" ```

3.5 Tabela de Peixes e Valores

Tipo de Peixe Tamanho Valor Frequência
Lambari Pequeno R$ 10 30%
Traíra Médio R$ 25 25%
Dourado Grande R$ 50 20%
Cachara Muito Grande R$ 100 15%
Surubim Gigante R$ 200 10%

4. Bônus: "Pescaria Premiada" (Coleta Múltipla)

4.1 Trigger Adicional

Se o padrão é "Perímetro" (moldura) → Bônus de Múltiplas Pescarias

4.2 Mecânica

Em vez de pescar UM peixe, jogador pesca TRÊS vezes seguidas: 1. Primeira pesca (força livre) 2. Segunda pesca (força livre) 3. Terceira pesca (força livre)

Total de valor = Soma dos 3 peixes


5. Tabela de Pagamentos (Padrões Base)

Padrão Paga Prêmio (Base R$10)
Linha Simples Sim R$ 50,00
Coluna Simples Sim R$ 75,00
Duplo H (Coluna 1+5) Sim → PESCA R$ 100,00
Diagonal Sim R$ 150,00
Perímetro Sim → 3 PESCAS R$ 300,00
Bingo Completo Sim R$ 500,00

6. Engenharia de RTP

6.1 Target RTP: 92%

Decomposição: RTP Padrões Base: 80% RTP Coleta (Pesca): 10% RTP Bônus Múltiplo: 2% Total: 92%

6.2 Hit Frequency Controlada

``` Estratégia: Este jogo deve pagar SEMPRE para manter engajamento.


7. Áudio Design

7.1 Voz Narrador

Ator: Homem maduro com sotaque natural do Paraná (Tom relaxante, não frenético)

Frases: ``` Padrões: ├─ "LINHA COMPLETA!" (tom tranquilo) ├─ "COLUNA PRONTA!" (tom feliz) ├─ "DUPLO H! VAMOS PESCAR!" (entusiamado, convite) └─ "BINGO TOTAL! SUPER PRÊMIO!" (grito feliz)

Pesca: ├─ "APERTE O BOTÃO PARA PESCAR!" (instruções claras) ├─ "A LINHA TENSA!" (tensão) ├─ "PEIXE GRANDE! PUXE!" (adrenalina) └─ "PEGOU! QUE BELEZA!" (sucesso) ```

7.2 Efeitos Sonoros

Linha Tremendo: "Tssshhhhh..." (contínuo) Anzol Caindo: "Splooosh!" (queda na água) Peixe Fisgado: "Tssing!" (metal vibrante) Peixe Capturado: "Ding!" + Som de vidro (vitória) Bônus Múltiplo: "Ploop ploop ploop!" (3 quedas rápidas) Bingo Completo: Sino de Igreja (epico, 3 segundos)

7.3 Música de Fundo

Gênero: Bossa Nova Suave (Guitarra + Pandeiro) Tempo: 80 BPM Dinâmica: Aumenta quando pesca é acionada


8. Conformidade Lottopar

8.1 Ilusão vs. Realidade

8.2 Mensagens Obrigatórias

``` ANTES DE PESCAR: "O resultado já foi definido. Sua habilidade não afeta o prêmio." (Nota: Pode ser omitida se juridicamente not required)

PÓS-VITÓRIA: "Parabéns! Você venceu R$ 100,00 em Pesca Premiada." ```


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

9.1 Plataforma

9.2 Componentes Críticos


10. Notas de Implementação

  1. Constraint Solver: Validar que "Duplo H" não cria conflitos com outras cartelas
  2. IK Solver: Usar biblioteca grátis da Unity (DOTS ou LateralUS)
  3. Fish Pool: Pré-compilar 20 variantes de peixes para LOD

Versão

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

Technical Design Document (TDD)

Jogo 18 - Pesca Premiada

Versão: 1.0 Data: 2026-04-03 Mercado: Brasil (Paraná - Lottopar) Arquitetura: Pool Finito + Input Masking (IK)


1. Visão Geral Técnica

Pesca Premiada usa Input Masking: O cliente recebe entrada do jogador (força do anzol), mas o servidor já decidiu qual peixe será capturado. O cliente então ajusta visualmente o resultado para parecer que corresponde à entrada.


2. Fluxo Técnico

``` 1. Padrão "Duplo H" detectado └─ Bilhete do Pool: Prêmio = R$ 100,00 (Peixe Dourado)

  1. Transição para Tela de Pesca └─ Servidor define: FishToCapture = DOURADO @ [640px, 400px]

  2. Cliente Renderiza UI de Pesca └─ Botão "PESCAR" ativo └─ Barra de força (0-100%)

  3. Jogador Aperta Botão └─ Duração: T segundos (variável) └─ Força Resultante: F = (T / 3.0) * 100%

  4. Cliente Calcula Trajetória Naïve (sem IK) └─ TargetPosition = CalculateThrowDistance(F) └─ Exemplo: F=30% → TargetPos = [400px, 500px] (próximo) └─ Exemplo: F=80% → TargetPos = [800px, 600px] (longe)

  5. TWIST: Sistema IK Ativa └─ IK Solver ajusta trajetória do anzol └─ Garante interceptação no Peixe Pré-Decidido └─ AnimateHook(startPos, actualFishPos, duration)

  6. Animação da Captura └─ Anzol acerta peixe └─ Peixe "puxa linha" └─ Recolher animação

  7. Renderizar Prêmio └─ Valor R$ 100,00 exibido └─ Áudio de vitória └─ Retorno ao Bingo ```


3. Classe de Mapeamento de Peixes

```csharp public class FishCaptureSystem { // Definição de tipos de peixe public enum FishType { LAMBARI, // R$ 10 TRAIRA, // R$ 25 DOURADO, // R$ 50 CACHARA, // R$ 100 SURUBIM // R$ 200 }

public class FishData
{
    public FishType Type;
    public Vector2 SpawnPosition;
    public decimal PrizeAmount;
    public string AnimationName;
    public int SizeMultiplier;
}

// Pool de peixes na tela
private List<FishData> activeFishes = new();
private Dictionary<FishType, decimal> fishPrizes = new()
{
    { FishType.LAMBARI, 10m },
    { FishType.TRAIRA, 25m },
    { FishType.DOURADO, 50m },
    { FishType.CACHARA, 100m },
    { FishType.SURUBIM, 200m }
};

public void InitiateFishingMode(decimal targetPrize)
{
    // Determinar qual tipo de peixe corresponde ao prêmio
    FishType targetFish = MapPrizeToFish(targetPrize);

    // Gerar posições aleatórias para peixes "decoy"
    SpawnDecoyFishes();

    // Colocar peixe alvo em posição específica (determinada pelo servidor)
    var targetFishData = new FishData
    {
        Type = targetFish,
        SpawnPosition = GetServerDefinedPosition(targetFish),
        PrizeAmount = targetPrize
    };

    activeFishes.Add(targetFishData);
}

private FishType MapPrizeToFish(decimal prize)
{
    return prize switch
    {
        10m => FishType.LAMBARI,
        25m => FishType.TRAIRA,
        50m => FishType.DOURADO,
        100m => FishType.CACHARA,
        200m => FishType.SURUBIM,
        _ => FishType.LAMBARI // Fallback
    };
}

private void SpawnDecoyFishes()
{
    // Criar 4-6 peixes aleatórios para "enganar" visualmente
    var random = new Random();
    int decoyCount = random.Next(4, 7);

    for (int i = 0; i < decoyCount; i++)
    {
        var decoyFish = new FishData
        {
            Type = (FishType)random.Next(0, 5),
            SpawnPosition = RandomizePosition(),
            PrizeAmount = 0 // Não será capturado
        };

        activeFishes.Add(decoyFish);
    }
}

} ```


4. Inverse Kinematics (IK) para Anzol

4.1 FABRIK Algorithm (Forward And Backward Reaching IK)

```csharp public class HookIKSolver { private Vector2 basePosition; // Ponta da vara private Vector2 targetFishPosition; // Alvo (pré-determinado) private float lineLength = 2.0f; // Comprimento da linha

public Vector2 SolveIK(
    Vector2 userInputTarget,
    Vector2 actualFishPosition,
    float forcePercentage)
{
    // O userInputTarget é baseado na força do jogador
    // Mas o actualFishPosition é pré-determinado pelo servidor

    // FABRIK usa múltiplas iterações para ajustar a trajetória
    Vector2[] bones = new Vector2[3]
    {
        basePosition,           // Base da vara
        basePosition + Vector2.Down * 1.0f, // Meio da linha
        actualFishPosition      // Anzol final (FORÇADO ao peixe)
    };

    // Iterações FABRIK (5-10 iterações para suavidade)
    int iterations = 10;
    for (int i = 0; i < iterations; i++)
    {
        // Forward: Ajustar cada osso para manter distância
        for (int j = 1; j < bones.Length; j++)
        {
            Vector2 direction = (bones[j] - bones[j - 1]).normalized;
            bones[j] = bones[j - 1] + direction * (lineLength / bones.Length);
        }

        // Backward: Forçar última posição ao alvo
        bones[2] = actualFishPosition;
    }

    return bones[2]; // Posição final do anzol
}

public IEnumerator AnimateHookCast(
    Vector2 startPos,
    Vector2 endPos,
    float duration)
{
    float elapsed = 0f;

    while (elapsed < duration)
    {
        elapsed += Time.deltaTime;
        float t = elapsed / duration;

        // Curva de Bézier para queda natural
        Vector2 hookPos = BezierCurve(startPos, endPos, t);

        // Atualizar posição do anzol visualmente
        UpdateHookPosition(hookPos);

        yield return null;
    }
}

private Vector2 BezierCurve(Vector2 start, Vector2 end, float t)
{
    // Curva quadrática para movimento mais natural
    Vector2 control = (start + end) / 2f + Vector2.Down * 0.5f;

    Vector2 p0 = Vector2.Lerp(start, control, t);
    Vector2 p1 = Vector2.Lerp(control, end, t);

    return Vector2.Lerp(p0, p1, t);
}

} ```

4.2 Integração com UI de Força

```csharp public class FishingInputHandler { private float pressStartTime; private float maxForceDuration = 3.0f; private HookIKSolver ikSolver;

public void OnFishButtonPressed()
{
    pressStartTime = Time.time;
    StartCoroutine(AnimateForceBar());
}

public void OnFishButtonReleased()
{
    float forceDuration = Time.time - pressStartTime;
    float forcePercentage = Mathf.Clamp01(forceDuration / maxForceDuration) * 100f;

    // Calcular trajetória "esperada" baseada em força
    Vector2 expectedTarget = CalculateExpectedThrowDistance(forcePercentage);

    // MAS: O servidor já decidiu o peixe alvo
    Vector2 actualFishPos = GetServerDefinedFishPosition();

    // IK Solver ajusta a trajetória
    Vector2 hookedPosition = ikSolver.SolveIK(
        expectedTarget,
        actualFishPos,
        forcePercentage);

    // Animar captura
    StartCoroutine(AnimateCapture(hookedPosition));
}

private Vector2 CalculateExpectedThrowDistance(float forcePercentage)
{
    float distance = (forcePercentage / 100f) * 200f; // 0-200 pixels
    return new Vector2(640 + distance, 400 + distance);
}

private IEnumerator AnimateForceBar()
{
    float elapsed = 0f;
    while (Input.GetMouseButton(0)) // Button held
    {
        elapsed += Time.deltaTime;
        float fillAmount = Mathf.Clamp01(elapsed / maxForceDuration);

        // Atualizar barra visualmente
        UpdateForceBarUI(fillAmount);

        yield return null;
    }
}

} ```


5. Banco de Dados - Fishing Round

```sql CREATE TABLE fishing_rounds ( fishing_id INTEGER PRIMARY KEY AUTOINCREMENT, round_id INTEGER NOT NULL,

trigger_pattern VARCHAR(50), -- "DOUBLE_H" | "PERIMETER"

target_fish_type VARCHAR(20),
target_fish_position TEXT, -- JSON [x, y]
target_prize DECIMAL(10, 2),

player_force_duration FLOAT,
player_force_percentage INT,

hook_final_position TEXT, -- JSON [x, y]
fish_caught_type VARCHAR(20),
prize_amount DECIMAL(10, 2),

fishing_count INT DEFAULT 1, -- 1 for single, 3 for bonus

timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,

FOREIGN KEY (round_id) REFERENCES game_rounds(round_id)

);

CREATE INDEX idx_fishing_round ON fishing_rounds(round_id); ```


6. Validação de Integridade

```csharp public class FishingIntegrityValidator { public bool ValidateFishingResult( FishingRound result, decimal expectedPrize) { // Verificação 1: Prêmio capturado corresponde ao esperado if (Math.Abs(result.PrizeAmount - expectedPrize) > 0.01m) { LogSecurityAlert("FISHING_INTEGRITY_ERROR: Prize mismatch"); return false; }

    // Verificação 2: Força aplicada é razoável (0-100%)
    if (result.PlayerForcePercentage < 0 || result.PlayerForcePercentage > 100)
    {
        LogSecurityAlert("FISHING_INTEGRITY_ERROR: Invalid force percentage");
        return false;
    }

    // Verificação 3: Duração do input é consistente
    float expectedDuration = (result.PlayerForcePercentage / 100f) * 3.0f;
    float tolerance = 0.1f; // ±100ms

    if (Math.Abs(result.PlayerForceDuration - expectedDuration) > tolerance)
    {
        LogSecurityAlert("FISHING_INTEGRITY_ERROR: Force duration mismatch");
        return false;
    }

    return true;
}

} ```


7. Performance (IK Solver)

FABRIK Iterations: 10 (per frame if animating) CPU Cost per Hook: ~0.5 ms Total Budget: < 2 ms for all fishing logic


8. Testes QA

Teste Entrada Esperado Critério
T001 Force=0% Peixe próximo Acerto 100%
T002 Force=50% Peixe médio Acerto 100%
T003 Force=100% Peixe longe Acerto 100%
T004 Prize=R$100 Cachara capturado 100% match
T005 Bonus múltiplo 3 peixes somados RTP ±2%

Versão

v1.0 - 2026-04-03 Arquiteto: Graphics/Physics - 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, Tropical fishing paradise, ultra-detailed environment, immersive 3D background, lush vegetation and natural elements, relaxing, rewarding, fishing adventure, cinematic lighting with golden hour sun rays, color palette: water blue, golden sun, sand 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 "Pesca Premiada", ornate and elegant typography, bold letters with gold leaf embossing, luxurious gradient background transitioning from water blue to golden sun, intricate decorative borders with fishing boats 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, fishing boats creature highly detailed, photorealistic rendering, vibrant colors emphasizing water blue, golden sun, sand 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: golden fish, ornate design with water blue, golden sun, sand 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: ocean, sparkling crystal or gem-like appearance, water blue and golden sun 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, tropical island, animated energy radiating from center, multiple layers of glow effects in sand 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 trophies imagery, embossed surface detail, reflection and dimension, surrounded by floating particles and light, rich water blue, golden sun, sand 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, water blue, golden sun, sand 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, water blue, golden sun, sand 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 fishing boats, intense relaxing, rewarding, fishing adventure atmosphere, water blue, golden sun, sand beige color palette, volumetric lighting effects, large title text with "Pesca Premiada", 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