> ## Documentation Index
> Fetch the complete documentation index at: https://rust-co.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Configuração

> Tudo o que dá para mudar no config/config.lua, explicado em palavras simples.

Todas as opções ficam num arquivo só: `rco-gym/config/config.lua`. Abra com qualquer editor de texto (o Bloco de Notas serve, o VS Code é mais confortável).

> [!TIP]
>
> Mude só o que vem depois do sinal `=`. Mantenha as aspas `'...'`, as vírgulas e as chaves exatamente como estão. Depois de salvar, reinicie o servidor.

## O básico

| Opção | O que faz | Padrão |
| - | - | - |
| `Config.Locale` | Idioma dos textos na tela: `'en'` ou `'pt-br'` | `'en'` |
| `Config.Framework` | Deixe `'auto'`. Só escreva `'rsg'` ou `'vorp'` se o script errar | `'auto'` |
| `Config.Debug` | Mostra no console F8 o que o script faz, para configurar. Desligue antes de abrir para os jogadores | `false` |
| `Config.UseDistance` | A que distância (metros) o jogador precisa estar de um aparelho para ver as teclas | `1.2` |
| `Config.ShowDistance` | Dentro desta distância (metros) do meio de uma academia os aparelhos dela aparecem e o treino dos outros jogadores é mostrado | `60.0` |

### Outro idioma

Copie `locales/en.json`, traduza o texto do lado direito de cada linha, salve como por exemplo `locales/es.json` e coloque `Config.Locale = 'es'`. O que não for traduzido aparece em inglês.

## As academias

`Config.Gyms` lista todas as academias do seu servidor. A de Strawberry já vem pronta como a primeira, com as 16 estações. Você pode criar quantas academias quiser, em qualquer lugar do mapa, e colocar cada estação separada.

```lua theme={"dark"}
Config.Gyms = {
    {   -- a academia de Strawberry (já vem pronta)
        name = nil,
        blip = { coords = vector3(-1836.6, -407.0, 162.39), sprite = 'blip_shop_market_stall' },
        building = 'strawberry',
        stations = {
            { type = 'supino', coords = vector4(-1835.6349, -404.0478, 162.3875, -125.0) },  -- Supino
            -- ... as outras 15 estações
        },
        board = vector4(-1836.59, -402.61, 162.39, 55.0),
    },
    {   -- uma academia sua
        name = 'Saint Denis Gymnasium',
        blip = { sprite = 'blip_shop_market_stall' },
        building = 'props',
        stations = {
            { type = 'supino', coords = vector4(x, y, z, heading) },
            { type = 'halteres', coords = vector4(x, y, z, heading) },
            { type = 'tapete', coords = vector4(x, y, z, heading) },
        },
        board = vector4(x, y, z, heading),
    },
}
```

| Configuração | O que faz |
| - | - |
| `name` | O nome do blip da academia. `nil`: "Academia" na língua do jogador |
| `blip` | `{ coords = vector3(...), sprite = '...' }`: onde o blip fica e o ícone dele (um nome dos blips do jogo). Sem `coords` o blip vai no meio da academia. `false`: sem blip |
| `building` | `'strawberry'`: o prédio da academia que vem com o recurso, com os aparelhos já dentro. `'props'`: o script coloca os aparelhos, sólidos, onde você puser as estações (ao ar livre, num prédio, em outro MLO) |
| `stations` | As estações, cada uma com o `type` e as `coords` dela |
| `board` | O quadro de recordes: onde o jogador fica para ler, de frente para ele. O quadro vai na parede 1 m à frente dele. Sem esta linha, sem quadro |

### Montar uma academia peça por peça

1. Copie a entrada de Strawberry, dê um `name` para a cópia e coloque `building = 'props'`.
2. Deixe só as linhas das estações que você quer. Copie uma linha para ter a mesma estação duas vezes (dois bancos: duas linhas `supino`).
3. Para cada estação, fique onde o jogador deve usar, de frente para onde ele deve ficar virado, e pegue sua posição e direção com a ferramenta de coordenadas que o seu servidor já usa. Escreva como `vector4(x, y, z, heading)`.
4. Reinicie o servidor.

As coordenadas são a posição do próprio jogador em pé no chão: pegue a pé, não a cavalo nem num veículo.

### Os tipos de estação

