> ## 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.

# Configuration

> Tout ce que vous pouvez changer dans config/config.lua, expliqué simplement.

Tous les réglages sont dans un seul fichier : `rco-gym/config/config.lua`. Ouvrez-le avec n'importe quel éditeur de texte (le Bloc-notes suffit, VS Code est plus confortable).

> [!TIP]
>
> Ne changez que ce qui vient après le signe `=`. Gardez les guillemets `'...'`, les virgules et les accolades exactement comme ils sont. Après avoir enregistré, redémarrez le serveur.

## L'essentiel

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Config.Locale` | Langue des textes à l'écran : `'en'` ou `'pt-br'` | `'en'` |
| `Config.Framework` | Laissez `'auto'`. N'écrivez `'rsg'` ou `'vorp'` que si le script se trompe | `'auto'` |
| `Config.Debug` | Affiche dans la console F8 ce que fait le script, pour la mise en place. Désactivez-le avant d'ouvrir aux joueurs | `false` |
| `Config.UseDistance` | À quelle distance (mètres) le joueur doit se tenir d'un appareil pour voir ses touches | `1.2` |
| `Config.ShowDistance` | Dans cette distance (mètres) du milieu d'une salle, ses appareils sont placés et l'entraînement des autres joueurs est montré | `60.0` |

### Une autre langue

Copiez `locales/en.json`, traduisez le texte à droite de chaque ligne, enregistrez-le par exemple sous `locales/fr.json` et mettez `Config.Locale = 'fr'`. Ce qui n'est pas traduit s'affiche en anglais.

## Les salles

`Config.Gyms` liste toutes les salles de votre serveur. Celle de Strawberry est déjà prête en première, avec ses 16 postes. Vous pouvez créer autant de salles que vous voulez, n'importe où sur la carte, et placer chaque poste séparément.

```lua theme={"dark"}
Config.Gyms = {
    {   -- la salle de Strawberry (déjà prête)
        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) },  -- Développé couché
            -- ... les 15 autres postes
        },
        board = vector4(-1836.59, -402.61, 162.39, 55.0),
    },
    {   -- une salle à vous
        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),
    },
}
```

| Réglage | Ce qu'il fait |
| - | - |
| `name` | Le nom du blip de la salle. `nil` : « Salle de sport » dans la langue du joueur |
| `blip` | `{ coords = vector3(...), sprite = '...' }` : où se trouve le blip et son icône (un nom parmi les blips du jeu). Sans `coords`, le blip va au milieu de la salle. `false` : pas de blip |
| `building` | `'strawberry'` : le bâtiment de la salle fourni avec la ressource, les appareils déjà dedans. `'props'` : le script place les appareils, solides, là où vous mettez les postes (en plein air, dans un bâtiment, dans un autre MLO) |
| `stations` | Les postes, chacun avec son `type` et ses `coords` |
| `board` | Le tableau des records : où le joueur se tient pour le lire, face à lui. Le tableau va sur le mur 1 m devant lui. Sans cette ligne, pas de tableau |

### Monter une salle pièce par pièce

1. Copiez l'entrée de Strawberry, donnez un `name` à la copie et mettez `building = 'props'`.
2. Gardez seulement les lignes des postes que vous voulez. Copiez une ligne pour avoir le même poste deux fois (deux bancs : deux lignes `supino`).
3. Pour chaque poste, placez-vous là où le joueur doit l'utiliser, tourné dans la direction où il doit regarder, et prenez votre position et votre direction avec l'outil de coordonnées que votre serveur utilise déjà. Écrivez-les sous la forme `vector4(x, y, z, heading)`.
4. Redémarrez le serveur.

Les coordonnées sont la position du joueur lui-même debout sur le sol : prenez-les à pied, pas à cheval ni dans un véhicule.

### Les types de postes

| Type | Poste | Sol nécessaire (mètres, largeur × longueur dans la direction où regarde le joueur) |
| - | - | - |
| `supino` | Développé couché | 1,9 × 2,7, le banc derrière la place du joueur |
| `agachamento` | Rack à squat | 1,9 × 1,6 |
| `halteres` | Râtelier d'haltères (curl et développé) | 3,7 × 1,3, le râtelier 0,4 m devant |
| `tapete` | Tapis (pompes, abdos, squats) | 1,1 × 1,9 |
| `barra_fixa` | Barre fixe | 2,0 × 2,3, 2,6 m de haut : plafond de 2,7 m ou plus |
| `paralelas` | Barres parallèles | 0,9 × 2,5, 1,15 m de haut |
| `escada` | Échelle horizontale | 1,5 × 3,2 (de 0,5 m derrière la place à 2,7 m devant), 2,3 m de haut : plafond de 2,6 m |
| `argolas` | Anneaux | 1,2 × 1,2. Ils pendent d'un point à 4,0 m du sol |
| `corda` | Corde à grimper | 1,0 × 1,2. La corde pend d'un point à 4,0 m du sol, et la montée va jusqu'à 3 m |
| `saco` | Sac de frappe | 1,2 × 1,6. Il pend d'un point à 4,0 m du sol |
| `bola` | Poire de vitesse | 1,0 × 1,3. Sa plateforme va sur un mur 0,95 m devant le joueur (de 1,4 à 1,9 m de haut) |
| `polias` | Poulie (tirage, rowing, pectoraux) | 1,0 × 1,6, deux colonnes 0,75 m devant et derrière le joueur, 2,1 m de haut |
| `barra_no_chao` | Barre au sol (épaulé-jeté, curl à la barre) | 1,9 × 1,6 |
| `medicine_ball` | Médecine-ball à deux | 0,8 × 4,0 : le partenaire attrape 3 m devant |
| `corda_de_pular` | Corde à sauter | 1,4 × 1,5 |

> [!TIP]
>
> Laissez environ 0,7 m entre les postes. Chaque exercice a sa propre caméra, à 1,5 - 3,5 m du poste, presque toujours devant et sur un côté : un mur à cet endroit met la caméra derrière le mur. Les anneaux, la corde à grimper et le sac de frappe rendent mieux sous une poutre ou un plafond à environ 4 m de haut.

> [!NOTE]
>
> `cam = 2` sur une ligne de banc utilise l'autre caméra du banc, de l'autre côté. Le deuxième banc de la salle de Strawberry l'utilise.

### Retirer la salle de Strawberry

Supprimez (ou commentez) son entrée dans `Config.Gyms` : ses postes et son blip disparaissent. Le bâtiment de Strawberry fait partie des fichiers de la ressource (les dossiers `stream/mlo` et `stream/placas`) et aucun réglage ne l'empêche de se charger. Pour rendre à la maison son état d'origine, supprimez aussi ces deux dossiers.

## Touches

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Config.ExerciseKeys` | Une touche pour chaque exercice d'un appareil, dans l'ordre | **E**, **G**, **F** |
| `Config.RepKey` | La touche principale des mini-jeux, et commencer dans le choix de la charge | **ESPACE** |
| `Config.GameKeys` | Les autres touches des mini-jeux : gauche, droite, haut, bas. Gauche et droite choisissent aussi la charge et tournent les pages du tableau des records | **A**, **D**, **W**, **S** |
| `Config.LeaveKey` | Termine la série et quitte l'appareil, et ferme le choix de la charge et le tableau des records | **X** |

