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

# Configuración

> Todo lo que puedes cambiar en config/config.lua, explicado con palabras sencillas.

Todos los ajustes están en un solo archivo: `rco-gym/config/config.lua`. Ábrelo con cualquier editor de texto (el Bloc de notas sirve, VS Code es más cómodo).

> [!TIP]
>
> Cambia solo lo que va después del signo `=`. Deja las comillas `'...'`, las comas y las llaves exactamente como están. Después de guardar, reinicia el servidor.

## Lo básico

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Config.Locale` | Idioma de los textos en pantalla: `'en'` o `'pt-br'` | `'en'` |
| `Config.Framework` | Déjalo en `'auto'`. Solo escribe `'rsg'` o `'vorp'` si el script se equivoca | `'auto'` |
| `Config.Debug` | Muestra en la consola F8 lo que hace el script, para configurar. Apágalo antes de abrir a los jugadores | `false` |
| `Config.UseDistance` | A qué distancia (metros) tiene que estar el jugador de un aparato para ver sus teclas | `1.2` |
| `Config.ShowDistance` | Dentro de esta distancia (metros) del centro de un gimnasio se colocan sus aparatos y se ve entrenar a los demás | `60.0` |

### Otro idioma

Copia `locales/en.json`, traduce el texto de la derecha de cada línea, guárdalo como por ejemplo `locales/es.json` y pon `Config.Locale = 'es'`. Lo que no traduzcas sale en inglés.

## Los gimnasios

`Config.Gyms` lista todos los gimnasios de tu servidor. El de Strawberry viene listo como el primero, con sus 16 estaciones. Puedes crear tantos gimnasios como quieras, en cualquier lugar del mapa, y colocar cada estación por separado.

```lua theme={"dark"}
Config.Gyms = {
    {   -- el gimnasio de Strawberry (viene listo)
        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) },  -- Press de banca
            -- ... las otras 15 estaciones
        },
        board = vector4(-1836.59, -402.61, 162.39, 55.0),
    },
    {   -- un gimnasio tuyo
        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),
    },
}
```

| Ajuste | Qué hace |
| - | - |
| `name` | El nombre del blip del gimnasio. `nil`: "Gimnasio" en el idioma del jugador |
| `blip` | `{ coords = vector3(...), sprite = '...' }`: dónde está el blip y su icono (un nombre de los blips del juego). Sin `coords` el blip va en el centro del gimnasio. `false`: sin blip |
| `building` | `'strawberry'`: el edificio del gimnasio que trae el recurso, con los aparatos ya dentro. `'props'`: el script coloca los aparatos, sólidos, donde pongas las estaciones (al aire libre, en un edificio, en otro MLO) |
| `stations` | Las estaciones, cada una con su `type` y sus `coords` |
| `board` | El tablón de récords: dónde se pone el jugador para leerlo, de frente. El tablón va en la pared 1 m delante de él. Sin esta línea, sin tablón |

### Montar un gimnasio pieza por pieza

1. Copia la entrada de Strawberry, dale un `name` a la copia y pon `building = 'props'`.
2. Deja solo las líneas de las estaciones que quieras. Copia una línea para tener la misma estación dos veces (dos bancos: dos líneas `supino`).
3. Para cada estación, ponte donde el jugador debe usarla, mirando hacia donde debe mirar, y toma tu posición y dirección con la herramienta de coordenadas que ya usa tu servidor. Escríbelas como `vector4(x, y, z, heading)`.
4. Reinicia el servidor.

Las coordenadas son la posición del propio jugador de pie en el suelo: tómalas a pie, no a caballo ni en un vehículo.

### Los tipos de estación

| Tipo | Estación | Suelo que necesita (metros, ancho × largo en la dirección en que mira el jugador) |
| - | - | - |
| `supino` | Press de banca | 1,9 × 2,7, el banco detrás del lugar del jugador |
| `agachamento` | Rack de sentadilla | 1,9 × 1,6 |
| `halteres` | Estante de mancuernas (curl y press) | 3,7 × 1,3, el estante 0,4 m delante |
| `tapete` | Colchoneta (flexiones, abdominales, sentadillas) | 1,1 × 1,9 |
| `barra_fixa` | Barra fija | 2,0 × 2,3, 2,6 m de alto: techo de 2,7 m o más |
| `paralelas` | Paralelas | 0,9 × 2,5, 1,15 m de alto |
| `escada` | Escalera horizontal | 1,5 × 3,2 (de 0,5 m detrás del lugar a 2,7 m delante), 2,3 m de alto: techo de 2,6 m |
| `argolas` | Anillas | 1,2 × 1,2. Cuelgan de un punto a 4,0 m del suelo |
| `corda` | Cuerda para trepar | 1,0 × 1,2. La cuerda cuelga de un punto a 4,0 m del suelo y la subida llega a 3 m |
| `saco` | Saco de boxeo | 1,2 × 1,6. Cuelga de un punto a 4,0 m del suelo |
| `bola` | Pera de boxeo | 1,0 × 1,3. Su plataforma va en una pared 0,95 m delante del jugador (de 1,4 a 1,9 m de alto) |
| `polias` | Polea (jalón, remo, pecho) | 1,0 × 1,6, dos columnas 0,75 m delante y detrás del jugador, 2,1 m de alto |
| `barra_no_chao` | Barra en el suelo (cargada y press, curl con barra) | 1,9 × 1,6 |
| `medicine_ball` | Balón medicinal en pareja | 0,8 × 4,0: el compañero atrapa 3 m delante |
| `corda_de_pular` | Comba | 1,4 × 1,5 |

> [!TIP]
>
> Deja unos 0,7 m entre estaciones. Cada ejercicio tiene su propia cámara, a 1,5 - 3,5 m de la estación, casi siempre delante y a un lado: una pared en ese lugar pone la cámara detrás de la pared. Las anillas, la cuerda para trepar y el saco de boxeo quedan mejor bajo una viga o un techo a unos 4 m de alto.

> [!NOTE]
>
> `cam = 2` en una línea de banco usa la otra cámara del banco, desde el otro lado. El segundo banco del gimnasio de Strawberry la usa.

### Quitar el gimnasio de Strawberry

Borra (o comenta) su entrada en `Config.Gyms`: sus estaciones y su blip desaparecen. El edificio de Strawberry viene en los archivos del recurso (las carpetas `stream/mlo` y `stream/placas`) y ningún ajuste impide que se cargue. Para devolver la casa a la original del juego, borra también esas dos carpetas.

## Teclas

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Config.ExerciseKeys` | Una tecla por cada ejercicio que ofrece un aparato, en orden | **E**, **G**, **F** |
| `Config.RepKey` | La tecla principal de los minijuegos, y empezar al elegir el peso | **ESPACIO** |
| `Config.GameKeys` | Las otras teclas de los minijuegos: izquierda, derecha, arriba, abajo. Izquierda y derecha también eligen el peso y pasan las páginas del tablero de récords | **A**, **D**, **W**, **S** |
| `Config.LeaveKey` | Termina la serie y sale del aparato, y cierra el selector de peso y el tablero de récords | **X** |

