# **Brazilian Armed Forces (BRAF) Mod**

![BRAF Mod](https://i.imgur.com/Fe7obui.png "BRAF Mod")

Aqui consta o repositório do BRAF Mod, modificação para a plataforma Arma 3 inspiranda nas Forças Armadas Brasileiras, a ser utilizado por seus desenvolvedores procurando seguir boas práticas de programação. o versionamento do repositório é feito através do GIT utilizando o seguinte repositório:
> <http://dev.brafmod.com.br/projectbraf/braf>

## Checklist de Asset por LODs

### LODs de distância  

- LOD 1..n  
      QUALQUER ASSET DEVE TER LODs DE DISTÂNCIA
- Usar modificador decimate (Blender) em 0.5 como fator entre um LOD e outro além de retirar partes pequenas de acordo com cada LOD de distância  
- Utilizar somente um mapa UV, checar no Blender E no Object Builder o nº de mapas UV.  
- Deve possuir as seguintes *Named Properties:* (Object Builder):
  - *lodnoshadow = 1*;  
    Caso o modelo não possua LOD de sombra, seu valor deve ser 0 e devemos usar a seguinte named property no Geometry LOD:  
    - *sbsource = visualex*
      - Utilizável somente em props e prédios em geral, nada que tenha View Pilot.

### View Pilot  

- O que é visto por piloto/motorista quando se trata de veículos  
- O que é visto em primeira pessoa quando se trata de uniformes, peças de vestuário ou armas.  

### View Gunner  

- O que é visto por atirador em veículos ou lançadores estáticos.  

### View Commander  

- O que é visto por comandante em veículos.  

### View Cargo  

- O que é visto por tripulação que não seja FFV (Firing from Vehicles), esta última vira ViewGunner.  

### Geometry  

- É usado para ter colisão na engine do arma entre personagens e veículos contra objetos estáticos como árvore, casa e outras props de cenário.  
- O modelo deve ser fechado, com geometria convexa, triangulado e com sharp edges.  
- Uma vez importado para o Object Builder, selecione o objeto todo, vá em Structures -> Topology -> Find Components, em seguida adicione uma massa em kilogramas, condizente com o objeto real e no mínimo de 10kg.  
- O nº de componentes criado no passo anterior não deve ultrapassar 400 componentes, e cada componente não pode ter mais de 255 triângulos.  
- Não pode ter um segundo mapa UV.  
- Pressupondo que o objeto esta no centro da cena, deve ter no máximo 200x200 metros, mais do que isso ele não calcula colisão, não existe limite para altura.  
- Deve possuir as seguintes *Named Properties:*, todas em letras mínuscula (Object Builder):  
  - *autocenter = 1*;  
    - Caso você queira centralizar o objeto na cena.
  - *reversed = 1*;  
    - Caso você queira mudar a orientação do objeto.
  - *map = ????*;  
    - [Variados valores disponíveis aqui](https://community.bistudio.com/wiki/Arma_3:_Named_Properties#map), essa propriedade só é relevante para assets que irão em um mapa, permite que sejam mostrados os ícones no mapa 2D do jogo.  
  - *buoyancy = 1*;  
    - 1 -> objeto boiará.  
    - 0 -> objeto não boiará.  
  - *aicovers = 1*;  
    - 1 -> IA vai usar o objeto como cobertura;  
    - 0 -> Não vai usar;  
  - *canbeoccluded = 1*;  
    - 1 -> O objeto não será renderizado quando estiver atrás de objetosmaiores;  
    - 0 -> Será renderizado;  
  - *canocclude = 1*
    - 1 -> O objeto irá impedir o que estiver atrás de ser renderizado,conforme propriedade acima;  
    - 0 -> Não impedirá;
  - *damage/dammage = ???*
    - engine -> O objeto explode quando destruído.  
    - building -> O objeto irá afundar no solo e ser substituído por ummodelo em ruínas.
    - wreck -> O objeto será substituído por um modelo destruído,referenciado no LOD wreck.
    - tree -> O objeto irá tombar numa direção aleatória.  
    - tent -> O objeto irá colapsar, chapado no chão.  
    - wall -> O objeto irá tombar na direção do choque.  
  - *sbsource = shadowvolume*
    - shadowvolume -> O objeto irá gerar sombra utilizando o LOD ShadowVolume.
    - visualex -> O objeto irá gerar sombra utilizando os LOD visuais, muito mais pesados, portanto utilizado somente em objetos estáticos.

### Fire Geometry  

- Utilizado para detectar colisão e efeitos de colisão entre projetis e qualquer tipo de objeto.  
- Segue as mesmas regras gerais do LOD de Geometry, com a exceção de que não precisa ter massa e precisa ter o material de penetração (RVMAT) localizado em /a3/data_f/penetration/ aplicado a fim de calcular a balística intermediária do objeto quando atingido.  
- precisam ter os proxies dos ocupantes do veículo, do contrário, não irão sofrer dano.

### View Geometry  

- Utilizado para cálculo de oclusão (a engine não renderizará o que estiver atrás do objeto), além disso é utilizado para fazer com que a IA do jogo enxergue ou não outras entidades em jogo.  
- precisam ter os proxies dos ocupantes do veículo, do contrário, não serão atacados pela IA.
- Precisa ter menos de 3500 vértices em cada objeto.

### Geometry PhysX  

- Tipo de geometria especial utilizado para detecção e cálculo de colisão entre veículos em geral.  
- Também seguem as regras gerais do Geometry, porém devem ser o mais simples possível, e com o menor nº de componentes possível (max 3 em geral) e sem massa.  

### Geometry Buoyancy

- Tipo de geometria especial utilizada para cálculo de volume de deslocamento em veículos aquáticos ou objetos que boiam na água.  
- Também segue as regras gerais do Geometry e caso tenha mais de um componente, os mesmos não devem se intersectar.
- É relacionado com a massa definida no Geometry (e que também pode ser alterada via script).  

### Roadway

- É um tipo de superfície que permite que unidades caminhem sobre os objetos, sejam estáticos ou não.  
- É representado por planos sobrepostos ao LOD de Geometry do objeto e utiliza uma textura localizada em /a3/data_f/surfaces/ para o efeito visual e sonoro ao caminhar sobre o objeto.  
- Pressupondo que o objeto esta no centro da cena, pode ter no máximo 72x72 metros.  

### Memory  

- Define pontos de luz, direção de armas de fogo, direção de faróis, direção de escapamento, direção de efeitos de fumaça, pivôs de rotação, eixos de translação, e demais pontos de controle em geral.  

### Shadow Volume  

- Modelo 3D utilizado para o cast de sombra caso o sbsource do LOD Geometry seja diferente de visualex, e também possui n LODs de distância.
- O modelo deve ser fechado e triangulado, e deve ter sharp edges.

### Hitpoints

- Define onde certas partes destrutíveis do objeto estão, como rodas, vidros, motor, etc.
- Referência: [Arma 3 - Hitpoints](https://community.bistudio.com/wiki/Arma_3:_Hitpoints)

### Wreck  

- Modelo 3D utilizado para representar o objeto destruído quando o LOD Geometry possui a named property damage = wreck.  

### Path  

- LOD importante para a IA definir o caminho em seu interior (prédios), não requerido em objetos que a IA não precise desviar de obstáculos.  
- Vértices onde a IA pode parar precisam ser definidos por uma named selection do tipo "posXX" (XX é um número de 00 a 99).  
- Os paths funcionam melhor quando posicionados 10 cm acima da superfície do Roadway.  

### Display Picture  

- Imagem com fundo transparente e tamanho em potência de 2 (como qualquer arquivo .paa, Ex: 128x128px ou 64x128px) que será utilizada para representar o objeto na lista do editor de missões.
- Veículos também devem produzir uma displaypicture em tamanho 1x2 (128x256px por exemplo) para ser utilizado no arsenal ou na ORBAT.

## Config de Assets  

Os Mods no Arma 3 são um conjunto de PBO's (Public Bank of Files), que são nada mais do que pastas compactadas, que contém os arquivos de configuração e os assets do mod centralizadas no arquivo config.cpp na raíz da pasta em questão, todos os PBOs do BRAF comelam com o prefixo "braf_" para facilitar a identificação.

## Padronização de Nomenclaturas

Todas as classes do mod e nomes de arquivos deverão ser precedidas pelo prefixo "braf" e seguir o padrão [snake_case](https://en.wikipedia.org/wiki/Snake_case), onde todas as letras são em minúsculo e as palavras, não poderão haver carateres especiais como "ç" ou acentos como "í", mantendo de preferência em inglês, separadas por subtraços (" _ "), o motivo é que a engine/mikero por si só já transforma todas as classnames para este padrão, os nomes dos pbos também seguirão este padrão.  
  **Exemplo:**  
> "braf_uniform_rolledup_gloves"  

- Classname da farda com manga dobrada e luvas  

> "braf_static"  

- Classname do PBO de armamentos estáticos  

## Fechando o PBO

- Existem 2 maneiras de compactar uma pasta em um arquivo PBO, a primeira é pelo Addon Builder, disponível pelo Arma 3 Tools, que cumpre a missão de gerar um PBO a partir de uma pasta, porém testa o código muito grosseiramente. A segunda é pelo PBOProject ([Mikero's Tools](https://mikero.bytex.digital/)), que além de compactar a pasta em um PBO, também testa o código e o obfusca, garantindo mais segurança e testagem ao mod, o BRAF  utiliza o Mikero e sempre que possível, obfusca o PBO.  

- Um maior número de PBOs facilita a correção de bugs porém pode tornar o modo confuso, portanto tenta-se manter uma organização quanto ao tipo e juntar os assets que se relacionam em um mesmo PBO.  

- ### Obfuscado x Não Obfuscado

  - A obfuscação do PBOProject (Mikero), garante mais uma camada de segurança e de testagem ao mod, porém implica limitações, nenhum arquivo poderá conter acentos ou caracteres especiais em seu nome e todas as texturas que forem chamadas após a criação do asset, como via script ou texturas de dado, deverão ficar em um pbo a parte. Mesmo quando não obfuscado, é recomendando usar o Mikero pois ele testa o código e aponta erros de sintaxe queo Addon Builder deixa passar, o que facilita a correção de bugs. **Todos os PBOs do BRAF são binarizados, independente de serem ou não obfuscados**.  
