Balística

Ballistics

Especificação do sistema de balística: energia real por munição, voo com gravidade e arrasto, zeroing, penetração de materiais, ricochete e o modelo de implementação na UE 5.8.

Última edição em 07/07/2026, 20:14 por Admin

Balística

Página de game design (não diegética). Especifica o sistema de balística de The Sync Survival: cada projétil é um objeto físico com massa, velocidade e energia — o dano é consequência, nunca um número mágico.

1. Princípio: energia derivada, não inventada

Cada munição é definida por calibre, massa do projétil e velocidade inicial. Tudo o mais deriva disso:

Energia (J) = ½ × massa (kg) × velocidade² (m/s)

Tabela de referência das famílias de calibre (valores de design):

CalibreMassaVel. inicialEnergia na bocaPerfil
9×19 mm (pistola)8,0 g360 m/s~520 Jcurta distância, perde energia rápido
.45 (pistola pesada)15,0 g260 m/s~500 Jlento, pancada grande, queda acentuada
5,56×45 (fuzil leve)4,0 g920 m/s~1.690 Jreto e rápido, sofre mais com barreiras
7,62×39 (fuzil)7,9 g730 m/s~2.100 Jequilíbrio energia/penetração
7,62×51 (fuzil de batalha/DMR)9,5 g840 m/s~3.350 Jmantém letalidade a centenas de metros
Calibre pesado (anti-material)42 g900 m/s~17.000 Jatravessa cobertura; raridade de endgame
12ga (espingarda, balote)28 g400 m/s~2.240 Jdevastador perto, inútil longe

2. Voo do projétil

Dois fatores agem sobre o projétil em voo:

  • Gravidade — queda constante; a compensação é o zeroing da mira (estágios 100/200/300/400 m).
  • Arrasto — perda exponencial de velocidade, com coeficiente por forma/calibre:
Velocidade(d) = v0 × e^(−k × d)     k = coeficiente de arrasto do projétil
Queda(d)      ≈ ½ × g × t²          t = tempo de voo até a distância d

Consequências de design: a Energia Restante no impacto (fração da energia inicial) entra direto na fórmula de dano; projéteis subsônicos (< 343 m/s) não estalam ao passar e caem muito mais; vento (se habilitado) só afeta tiros > 250 m, com intensidade por região (forte em Scorchlands e na costa de Coastal Towns).

3. Penetração de materiais

Cada material tem um custo de energia por centímetro atravessado. O projétil que atravessa continua o voo com a energia restante e um pequeno desvio angular:

MaterialCusto (J/cm)Exemplo no mundo
Vidro~50janelas de Seaview
Madeira~150portas, paliçadas
Chapa metálica fina~400portas de carro, silos de Silohold
Alvenaria/tijolo~900casas de Milltown
Concreto/aço estrutural~2.000+bunkers, The Wall

Regra prática: pistola não atravessa nem porta de carro com energia útil; fuzil de batalha atravessa parede de tijolo e ainda fere; calibre pesado ignora cobertura leve. Atirar através de paredes finas funciona — com dano reduzido e sem garantia de trajetória.

Munição perfurante (AP) multiplica a eficiência contra materiais e armaduras (custo de penetração ÷ 2), com dano de tecido levemente menor (furo "limpo").

4. Ricochete

Impactos oblíquos em superfícies duras podem ricochetear em vez de penetrar:

  • Ângulo raso (< ~20° da superfície) + material duro (aço, concreto) = chance alta;
  • O projétil perde 40–70% da energia e segue em trajetória desviada — ainda perigoso;
  • Ambientes industriais (Foundry District, Rail Yard, Cargo Field) são zonas de ricochete por natureza — atirar em corredor de contêineres tem preço.

5. Supressão

Projéteis passando perto (< ~1,5 m) aplicam supressão mesmo sem acertar: sway momentâneo, visão estreitada, +Dor psicológica leve. Calibres maiores suprimem mais. É o que torna fogo de cobertura uma tática real.

