> For the complete documentation index, see [llms.txt](https://claude.fractalgamestudios.es/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://claude.fractalgamestudios.es/bolas/game-info/prompts-de-proximidad-propios.md).

# Prompts de proximidad propios

### 2026-08-04 (el ProximityPrompt nativo de Roblox desentonaba, sobre todo en la mesa de habilidades)

Nuevo `/goal`, corto y directo: *"los proximity prompt me parecen feos y mas con la mesa de habilidades"*. El globo blanco por defecto de Roblox (tecla en un cuadrado gris, sin bordes ni tipografia propia) no se parecia en nada al resto de la interfaz del juego, que lleva meses girando en torno a `Front.Shared.Theme`.

Habia **tres prompts activos**: la mesa de habilidades (`SkillsTerminal`), el terminal de customizacion (`CustomizationTerminal`) y el punto AFK (`Lobby.AFKTogglePoint`).

#### Un unico renderizador para todos, presentes y futuros

**`StarterPlayer.StarterPlayerScripts.Controllers.ProximityPromptStyler`** (nuevo). En vez de que cada terminal se dibuje su propio globo, este script se queda con **todos** los prompts del juego: recorre `workspace` al arrancar y escucha `DescendantAdded`, poniendo a cada `ProximityPrompt` el `Style = Custom`.

Eso es lo unico que hay que cambiarles: `Custom` le dice a Roblox que **no dibuje** su interfaz pero que siga haciendo todo lo demas — deteccion de distancia, tecla, mantener pulsado, gamepad, movil y el evento `Triggered`. Como solo se sustituye el DIBUJO, ningun sistema que dependa de los prompts cambia de comportamiento. **Verificado**: pulsando E de verdad sobre el punto AFK, el server sigue registrando `StudioSimulateAFK_On` igual que antes.

La tarjeta nueva: fondo oscuro (`Theme.Colors.Surface`) con degradado sutil, esquinas redondeadas, borde de color de acento, **pastilla con la tecla**, el `ObjectText` en pequeño arriba y el `ActionText` en grande debajo (si no hay `ObjectText`, el texto de accion se centra solo — es el caso del punto AFK). Entra creciendo con un rebote corto y sale encogiendose.

Detalles que se cuidaron a proposito:

* **Ancho calculado con `TextService:GetTextSize`** en vez de `AutomaticSize`: dentro de un `BillboardGui` el auto-tamaño se pelea con el escalado por distancia y la tarjeta da saltos al acercarse.
* **`ExtentsOffsetWorldSpace`** (no `StudsOffset`) para levantarla sobre el objeto: mide desde el borde real de la part, asi que funciona igual con una part grande que con una pequeña.
* **Barra de "mantener pulsado"** implementada aunque hoy ningun prompt use `HoldDuration > 0`: el prompt nativo la tenia, y perderla al personalizar el estilo habria sido una regresion silenciosa el dia que alguien ponga un prompt de mantener.
* **Teclado / gamepad / movil**: Roblox ya dice con que dispositivo se juega en `PromptShown`; se traduce a la tecla real (`GetStringForKeyCode`), al boton del mando, o a "TAP" en movil.
* **Destello** de la pastilla al activarse, para que la pulsacion tenga respuesta visible.

#### Un acento por interaccion

Cada prompt puede llevar un atributo **`AccentColor`** (Color3) que cambia el borde y la pastilla; sin el, sale el cian de marca. Asignados:

| Interaccion               | Acento                        | Por que                                                                                                               |
| ------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Mesa de habilidades       | Morado (`Theme.Colors.Boss`)  | El morado de la propia mesa: la tarjeta pertenece al objeto sobre el que flota, no es un globo generico pegado encima |
| Terminal de customizacion | Cian (`Theme.Colors.Primary`) | El mismo que el boton "Personalizar" del menu                                                                         |
| Punto AFK                 | Gris neutro                   | Accion "de sistema", mismo criterio que el boton de Ajustes                                                           |

De paso, el terminal de customizacion gano un `ObjectText` ("Terminal") que antes estaba vacio, para que su tarjeta tenga las mismas dos lineas que las demas.

#### La causa REAL de que se viera mal en la mesa de habilidades

Al mirarlo de cerca en playtest salio que el problema no era solo el estilo del prompt: **la mesa media 1,5 studs de alto** (altura de la rodilla). Un personaje de Roblox mide \~5. Desde la camara normal la mesa se leia como una baldosa en el suelo, y el prompt quedaba flotando sobre casi nada, pisandose ademas con el personaje.

Mesa **rehecha con proporciones de atril**: pedestal de obsidiana de 2,5 studs, cuatro pilares de 4,2 que sobresalen por encima, losa de marmol morado a **3 studs** (altura del pecho) y el libro flotante a **4,6** (altura de los ojos), con su luz morada y sus glifos subiendo desde la losa. Ahora se lee de verdad como una mesa de encantamientos y el prompt flota sobre algo.

Ademas, el cartel 3D ("HABILIDADES DE ARMA") y el prompt decian lo mismo y se pisaban de cerca. Se reparten el trabajo: **el cartel se ve de lejos y se aparta en cuanto entras en rango del prompt**, que ademas es accionable.

#### Bug encontrado de paso: una pulsacion podia vaciar todos los puntos de skill

Durante las pruebas, al reiniciar el playtest con el raton (virtual) parado encima del boton "+" del panel de skills, **se gastaron 3 puntos solos**. Es el mismo fallo que ya se habia visto al implementar el sistema y que entonces se tapo con un anti-rebote de 0,25s: cada subida provoca un snapshot nuevo del servidor, ese snapshot **re-monta** el boton, y el boton recien montado se vuelve a activar bajo el raton que sigue pulsado. El anti-rebote limitaba el ritmo (4/s) pero no impedia el problema — solo lo hacia mas lento.

Arreglo de verdad: **exigir soltar el boton entre subida y subida**. `BallsController.upgradeStat` (cliente) ignora la peticion mientras no haya llegado un `InputEnded` de `MouseButton1`/`Touch`, con un plazo maximo de 0,6s para que un `InputEnded` perdido no deje el boton muerto para siempre. El cooldown se queda como red de seguridad para las activaciones que no vienen de un raton. Gastar un punto es irreversible, asi que la semantica correcta es *una subida por pulsacion*, no *N por segundo*. **Verificado**: reiniciando el playtest en la misma situacion, ya no se gasta ningun punto solo.

#### Validacion en playtest

* Los **tres** prompts renderizados con la tarjeta nueva y su acento correspondiente, capturados por pantalla: mesa (morado, dos lineas), terminal de customizacion (cian, dos lineas) y punto AFK (gris, una sola linea centrada).
* **Sin rastro** del globo nativo de Roblox en ninguno.
* **La interaccion sigue funcionando**: E en el punto AFK → `StudioSimulateAFK_On` en el server (y E otra vez lo revirtio, dejando `Interactables` y `Lobbies` con sus hijos originales). E en la mesa → se abre el panel de habilidades.
* Sin errores en `get_runtime_logs` en ningun momento.

#### Archivos

**Nuevos:** `StarterPlayer.StarterPlayerScripts.Controllers.ProximityPromptStyler`.

**Tocados:** `Workspace.Lobby.Interactables.SkillsTable` (rehecha con proporciones de atril), `Workspace.Lobby.AFKTogglePoint.AFKTogglePrompt` (atributo `AccentColor`), `StarterPlayer.StarterPlayerScripts.Controllers.SkillsTerminalController` (acento morado + ocultar el cartel 3D con el prompt), `StarterPlayer.StarterPlayerScripts.Controllers.CustomizationTerminalController` (acento cian + `ObjectText`), `ReplicatedStorage.Front.Controllers.BallsController` (una subida por pulsacion).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://claude.fractalgamestudios.es/bolas/game-info/prompts-de-proximidad-propios.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
