Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Codigo de terceros: se empaqueta, no se formatea.
vendor/
23 changes: 22 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,27 @@ npm.cmd run lint
git diff --check
```

El estado publicado por Codex parte de 65 pruebas y 515 aserciones verdes. Si
El estado publicado por Codex parte de 103 pruebas y 745 aserciones verdes. Si
una integración cambia ese número, documentá por qué y probá el recorrido
completo: aceptar desafío, entrar al Coliseo, combatir, finalizar y regresar.

## Estado actual del PvP

- `lib/duel.js` ya contiene `Duel` y `DuelCombat`: lados deterministas, retorno,
límites, vida, equipo, alcance, defensa, enfriamiento, rendición y resultado.
- `Runa.startDuel()` entra al mapa y `Runa.duelInput()` es el borde para inputs
locales o remotos ordenados. No dupliques estas reglas en `net.js`.
- La interfaz dibuja ambos stickmans, vida, dirección, alcance y recarga; `R`
rinde y la salida `Q` queda bloqueada mientras la sesión vive.
- El guardado conserva la ubicación anterior al duelo y el daño PvP no modifica
la vida persistente de PvE.
- `lib/net.js` ya transporta desafío/aceptación, inputs ordenados, resultado y
desconexión. El peer con id menor es la autoridad de orden; no agregues un
segundo reloj ni apliques predicción de daño del lado invitado.
- `V` abre la interfaz de wallet. `lib/wallet.js` guarda solo la dirección
pública y acepta un firmante externo inyectado; nunca agregues una seed
secreta al guardado. Detalles en `docs/wallet.md`.
- Pendiente: desplegar/configurar el id de `contracts/duel-arena`, construir el
XDR de sus llamadas y conectar Wallets Kit/WalletConnect o SEP-7 para firmar.
- `contracts/duel-arena` liquida commit-reveal y consenso; no ejecuta ni debe
fingir que ejecuta cada cuadro del combate visual.
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ El escudo solo aparece junto al personaje cuando está equipado y reduce en `2`
| Nombre | escribir, `Enter`, `Esc` | Editar, confirmar o volver |
| Ciudad y pradera | `WASD` / flechas | Moverse |
| Mundo | `E` / `Enter` / `Espacio` | Hablar o interactuar |
| Jugador cercano | `E` | Enviar un desafío PvP |
| Invitación PvP | `Enter` / `N` | Aceptar o rechazar |
| Coliseo PvP | `WASD`, `F`, `R` | Moverse, atacar o rendirse |
| Ciudad | `V` | Abrir Wallet y PvP |
| Wallet | `A` / `Enter`, `X`, `Esc` | Vincular, desvincular o volver |
| Pradera | `T` | Volver a la ciudad fuera de combate |
| Combate | `F` / `Espacio` / `Enter` | Resolver un intercambio |
| Tienda | flechas, `Enter`, `X`, `Esc` | Elegir, equipar, quitar o salir |
Expand All @@ -116,6 +121,12 @@ El escudo solo aparece junto al personaje cuando está equipado y reduce en `2`

La terminal mínima es de **64x16**. Para apreciar el mapa y la ficha lateral se recomienda **120x34** o más.

La pantalla de wallet acepta únicamente una dirección pública Stellar `G...` y
la guarda con la ranura. No acepta ni almacena seeds secretas `S...`. Vincular
una dirección identifica al jugador, pero las apuestas on-chain seguirán
marcadas como pendientes hasta configurar el contrato desplegado y un firmante
externo. Consulta [docs/wallet.md](docs/wallet.md).

## Ejecutar desde el repositorio

Requiere Node.js y npm para instalar las dependencias. El juego se ejecuta con el runtime Bare incluido en el proyecto.
Expand Down
70 changes: 56 additions & 14 deletions docs/coliseum.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,67 @@ monstruos.

## Contrato para integrar los duelos

Cuando ambos jugadores acepten el desafio, la capa de red debe colocarlos en
los puntos publicados por el mapa:
Cuando ambos jugadores acepten el desafio, la capa de red entrega las dos
identidades y el bloque de estadisticas que revelo cada participante:

```js
const arena = MAPS.coliseum
const local = arena.duelSpawns[0]
const rival = arena.duelSpawns[1]