| Tipo | Estação | Chão que precisa (metros, largura × comprimento na direção em que o jogador olha) |
| - | - | - |
| `supino` | Supino | 1,9 × 2,7, o banco atrás do lugar do jogador |
| `agachamento` | Suporte de agachamento | 1,9 × 1,6 |
| `halteres` | Estante de halteres (rosca e desenvolvimento) | 3,7 × 1,3, a estante 0,4 m à frente |
| `tapete` | Tapete (flexão, abdominal, agachamento livre) | 1,1 × 1,9 |
| `barra_fixa` | Barra fixa | 2,0 × 2,3, 2,6 m de altura: pé-direito de 2,7 m ou mais |
| `paralelas` | Paralelas | 0,9 × 2,5, 1,15 m de altura |
| `escada` | Escada horizontal | 1,5 × 3,2 (de 0,5 m atrás do lugar a 2,7 m à frente), 2,3 m de altura: pé-direito de 2,6 m |
| `argolas` | Argolas | 1,2 × 1,2. Ficam penduradas num ponto 4,0 m acima do chão |
| `corda` | Corda de subir | 1,0 × 1,2. A corda fica pendurada num ponto 4,0 m acima do chão, e a subida chega a 3 m |
| `saco` | Saco de pancada | 1,2 × 1,6. Fica pendurado num ponto 4,0 m acima do chão |
| `bola` | Bola de pancada | 1,0 × 1,3. A plataforma vai numa parede 0,95 m à frente do jogador (de 1,4 a 1,9 m de altura) |
| `polias` | Polia (puxada, remada, peito) | 1,0 × 1,6, duas colunas 0,75 m à frente e atrás do jogador, 2,1 m de altura |
| `barra_no_chao` | Barra no chão (arremesso, rosca com barra) | 1,9 × 1,6 |
| `medicine_ball` | Medicine ball em dupla | 0,8 × 4,0: o parceiro pega 3 m à frente |
| `corda_de_pular` | Corda de pular | 1,4 × 1,5 |

> [!TIP]
>
> Deixe uns 0,7 m entre as estações. Cada exercício tem a própria câmera, de 1,5 a 3,5 m da estação, quase sempre na frente e para um lado: uma parede nesse lugar põe a câmera atrás da parede. As argolas, a corda de subir e o saco de pancada ficam melhor debaixo de uma viga ou de um teto a uns 4 m de altura.

> [!NOTE]
>
> `cam = 2` numa linha de banco usa a outra câmera do banco, do outro lado. O segundo banco da academia de Strawberry usa.

### Tirar a academia de Strawberry

Apague (ou comente) a entrada dela em `Config.Gyms`: as estações e o blip somem. O prédio de Strawberry vem nos arquivos do recurso (as pastas `stream/mlo` e `stream/placas`) e nenhuma configuração impede que ele carregue. Para voltar a casa à original do jogo, apague também essas duas pastas.

## Teclas

| Opção | O que faz | Padrão |
| - | - | - |
| `Config.ExerciseKeys` | Uma tecla para cada exercício que o aparelho oferece, em ordem | **E**, **G**, **F** |
| `Config.RepKey` | A tecla principal dos minigames, e começar na escolha de carga | **ESPAÇO** |
| `Config.GameKeys` | As outras teclas dos minigames: esquerda, direita, cima, baixo. Esquerda e direita também escolhem a carga e passam as páginas do quadro de recordes | **A**, **D**, **W**, **S** |
| `Config.LeaveKey` | Termina a série e sai do aparelho, e fecha a escolha de carga e o quadro de recordes | **X** |