> [!NOTE]
>
> Les touches s'écrivent avec les hashes de contrôle du jeu (comme `0xCEFD9220`), pas avec des lettres : le hash de chaque touche est sur la page [Touches](https://rust-co.mintlify.site/fr/keys.md). Dans le choix de la charge et sur le tableau des records, les flèches et **Échap** fonctionnent aussi.

## Les mini-jeux

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Reps` | Répétitions d'une série. La série se termine toute seule après elles | `10` |
| `Ease` | Chaque fenêtre de temps et zone de réussite fois ceci : `1.3` est plus facile, `0.8` plus difficile | `1.0` |
| `Pause` | Secondes pendant lesquelles le résultat reste à l'écran avant le tour suivant | `0.7` |
| `KeyLag` | Secondes que met un appui à arriver à l'écran. Le temps est jugé d'autant plus tôt | `0.035` |
| `HeavyLoad` | Avec la charge maximale du joueur, les fenêtres sont plus étroites de cette part (à partir de la moitié de la charge maximale) | `0.2` (20 %) |
| `Tired` | Avec le groupe musculaire épuisé, les fenêtres sont plus étroites de cette part | `0.15` (15 %) |
| `LightLoad` | Une série légère (la moitié de la charge maximale ou moins : un échauffement) est autant de fois plus facile | `1.15` |

Tous sont dans `Config.Minigame = { ... }`.

## Force

Dans `Config.Progression = { ... }` :

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `MaxLevel` | Le niveau maximal de chaque groupe musculaire | `50` |
| `XpForMax` | Expérience nécessaire à un groupe pour le niveau maximal (environ 50 heures d'entraînement de ce groupe) | `17500` |
| `Curve` | De combien chaque niveau est plus dur que le précédent. `1` = tous les niveaux pareils | `1.5` |
| `XpPerRep` | Expérience d'une bonne répétition avec une bonne charge | `1.0` |
| `SecondaryShare` | Part que reçoivent les autres groupes de l'exercice | `0.33` |
| `PartnerShare` | Part que reçoit celui qui assure ou le partenaire du medecine-ball pour chaque bonne répétition de celui qui s'entraîne | `0.5` |
| `RecordXp` | Bonus pour battre son propre record dans un exercice | `25` |
| `MinRepGap` | Secondes : les répétitions plus rapides que cela ne comptent pas | `1.2` |
| `MinReps` | Bonnes répétitions qu'il faut pour qu'une série compte. Une série quittée avec moins ne donne rien : ni expérience, ni record, ni fatigue | `5` |
| `EasyShare` | Part de l'expérience des exercices les plus faciles (`1` = entière) : l'échelle horizontale (`escada`, une traversée vaut 8 répétitions, donc 2) et grimper à la corde (`corda`) | `{ escada = 0.25, corda = 0.5 }` |

### Titres

`Config.Titles = { 5, 30, 70, 120, 180, 230 }` : la somme des niveaux des cinq groupes (de 5 à 250) où commence chaque titre d'époque. Leurs noms sont dans les locales (`title_1` à `title_6`) : Weakling, Beginner, Amateur athlete, Athlete, Strongman / Strongwoman, Champion.

## Fatigue, entraînement quotidien et assistance

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Config.Fatigue.PerRep` | Fatigue (0 à 100) qu'une bonne répétition ajoute à son groupe principal. Environ 7 séries de 10 l'épuisent | `1.5` |
| `Config.Fatigue.RestHours` | Heures qu'un groupe épuisé met à se reposer complètement | `24` |
| `Config.Fatigue.TiredShare` | Expérience qu'un groupe épuisé reçoit encore. `1` = la fatigue ne compte pas | `0.25` |
| `Config.Fatigue.StaminaPerRep` | Endurance du jeu lui-même que coûte chaque bonne répétition : après une série, le joueur s'essouffle plus vite en courant. `0` = désactivé | `4.0` |
| `Config.Streak.PerDay` | Expérience en plus pour chaque jour d'affilée avec au moins une série | `0.03` (3 %) |
| `Config.Streak.MaxDays` | Le jour d'affilée où le bonus cesse d'augmenter (le 6e jour : +15 %) | `6` |
| `Config.Spotter.Save` | Quand celui qui est sur le banc rate une répétition, celui qui assure a un instant pour appuyer sur sa touche et la sauver | `true` |