6. Tipos de munição

TipoEfeito
Comumperfil de fábrica da tabela §1
Perfurante (AP)penetração ×2 contra materiais/armadura; dano de tecido −15%
Subsônicasilenciosa com supressor; energia baixa; queda acentuada; só faz sentido < 150 m
Improvisadarecarregada nos assentamentos (Iron Haven, Sanctuary Prime): −20% de energia, dispersão maior, ~2% de falha, desgasta o cano; cada cartucho carrega o próprio estado de conservação

7. Implementação (UE 5.8)

Duas abordagens padrão da engine, usadas de forma híbrida:

  1. Trace preditivo segmentado (autoridade no servidor) — o projétil é simulado por segmentos de linha a passos fixos de tempo (substepping), aplicando gravidade e arrasto a cada passo. Barato, determinístico e ideal para multiplayer: o servidor resolve acertos/penetração; o cliente só renderiza.
  2. Tracer visual no cliente — a representação visual (Niagara) segue a mesma trajetória calculada, desacoplada da lógica.
// Passo de simulação server-side (substep fixo, ex.: 1/120 s)
USTRUCT()
struct FBallisticState
{
    GENERATED_BODY()
    FVector Position;
    FVector Velocity;      // m/s
    float   MassKg;        // massa do projétil
    float   DragK;         // coeficiente de arrasto (por munição)
    float   EnergyJ() const { return 0.5f * MassKg * Velocity.SizeSquared(); }
};

void StepBallistics(FBallisticState& S, float Dt, UWorld* World)
{
    // 1. Integra forças: gravidade + arrasto exponencial
    const FVector Gravity(0, 0, -980.f * 0.01f);            // m/s²
    S.Velocity += Gravity * Dt;
    S.Velocity *= FMath::Exp(-S.DragK * S.Velocity.Size() * Dt);

    // 2. Trace do segmento deste passo
    const FVector End = S.Position + S.Velocity * Dt * 100.f; // m → cm
    FHitResult Hit;
    if (World->LineTraceSingleByChannel(Hit, S.Position, End, ECC_Bullet))
    {
        // 3. Resolve: ricochete (ângulo raso + material duro),
        //    penetração (energia vs custo do material × espessura)
        //    ou impacto final (entra no pipeline de dano — ver Sistema de Dano)
        ResolveImpact(S, Hit);
        return;
    }
    S.Position = End;
}
// Penetração: trace de saída mede a espessura do obstáculo
bool TryPenetrate(FBallisticState& S, const FHitResult& Hit)
{
    const float ThicknessCm = MeasureExitThickness(Hit);          // trace reverso
    const float CostJ = GetMaterialCostPerCm(Hit.PhysMaterial) * ThicknessCm
                        / GetAmmoAPMultiplier(S);                 // AP divide o custo
    if (S.EnergyJ() <= CostJ)
        return false;                                             // parou no material

    const float Remaining = S.EnergyJ() - CostJ;                  // energia que sobra
    S.Velocity = ApplyExitDeviation(S.Velocity, Hit)              // pequeno desvio
               * FMath::Sqrt(2.f * Remaining / S.MassKg) / S.Velocity.Size();
    return true;                                                  // continua voando
}

8. Exemplos de comportamento esperado

  • Pistola 9 mm a 150 m: chega com fração da energia — ferimento e sangramento, não abate.
  • Fuzil 7,62 a 300 m: energia letal preservada; a diferença entre calibres aparece na penetração e no sangramento.
  • AP vs colete classe III: atravessa com dano razoável; comum no mesmo colete não penetra, mas o trauma (Choque) pode derrubar — e o colete degrada (ver Proteção e Armaduras).
  • Capacete balístico: segura fragmentos e pistola (com possível nocaute por Choque); contra fuzil, a energia excedente atravessa.
  • Tiro na Dead Zone: miras eletrônicas não funcionam — zeroing manual e ferro; o frio denso aumenta levemente o arrasto (ajuste de bioma).