> [!NOTE]
>
> As teclas são escritas como os hashes de controle do jogo (como `0xCEFD9220`), não como letras: o hash de cada tecla está na página [Teclas](https://rust-co.mintlify.site/pt-BR/keys.md). Na escolha de carga e no quadro de recordes as setas e o **Esc** também funcionam.

## Os minigames

| Opção | O que faz | Padrão |
| - | - | - |
| `Reps` | Repetições numa série. A série termina sozinha depois delas | `10` |
| `Ease` | Toda janela de tempo e zona de acerto vezes isto: `1.3` é mais fácil, `0.8` mais difícil | `1.0` |
| `Pause` | Segundos que o resultado fica na tela antes da próxima rodada | `0.7` |
| `KeyLag` | Segundos que um aperto de tecla leva para chegar na tela. O tempo é julgado isso antes | `0.035` |
| `HeavyLoad` | Com a carga máxima do jogador as janelas ficam isso mais estreitas (a partir da metade da carga máxima) | `0.2` (20%) |
| `Tired` | Com o grupo muscular esgotado, as janelas ficam isso mais estreitas | `0.15` (15%) |
| `LightLoad` | Uma série leve (metade da carga máxima ou menos: um aquecimento) fica estas vezes mais fácil | `1.15` |

Todas ficam dentro de `Config.Minigame = { ... }`.

## Força

Dentro de `Config.Progression = { ... }`:

| Opção | O que faz | Padrão |
| - | - | - |
| `MaxLevel` | O nível máximo de cada grupo muscular | `50` |
| `XpForMax` | Experiência que um grupo precisa para o nível máximo (umas 50 horas treinando aquele grupo) | `17500` |
| `Curve` | Quanto cada nível fica mais difícil que o anterior. `1` = todos os níveis iguais | `1.5` |
| `XpPerRep` | Experiência de uma repetição boa com uma boa carga | `1.0` |
| `SecondaryShare` | Parte que os outros grupos do exercício recebem | `0.33` |
| `PartnerShare` | Parte que o ajudante ou o parceiro da medicine ball recebe por repetição boa de quem treina | `0.5` |
| `RecordXp` | Bônus por bater o próprio recorde num exercício | `25` |
| `MinRepGap` | Segundos: repetições mais rápidas que isso não contam | `1.2` |
| `MinReps` | Repetições boas que uma série precisa para contar. Quem sai antes não ganha nada: nem experiência, nem recorde, nem cansaço | `5` |
| `EasyShare` | Parte da experiência dos exercícios mais fáceis (`1` = inteira): a escada horizontal (`escada`, uma travessia vale 8 repetições, então 2) e subir na corda (`corda`) | `{ escada = 0.25, corda = 0.5 }` |

### Títulos

`Config.Titles = { 5, 30, 70, 120, 180, 230 }`: a soma dos níveis dos cinco grupos (5 a 250) em que cada título de época começa. Os nomes estão nas locales (`title_1` a `title_6`): Franzino, Iniciante, Atleta amador, Atleta, Homem-forte / Mulher-forte, Campeão.

## Cansaço, treinar todo dia e o ajudante

| Opção | O que faz | Padrão |
| - | - | - |
| `Config.Fatigue.PerRep` | Cansaço (0 a 100) que uma repetição boa soma no grupo principal. Umas 7 séries de 10 esgotam o grupo | `1.5` |
| `Config.Fatigue.RestHours` | Horas que um grupo esgotado leva para descansar por completo | `24` |
| `Config.Fatigue.TiredShare` | Experiência que um grupo esgotado ainda recebe. `1` = o cansaço não importa | `0.25` |
| `Config.Fatigue.StaminaPerRep` | Stamina do próprio jogo que cada repetição boa gasta: depois da série o jogador cansa mais rápido correndo. `0` = desligado | `4.0` |
| `Config.Streak.PerDay` | Experiência a mais por cada dia seguido com pelo menos uma série | `0.03` (3%) |
| `Config.Streak.MaxDays` | O dia seguido em que o bônus para de crescer (o 6º dia: +15%) | `6` |
| `Config.Spotter.Save` | Quando quem está no banco erra uma repetição, o ajudante tem um instante para apertar a tecla e salvar | `true` |

## Aquecimento e lesões

Dentro de `Config.Injury = { ... }`. Uma série leve (metade da carga máxima ou menos, ou um exercício sem carga) de `WarmupReps` repetições boas aquece o jogador por `WarmupMinutes`. Uma repetição perdida com carga pesada sem estar aquecido pode distender o grupo muscular: a série acaba e aquele grupo não pode ser treinado por `StrainHours`.

| Opção | O que faz | Padrão |
| - | - | - |
| `Enabled` | `false` desliga aquecimento e lesões | `true` |
| `WarmupReps` | Repetições boas de uma série leve que aquecem | `5` |
| `WarmupMinutes` | Quanto tempo o aquecimento dura | `20` |
| `HeavyShare` | Uma carga desta parte da carga máxima ou mais é pesada | `0.85` (85%) |
| `Chance` | Chance de uma repetição pesada perdida sem aquecer distender o grupo | `0.35` (35%) |
| `StrainHours` | Horas que um grupo distendido não pode ser treinado | `6` |

## Cargas

| Opção | O que faz | Padrão |
| - | - | - |
| `Config.WeightUnit` | Como as cargas aparecem: `'lb'` ou `'kg'` | `'lb'` |
| `Config.BarWeight` | A barra vazia. Anilhas de 5, 10 e 15 lb entram nela aos pares | `20` |

`Config.MaxLoad` define a carga máxima de cada exercício com equipamento, em libras: o primeiro número no nível 1, o segundo no nível máximo. A carga máxima do jogador cresce entre os dois com o nível do grupo principal do exercício.

| Nome no config | Exercício | Padrão |
| - | - | - |
| `supino` | Supino | `{ 40, 220 }` |
| `agacha` | Agachamento com barra | `{ 40, 260 }` |
| `dbarra` | Arremesso com barra | `{ 30, 150 }` |
| `rosca_barra` | Rosca com barra | `{ 30, 110 }` |
| `rosca` | Rosca com halteres (o suporte tem 5, 10, 15, 20, 25, 30, 40 e 50 lb) | `{ 5, 50 }` |
| `desenv` | Desenvolvimento com halteres | `{ 5, 40 }` |
| `puxada` | Puxada na polia (a pilha de pesos vai de 10 em 10 lb) | `{ 30, 150 }` |
| `remada` | Remada na polia | `{ 30, 150 }` |
| `peito` | Peito na polia | `{ 20, 100 }` |

## Músculo no corpo

Dentro de `Config.Muscle = { ... }`. O visual continua sendo do criador de aparência: a academia soma o músculo por cima toda vez que o criador coloca o corpo, e nunca muda o que o criador salvou.

| Opção | O que faz | Padrão |
| - | - | - |
| `Enabled` | `false`: a força sobe do mesmo jeito, o corpo não muda | `true` |
| `GrowthPerDay` | Parte do tamanho máximo que o corpo pode crescer (ou diminuir) num dia: o jogador fica forte primeiro, o corpo acompanha | `0.2` |
| `Male` / `Female` | Quanto cada parte cresce no nível máximo (`arms`, `shoulders`, `backWidth`, `back`, `chest`, `thighs`, `calves`; os sliders do corpo vão de -1 a 1) | veja o arquivo |
| `Decay` | Um grupo sem treino por `GraceDays` perde experiência todo dia, até zerar, e o corpo volta ao que o jogador criou | `true` |
| `GraceDays` | Dias que um grupo pode descansar antes de começar a diminuir | `7` |
| `DecayPerDay` | Parte do melhor nível do grupo perdida por dia depois dos dias de folga (`0.02`: tudo em 50 dias) | `0.02` |
| `Pump` | Logo depois da série, o grupo trabalhado mostra esta parte a mais do tamanho máximo | `0.25` |
| `PumpMinutes` | Minutos que o pump leva para sumir | `30` |

## Fora da academia

Dentro de `Config.Benefits = { ... }`. Cada um desliga com `0`.

| Opção | O que faz | Padrão |
| - | - | - |
| `Melee` | Dano a mais com os punhos e armas brancas no nível máximo de braços, peito e ombros | `0.4` (+40%) |
| `StaminaRanks` | Ranks da stamina do próprio jogo que o fôlego soma no nível máximo (o fôlego vem de subir na corda, pular corda, os sacos e a medicine ball) | `3` |

## Sons

| Opção | O que faz | Padrão |
| - | - | - |
| `Config.Sound.Volume` | Os aparelhos, ouvidos por todos perto. `0` = desligado | `0.8` |
| `Config.Sound.UI` | Os ticks do minigame e o sino no fim da série, só para quem treina. `0` = desligado | `0.5` |
| `Config.Sound.Range` | Metros até onde os aparelhos são ouvidos | `20.0` |

## Para desenvolvedores

Outro recurso pode ler os níveis de um jogador no servidor, por exemplo para deixar personagens fortes carregarem mais:

```lua theme={"dark"}
local levels = exports['rco-gym']:GetLevels(source)
-- { chest = 12, back = 9, shoulders = 10, arms = 15, legs = 8, wind = 4 }, ou nil se o jogador não tem personagem carregado
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.