## Échauffement et blessures

Dans `Config.Injury = { ... }`. Une série légère (la moitié de la charge maximale ou moins, ou un exercice sans charge) de `WarmupReps` bonnes répétitions échauffe le joueur pendant `WarmupMinutes`. Une répétition ratée avec une charge lourde sans être échauffé peut froisser le groupe musculaire : la série s'arrête et ce groupe ne peut plus être entraîné pendant `StrainHours`.

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Enabled` | `false` désactive l'échauffement et les blessures | `true` |
| `WarmupReps` | Bonnes répétitions d'une série légère qui échauffent | `5` |
| `WarmupMinutes` | Durée de l'échauffement | `20` |
| `HeavyShare` | Une charge de cette part de la charge maximale ou plus est lourde | `0.85` (85 %) |
| `Chance` | Probabilité qu'une répétition lourde ratée à froid froisse le groupe | `0.35` (35 %) |
| `StrainHours` | Heures pendant lesquelles un groupe froissé ne peut pas être entraîné | `6` |

## Charges

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Config.WeightUnit` | Comment les charges s'affichent : `'lb'` ou `'kg'` | `'lb'` |
| `Config.BarWeight` | La barre vide. Les disques de 5, 10 et 15 lb s'y mettent par paires | `20` |

`Config.MaxLoad` fixe la charge maximale de chaque exercice avec matériel, en livres : le premier nombre au niveau 1, le second au niveau maximal. La charge maximale du joueur grandit entre les deux avec le niveau du groupe principal de l'exercice.