> [!NOTE]
>
> Las teclas se escriben como los hashes de control del juego (como `0xCEFD9220`), no como letras: el hash de cada tecla está en la página [Teclas](https://rust-co.mintlify.site/es/keys.md). En el selector de peso y en el tablero de récords también funcionan las flechas y **Esc**.

## Los minijuegos

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Reps` | Repeticiones de una serie. La serie termina sola después de ellas | `10` |
| `Ease` | Cada ventana de tiempo y zona de acierto por esto: `1.3` es más fácil, `0.8` más difícil | `1.0` |
| `Pause` | Segundos que el resultado se queda en pantalla antes de la siguiente ronda | `0.7` |
| `KeyLag` | Segundos que tarda una pulsación en llegar a la pantalla. El tiempo se juzga eso antes | `0.035` |
| `HeavyLoad` | Con el peso máximo del jugador las ventanas son esto más estrechas (desde la mitad del peso máximo) | `0.2` (20%) |
| `Tired` | Con el grupo muscular agotado, las ventanas son esto más estrechas | `0.15` (15%) |
| `LightLoad` | Una serie ligera (la mitad del peso máximo o menos: un calentamiento) es estas veces más fácil | `1.15` |

Todos están dentro de `Config.Minigame = { ... }`.

## Fuerza

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

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `MaxLevel` | El nivel máximo de cada grupo muscular | `50` |
| `XpForMax` | Experiencia que necesita un grupo para el nivel máximo (unas 50 horas entrenando ese grupo) | `17500` |
| `Curve` | Cuánto más difícil es cada nivel que el anterior. `1` = todos los niveles iguales | `1.5` |
| `XpPerRep` | Experiencia de una repetición buena con un buen peso | `1.0` |
| `SecondaryShare` | Parte que reciben los otros grupos del ejercicio | `0.33` |
| `PartnerShare` | Parte que recibe el que asiste o el compañero del balón medicinal por cada repetición buena del que entrena | `0.5` |
| `RecordXp` | Bonus por batir tu propio récord en un ejercicio | `25` |
| `MinRepGap` | Segundos: las repeticiones más rápidas que esto no cuentan | `1.2` |
| `MinReps` | Repeticiones buenas que necesita una serie para contar. Una serie dejada con menos no da nada: ni experiencia, ni récord, ni cansancio | `5` |
| `EasyShare` | Parte de la experiencia de los ejercicios más fáciles (`1` = entera): la escalera horizontal (`escada`, un cruce vale 8 repeticiones, así que 2) y trepar la cuerda (`corda`) | `{ escada = 0.25, corda = 0.5 }` |

### Títulos

`Config.Titles = { 5, 30, 70, 120, 180, 230 }`: la suma de los niveles de los cinco grupos (de 5 a 250) donde empieza cada título de la época. Sus nombres están en los locales (`title_1` a `title_6`): Weakling, Beginner, Amateur athlete, Athlete, Strongman / Strongwoman, Champion.

## Cansancio, entrenar cada día y el que asiste

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Config.Fatigue.PerRep` | Cansancio (0 a 100) que una repetición buena suma a su grupo principal. Unas 7 series de 10 lo agotan | `1.5` |
| `Config.Fatigue.RestHours` | Horas que tarda un grupo agotado en descansar del todo | `24` |
| `Config.Fatigue.TiredShare` | Experiencia que todavía recibe un grupo agotado. `1` = el cansancio no importa | `0.25` |
| `Config.Fatigue.StaminaPerRep` | Stamina del propio juego que gasta cada repetición buena: después de una serie el jugador se cansa antes corriendo. `0` = apagado | `4.0` |
| `Config.Streak.PerDay` | Experiencia extra por cada día seguido con al menos una serie | `0.03` (3%) |
| `Config.Streak.MaxDays` | El día seguido en el que el bonus deja de crecer (el 6º día: +15%) | `6` |
| `Config.Spotter.Save` | Cuando el del banco falla una repetición, el que asiste tiene un momento para pulsar su tecla y salvarla | `true` |

## Calentamiento y lesiones

Dentro de `Config.Injury = { ... }`. Una serie ligera (la mitad del peso máximo o menos, o un ejercicio sin peso) de `WarmupReps` repeticiones buenas calienta al jugador durante `WarmupMinutes`. Una repetición fallada con peso alto sin estar caliente puede lesionar el grupo muscular: la serie termina y ese grupo no se puede entrenar durante `StrainHours`.

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Enabled` | `false` apaga el calentamiento y las lesiones | `true` |
| `WarmupReps` | Repeticiones buenas de una serie ligera que calientan | `5` |
| `WarmupMinutes` | Cuánto dura el calentamiento | `20` |
| `HeavyShare` | Un peso de esta parte del peso máximo o más es alto | `0.85` (85%) |
| `Chance` | Probabilidad de que una repetición pesada fallada en frío lesione el grupo | `0.35` (35%) |
| `StrainHours` | Horas que un grupo lesionado no se puede entrenar | `6` |

## Pesos

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Config.WeightUnit` | Cómo se muestran los pesos: `'lb'` o `'kg'` | `'lb'` |
| `Config.BarWeight` | La barra vacía. Los discos de 5, 10 y 15 lb van en ella por pares | `20` |

`Config.MaxLoad` fija el peso máximo de cada ejercicio con equipo, en libras: el primer número en el nivel 1, el segundo en el nivel máximo. El peso máximo del jugador crece entre los dos con el nivel del grupo principal del ejercicio.

| Nombre en el config | Ejercicio | Por defecto |
| - | - | - |
| `supino` | Press de banca | `{ 40, 220 }` |
| `agacha` | Sentadilla con barra | `{ 40, 260 }` |
| `dbarra` | Cargada y press | `{ 30, 150 }` |
| `rosca_barra` | Curl con barra | `{ 30, 110 }` |
| `rosca` | Curl con mancuernas (el rack tiene 5, 10, 15, 20, 25, 30, 40 y 50 lb) | `{ 5, 50 }` |
| `desenv` | Press con mancuernas | `{ 5, 40 }` |
| `puxada` | Jalón en polea (la pila de pesos va de 10 en 10 lb) | `{ 30, 150 }` |
| `remada` | Remo en polea | `{ 30, 150 }` |
| `peito` | Pecho en polea | `{ 20, 100 }` |

## Músculo en el cuerpo

Dentro de `Config.Muscle = { ... }`. El aspecto sigue siendo del creador de apariencia: el gimnasio suma el músculo encima cada vez que el creador pone el cuerpo, y nunca cambia lo que el creador guardó.

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Enabled` | `false`: la fuerza sube igual, el cuerpo no cambia | `true` |
| `GrowthPerDay` | Parte del tamaño máximo que el cuerpo puede crecer (o encoger) en un día: el jugador se hace fuerte primero, el cuerpo le sigue | `0.2` |
| `Male` / `Female` | Cuánto crece cada parte en el nivel máximo (`arms`, `shoulders`, `backWidth`, `back`, `chest`, `thighs`, `calves`; los sliders del cuerpo van de -1 a 1) | mira el archivo |
| `Decay` | Un grupo sin entrenar durante `GraceDays` pierde experiencia cada día, hasta cero, y el cuerpo vuelve al que creó el jugador | `true` |
| `GraceDays` | Días que un grupo puede descansar antes de empezar a encoger | `7` |
| `DecayPerDay` | Parte del mejor nivel del grupo que se pierde por día después de los días de gracia (`0.02`: todo en 50 días) | `0.02` |
| `Pump` | Justo después de una serie, el grupo trabajado muestra esta parte más de su tamaño máximo | `0.25` |
| `PumpMinutes` | Minutos que tarda el bombeo en irse | `30` |

## Fuera del gimnasio

Dentro de `Config.Benefits = { ... }`. Cada uno se apaga con `0`.

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Melee` | Daño extra con los puños y las armas cuerpo a cuerpo en el nivel máximo de brazos, pecho y hombros | `0.4` (+40%) |
| `StaminaRanks` | Rangos de stamina del propio juego que suma el fondo en su nivel máximo (el fondo viene de trepar la cuerda, saltar la comba, los sacos y el balón medicinal) | `3` |

## Sonidos

| Ajuste | Qué hace | Por defecto |
| - | - | - |
| `Config.Sound.Volume` | Los aparatos, que oyen todos los que están cerca. `0` = apagado | `0.8` |
| `Config.Sound.UI` | Los ticks del minijuego y la campana al final de la serie, solo para quien entrena. `0` = apagado | `0.5` |
| `Config.Sound.Range` | Metros hasta donde se oyen los aparatos | `20.0` |

## Para desarrolladores

Otro recurso puede leer los niveles de un jugador en el servidor, por ejemplo para que los personajes fuertes carguen más:

```lua theme={"dark"}
local levels = exports['rco-gym']:GetLevels(source)
-- { chest = 12, back = 9, shoulders = 10, arms = 15, legs = 8, wind = 4 }, o nil si el jugador no tiene personaje cargado
```


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