> 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-que-se-actualizan-en-vivo.md).

# Prompts que se actualizan en vivo

### 2026-08-04 (la tarjeta del prompt no reflejaba los cambios del prompt: el del punto AFK se quedaba con el texto antiguo hasta salir y volver a entrar en rango)

Bug reportado sobre el sistema de prompts propios de esta misma fecha: *"el proximity prompt del AFK no cambia cuando le das, tienes que alejarte y volver para ver el texto cambiado"*.

#### Causa

El renderizador (`ProximityPromptStyler`) construia la tarjeta **una sola vez**, en `PromptShown`, y no volvia a mirar el prompt nunca mas. El punto AFK reescribe su `ActionText` al pulsarlo (alterna entre "Ir a zona AFK" y "Volver al Lobby principal"), pero para la tarjeta ese cambio no existia: seguia pintando el texto con el que se creo. Solo se corregia cuando el jugador se alejaba lo suficiente para que Roblox disparase `PromptHidden` y luego `PromptShown` otra vez — que es exactamente el sintoma descrito.

Es una regresion introducida al sustituir el prompt nativo: el de Roblox se redibujaba solo.

#### Arreglo

La tarjeta se mantiene **viva** mientras esta en pantalla. Al crearla se conectan `GetPropertyChangedSignal` de `ActionText`, `ObjectText`, `KeyboardKeyCode`, `GamepadKeyCode` y `MaxActivationDistance`, mas `GetAttributeChangedSignal("AccentColor")`; cualquiera de ellos la refresca en el sitio.

Para que refrescar fuese posible sin reconstruirla entera, se separo el dibujo en dos partes: `buildGui` crea las instancias una vez, y `applyState` vuelca sobre ellas el estado ACTUAL del prompt (textos, tecla, colores y el ancho, que depende del texto mas largo). Detalles:

* **Las dos etiquetas se crean siempre**, tambien cuando el prompt no tiene `ObjectText` en ese momento: un prompt puede ganar o perder texto de objeto en caliente, y crear la etiqueta al vuelo obligaria a rehacer la tarjeta entera en cada cambio. Cuando no hay texto de objeto, la accion se centra sola.
* **La animacion de entrada se cancela** si llega un refresco mientras corre: su destino es el ancho VIEJO y dejaria la tarjeta con el tamaño equivocado.
* Un cambio de texto dispara ademas un **pulso** corto de escala, para que el cambio se NOTE — que era justo la queja.

#### Segundo bug encontrado mientras se probaba: tarjetas huerfanas

Revisando el estado del cliente aparecio una tarjeta **flotando sin dueño**: adornada a la mesa de habilidades, totalmente opaca, con el jugador a 66 studs de distancia.

Causa: si un prompt sale del mundo **mientras esta visible**, Roblox **no dispara `PromptHidden`** — simplemente deja de existir. Y como la tarjeta cuelga del `PlayerGui` (no de la part), sobrevivia al prompt y se quedaba ahi para siempre. No es un caso rebuscado: el server AFK retira y devuelve los interactables de la Lobby cada vez que se entra o se sale del modo AFK, y con ellos la mesa de habilidades y su prompt.

Arreglo: cada tarjeta vigila tambien `prompt.AncestryChanged` y se destruye (sin animacion, porque ya no hay nada a lo que animarse) en cuanto el prompt se queda sin padre. De paso se unifico la retirada en una sola funcion `hidePrompt(prompt, animate)` que usan tanto `PromptHidden` como esa red de seguridad.

**Ojo con el orden de los `local` en Lua**: `hidePrompt` se usa desde dentro de una conexion creada en `buildGui`, que esta MAS ARRIBA en el archivo. Un `local` definido despues no esta en el ambito de las funciones anteriores — se resolveria como global `nil` y reventaria al dispararse la conexion, no al cargar el script. Por eso va declarada al principio y luego asignada.

#### Tercer arreglo: el `ObjectText` de la mesa se habia perdido

Al comprobar la regresion salio que la tarjeta de la mesa mostraba solo "Habilidades", sin la linea "Mesa de mejora". No era del renderizador — estaba pintando fielmente lo que el prompt decia: en `SkillsTerminalController` la linea habia quedado como `prompt.ObjectText = ""` (perdida en una edicion anterior). Restaurada.

Y ya puestos, las conexiones de `PromptShown`/`PromptHidden` que ocultan el cartel 3D de la mesa se guardan y se sueltan en `teardownTerminal`: cada ida y vuelta al modo AFK volvia a pasar por ahi y las conexiones se iban acumulando sobre prompts que ya no existian.

#### Validacion en playtest

* **El bug original**: de pie junto al punto AFK, **sin moverse** (distancia 5,3 studs, rango 12), pulsar E cambia la tarjeta de "Ir a zona AFK" a "Volver al Lobby principal" en el sitio, y la tarjeta se reajusta al texto mas largo. Segundo E, de vuelta. Comprobado por captura y midiendo en el cliente que hay **una sola** tarjeta y que su transparencia es la normal (no una que se este desvaneciendo).
* **Cambio en caliente completo**: cambiando `ActionText`, `ObjectText` y `AccentColor` de un prompt visible desde el cliente, la tarjeta crecio para caber el texto nuevo, cambio la linea de objeto y viro el borde y la pastilla a ambar — todo sin mover al jugador.
* **La fuga**: con la tarjeta de la mesa delante, se retiro la mesa del mundo (lo mismo que hace `stripServerForAFK`) → tarjetas activas pasaron de 1 a **0** al instante, en vez de quedarse huerfana. Devolviendo la mesa, el prompt vuelve correcto ("Mesa de mejora / Habilidades", morado) y el cartel 3D vuelve a ocultarse con el.
* Estado del mundo intacto tras todo el ciclo (`Interactables` con sus 6 hijos, nada olvidado en `ServerStorage`) y sin errores en `get_runtime_logs`.

#### Archivos

**Tocados:** `StarterPlayer.StarterPlayerScripts.Controllers.ProximityPromptStyler` (refresco en vivo + red de seguridad contra tarjetas huerfanas), `StarterPlayer.StarterPlayerScripts.Controllers.SkillsTerminalController` (`ObjectText` restaurado + conexiones del cartel liberadas).


---

# 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-que-se-actualizan-en-vivo.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.