| Nom dans le config | Exercice | Par défaut |
| - | - | - |
| `supino` | Développé couché | `{ 40, 220 }` |
| `agacha` | Squat à la barre | `{ 40, 260 }` |
| `dbarra` | Épaulé et développé | `{ 30, 150 }` |
| `rosca_barra` | Curl à la barre | `{ 30, 110 }` |
| `rosca` | Curl aux haltères (le rack a 5, 10, 15, 20, 25, 30, 40 et 50 lb) | `{ 5, 50 }` |
| `desenv` | Développé aux haltères | `{ 5, 40 }` |
| `puxada` | Tirage à la poulie (la pile de poids va de 10 en 10 lb) | `{ 30, 150 }` |
| `remada` | Rowing à la poulie | `{ 30, 150 }` |
| `peito` | Pectoraux à la poulie | `{ 20, 100 }` |

## Le muscle sur le corps

Dans `Config.Muscle = { ... }`. L'apparence reste celle du créateur : la salle ajoute le muscle par-dessus chaque fois que le créateur met le corps, et ne change jamais ce que le créateur a enregistré.

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Enabled` | `false` : la force monte quand même, le corps ne change pas | `true` |
| `GrowthPerDay` | Part de la taille maximale dont le corps peut grandir (ou rétrécir) en un jour : le joueur devient fort d'abord, le corps suit | `0.2` |
| `Male` / `Female` | De combien chaque partie grandit au niveau maximal (`arms`, `shoulders`, `backWidth`, `back`, `chest`, `thighs`, `calves` ; les curseurs du corps vont de -1 à 1) | voir le fichier |
| `Decay` | Un groupe pas entraîné pendant `GraceDays` perd de l'expérience chaque jour, jusqu'à zéro, et le corps revient à celui créé par le joueur | `true` |
| `GraceDays` | Jours pendant lesquels un groupe peut se reposer avant de commencer à rétrécir | `7` |
| `DecayPerDay` | Part du meilleur niveau du groupe perdue par jour après les jours de grâce (`0.02` : tout en 50 jours) | `0.02` |
| `Pump` | Juste après une série, le groupe travaillé montre cette part de sa taille maximale en plus | `0.25` |
| `PumpMinutes` | Minutes que met le gonflement à disparaître | `30` |

## En dehors de la salle

Dans `Config.Benefits = { ... }`. Chacun se désactive avec `0`.

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Melee` | Dégâts en plus avec les poings et les armes de mêlée au niveau maximal des bras, des pectoraux et des épaules | `0.4` (+40 %) |
| `StaminaRanks` | Rangs d'endurance du jeu lui-même que le souffle ajoute à son niveau maximal (le souffle vient de la corde à grimper, de la corde à sauter, des sacs et du medecine-ball) | `3` |

## Sons

| Réglage | Ce qu'il fait | Par défaut |
| - | - | - |
| `Config.Sound.Volume` | Les appareils, entendus par tous ceux qui sont près. `0` = coupé | `0.8` |
| `Config.Sound.UI` | Les tics du mini-jeu et la cloche en fin de série, seulement pour celui qui s'entraîne. `0` = coupé | `0.5` |
| `Config.Sound.Range` | Mètres jusqu'où les appareils s'entendent | `20.0` |

## Pour les développeurs

Une autre ressource peut lire les niveaux d'un joueur sur le serveur, par exemple pour laisser les personnages forts porter plus :

```lua theme={"dark"}
local levels = exports['rco-gym']:GetLevels(source)
-- { chest = 12, back = 9, shoulders = 10, arms = 15, legs = 8, wind = 4 }, ou nil si le joueur n'a pas de personnage chargé
```


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