Saltar al contenido
Docs

Servicio juego

Referencia del servicio juego. La partida: en qué dificultad y escena está, cuándo empieza, qué pasa en cada cuadro y cómo termina.

Corresponde aFormato 1, API 1 Para quien escribe código Esta página se genera desde las fuentes del SDK.

En esta página

La partida: en qué dificultad y escena está, cuándo empieza, qué pasa en cada cuadro y cómo termina.

Los tipos que aparecen en las firmas (Vec3, Texto, el selector) están en la referencia de la API.

Funciones y propiedades de juego#

PropiedadTipoDescripción
juego.idstringId del juego, el del manifiesto.
juego.dificultadstringId de la dificultad elegida, o '' si el juego no tiene dificultades.
juego.nivelDificultadnumberÍndice de la dificultad elegida dentro de dificultades (0 la primera). -1 si no hay.
juego.modo'solo' | 'sala-local' | 'sala''solo': un jugador. 'sala-local': un jugador más bots en este equipo. 'sala' está reservado y hoy no se usa.
juego.semillanumberSemilla de la partida. Con la misma semilla, azar da la misma secuencia.
juego.escenastringId de la escena cargada.
juego.terminadobooleantrue desde que se llamó a juego.terminar.

juego.alIniciar#

ts
juego.alIniciar(fn: () => void): void

Se llama una vez, con la escena cargada y los jugadores iniciales ya dentro. Registra aquí el resto de los eventos.

De docs/EJEMPLOS.md, «juego: iniciar, cada cuadro, terminar»:

ts
juego.alIniciar(() => {
  juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);
});

juego.cadaCuadro#

ts
juego.cadaCuadro(fn: (dt: number) => void): void

Se llama en cada cuadro de simulación. dt siempre vale 1/60.

De docs/EJEMPLOS.md, «mundo: mover piezas»:

ts
// A mano, cuadro a cuadro: una pieza en órbita. Se asigna un vector nuevo.
juego.cadaCuadro(() => {
  const a = reloj.ahora * 2;
  mundo.pieza('satelite').posicion = [Math.cos(a) * 5, 3, Math.sin(a) * 5];
});

juego.terminar#

ts
juego.terminar(fin: { resultado: 'victoria' | 'derrota' | 'fin'; puntaje?: number; tabla?: string; de?: Jugador; detalle?: Texto }): void

Termina la partida. Después de esto la sala se detiene: no corren más cuadros ni temporizadores.

De docs/EJEMPLOS.md, «juego: cambiar de escena»:

ts
mundo.alEntrar('tesoro', (_zona, j) => juego.terminar({ resultado: 'victoria', puntaje: 1, de: j }));

juego.cambiarEscena#

ts
juego.cambiarEscena(id: string): void

Descarga la escena actual y carga otra. Los jugadores reaparecen en la primera aparición. Vuelve a llamar a los alCambiarEscena.

De docs/EJEMPLOS.md, «juego: cambiar de escena»:

ts
// Escena "principal" con una zona "puerta"; escena "sotano" con una zona "tesoro".
mundo.alEntrar('puerta', () => juego.cambiarEscena('sotano'));

juego.alCambiarEscena#

ts
juego.alCambiarEscena(fn: (id: string) => void): void

Se llama después de cada juego.cambiarEscena, con el id de la escena nueva.

De docs/EJEMPLOS.md, «juego: cambiar de escena»:

ts
juego.alCambiarEscena((id) => juego.registro('Ahora en', id));

juego.registro#

ts
juego.registro(...datos: unknown[]): void   // `greengames probar` lo muestra

Escribe en la consola del reproductor (solo para depurar; el jugador no lo ve).

De docs/EJEMPLOS.md, «juego: iniciar, cada cuadro, terminar»:

ts
juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);

juego.senalar#

ts
juego.senalar(nombre: string, valor?: unknown): void

Deja una señal con nombre para el guion del bot (condiciones { "senal": "nombre" }). No hace nada más: el jugador no la ve. Sirve para que la prueba sepa en qué momento está el juego ('ronda', 'puerta-abierta'). valor debe ser JSON; por defecto true.

De docs/EJEMPLOS.md, «Guion de bot con señales, ciclos y ruta»:

ts
juego.senalar('puerta-abierta');      // cuando se abre

Notas de comportamiento#

terminar con tabla registra el puntaje en esa tabla para el jugador de (por defecto, el primer humano). Después de terminar la sala se detiene. cambiarEscena descarga la escena, carga la otra en el cuadro siguiente, lleva a los jugadores a su primera aparición y llama a alCambiarEscena.

Qué sobrevive a cambiarEscena:

Se conservaSe pierde
Todos los eventos registrados (alTocar, alEntrar, cadaCuadro, alAccion...): los de selector se vuelven a aplicar a las piezas y zonas de la escena nueva que calcenLas piezas, zonas, luces, actores y rótulos de la escena anterior, también los creados por script
Temporizadores (reloj.despues, reloj.cada) y cronómetrosLos eventos registrados con pieza.alTocar(fn) (se van con la pieza)
HUD, marcador, menús abiertos y sonidosLos grupos (son de las piezas)
Jugadores: datos, puntos, rapidez, salto, progresoLa aparicion de cada jugador (pasa a ser la primera de la escena nueva)
Señales de juego.senalar y ajustes de cámaraEl ambiente (toma el de la escena nueva)

Una derrota no entra a la tabla: terminar({ resultado: 'derrota', tabla }) no registra ni anuncia récord. Para registrar igual (un juego de supervivencia que siempre termina perdiendo), usa resultado: 'fin' o llama antes a puntajes.registrar.

Ejemplos completos#

Scripts completos de docs/EJEMPLOS.md. Cada uno supone una escena con lo que nombra, y las claves de texto (interfaz.t('...')) deben existir en textos de juego.json.

juego: iniciar, cada cuadro, terminar#

scripts/principal.ts
import { juego, jugadores } from '@greengames/sdk';

juego.alIniciar(() => {
  juego.registro('Partida en', juego.dificultad, 'con semilla', juego.semilla);
});

// Gana quien llegue a z = 50. dt siempre vale 1/60.
juego.cadaCuadro(() => {
  for (const j of jugadores.todos()) {
    if (j.posicion[2] >= 50) juego.terminar({ resultado: 'victoria', puntaje: 100, de: j });
  }
});

juego: cambiar de escena#

scripts/principal.ts
import { juego, mundo } from '@greengames/sdk';

juego.alIniciar(() => {
  // Escena "principal" con una zona "puerta"; escena "sotano" con una zona "tesoro".
  mundo.alEntrar('puerta', () => juego.cambiarEscena('sotano'));
  mundo.alEntrar('tesoro', (_zona, j) => juego.terminar({ resultado: 'victoria', puntaje: 1, de: j }));
});
juego.alCambiarEscena((id) => juego.registro('Ahora en', id));

Sigue con#