game.walker.placeAt('coliseum', local.x, local.y)
game.startDuel(rival, {
selfId: localPeerId,
rivalId: rivalPeerId,
rivalStats
})
```

Cada punto incluye `id`, `x`, `y` y `facing`. Las posiciones oeste y este son
simetricas, transitables y miran hacia el centro. `refereeSpawn` reserva el
lugar del arbitro y `arenaBounds` delimita el campo que la logica de duelo debe
usar para impedir que un combatiente huya a las gradas.
`Duel` calcula los lados sin negociacion y toma las coordenadas directamente de
`MAPS.coliseum.duelSpawns`. Cada punto incluye `id`, `x`, `y` y `facing`. Las
posiciones oeste y este son simetricas, transitables y miran hacia el centro.
`refereeSpawn` reserva el lugar del arbitro y `arenaBounds` encierra a los dos
combatientes en el campo.

La entrada normal aparece en el tunel sur. La baldosa `Q` es una salida de
seguridad que regresa a la ciudad; el sistema de duelo puede bloquearla mientras
la pelea este activa y devolver a cada jugador a su posicion previa al terminar.
la pelea este activa. Rendirse, perder o desconectarse devuelve a cada jugador
a la posicion exacta que se guardo antes de entrar. Un autoguardado hecho en
medio del duelo tambien conserva esa posicion segura, nunca una sesion huerfana.

## Combate PvP local

`DuelCombat` es una maquina de estado determinista. Con la misma secuencia
ordenada de movimiento, ataque y ticks produce el mismo resultado en los dos
peers. Las reglas actuales son:

- `WASD` o flechas mueven dentro de `arenaBounds`.
- `F`, Espacio o Enter atacan.
- `R` o Escape rinden al jugador local.
- La vida, ataque, defensa, alcance y enfriamiento salen del equipo revelado.
- La defensa reduce cada golpe con un minimo de un punto de dano.
- Atacar fuera de alcance falla y consume el enfriamiento.
- La distancia se mide entre los cuerpos ASCII, no entre sus anclas, para que
dos stickmans no tengan que superponerse antes de que una espada conecte.
- El dano PvP vive solo en la sesion: no reduce la vida persistente usada por
monstruos y jefe mundial.

La vista muestra vida de ambos, direccion del rival, distancia/alcance y estado
del enfriamiento. Los dos participantes usan el stickman compacto con su
inicial y el equipo que realmente llevan.

## Transporte P2P conectado

Un jugador cercano se desafia con `E`. El receptor acepta con Enter o rechaza
con `N`. Los mensajes son dirigidos por id de sesion, tienen proteccion contra
repeticiones y se descartan si llegan desde otra conexion o para otro peer.

El peer cuyo id es menor actua como reloj y ordena `intent` en pasos numerados.
Solo esa secuencia modifica `DuelCombat`; el invitado no predice dano ni
movimiento. Ticks, desplazamiento, ataque y rendicion cruzan el mismo camino,
por lo que ambos extremos reproducen el mismo resultado. El silencio de un peer
libera al otro del Coliseo y lo devuelve a su posicion anterior.

El resultado local no paga apuestas por si solo. El contrato Soroban de
`contracts/duel-arena` recibe revelaciones y declaraciones de ganador, resuelve
consenso y liquida la apuesta por separado. Para esa etapa falta desplegar el
contrato y conectar un firmante externo; la interfaz actual nunca almacena una
clave secreta. Ver `docs/wallet.md`.

## Arte y colisiones

Expand All @@ -36,5 +78,5 @@ la pelea este activa y devolver a cada jugador a su posicion previa al terminar.
- `Q`: salida interactiva a la ciudad.

El mapa no implementa sincronizacion, reglas, apuestas ni dano PvP. Esas
responsabilidades quedan en el modulo de duelos; el Coliseo solo ofrece una
geometria estable y los puntos de integracion.
responsabilidades quedan en `lib/duel.js`; el Coliseo solo ofrece una geometria
estable y los puntos de integracion.
28 changes: 28 additions & 0 deletions docs/wallet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Wallet en Runa

La interfaz se abre con `V` desde la ciudad. Muestra tres estados distintos:

- **sin wallet**: no hay identidad Stellar asociada a la partida;
- **direccion vinculada**: existe una cuenta publica `G...`, pero no se afirma
que el juego pueda firmar por ella;
- **firma externa conectada**: un adaptador de wallet puede firmar el XDR fuera
del proceso del juego.

Enter o `A` abre el ingreso de la direccion publica. `X` la desvincula y Escape
vuelve al mapa. La direccion se valida con `StrKey` y se guarda en la ranura de
la partida. Una seed secreta `S...` se rechaza y nunca entra al guardado.

`WalletSession` recibe un adaptador por inyeccion con `signTransaction(xdr)`.
Esto deja preparada la frontera para una wallet real sin acoplar el TUI a una
extension de navegador. En la version actual no se incluye un adaptador: por
eso la pantalla dice honestamente **solo identidad**.

Para publicar apuestas falta configurar dos datos externos que no existen en el
repositorio: el id desplegado de `contracts/duel-arena` y un firmante. En una
aplicacion web, Stellar recomienda Stellar Wallets Kit. En terminal se puede
usar un companion web con WalletConnect o un flujo SEP-7; ambos mantienen la
autorizacion fuera de Runa.

- Wallets recomendadas: https://developers.stellar.org/docs/tools/developer-tools/wallets
- SEP-7: https://developers.stellar.org/docs/build/apps/wallet/sep7
- Firma Soroban: https://developers.stellar.org/docs/build/guides/transactions/signing-soroban-invocations
6 changes: 4 additions & 2 deletions docs/world-boss.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,10 @@ Si el jugador se aleja del altar, el Coloso deja de lanzar ataques y limpia los
## Lectura del combate

- `Piedra dormida` enseña tres ataques: ambos puños cercanos y una onda lenta de largo alcance.
- `Runa fracturada`, desde 66 % de vida, pierde defensa y agrega un barrido de alcance medio.
- `Núcleo expuesto`, desde 30 %, pega más fuerte y prepara un colapso muy visible de tres turnos.
- `Runa fracturada`, desde 66 % de vida, abre grietas visibles en cara, coraza, cintura y piernas; conserva los ataques aprendidos y agrega un barrido de alcance medio.
- `Núcleo expuesto`, desde 30 %, sustituye la runa del pecho por un núcleo `***`, pega más fuerte y agrega un colapso muy visible de tres turnos.
- Cada ataque fija la posición objetivo cuando empieza su animación. Los signos `!` y líneas `=` del suelo son advertencias sin daño: si el héroe sale de ahí antes del lanzamiento, el poder no vuelve a apuntarle mágicamente.
- Al cruzar un umbral se anuncia la nueva fase y el cuerpo cambia inmediatamente, sin alterar el lienzo estable de 43 × 13.
- Los ataques avanzan con turnos de entrada, no con redibujados temporizados. Esto conserva la solución usada para evitar que el movimiento rompa las líneas de la consola.
- El jefe permanece anclado. Su tamaño es visual; su punto lógico está en el centro de los pies.

Expand Down
Loading