El manifiesto (juego.json)
Todas las propiedades de juego.json con un ejemplo real, y las reglas de id, portada, controles, dificultades, tablas de puntajes y textos en dos idiomas.
Corresponde aFormato 1, API 1 Para quien escribe código
En esta página
juego.json es la ficha del juego: cómo se llama, quién lo hizo, con qué se juega, qué dificultades y tablas de puntajes tiene, y todos los textos que muestra. Está en la raíz de la carpeta del juego.
Todas las propiedades son obligatorias salvo dificultadInicial, multijugador, autor.contacto y $schema. No se admiten propiedades desconocidas: una clave mal escrita es un error del validador, no algo que se ignora.
Un manifiesto real#
Este es el manifiesto de la plantilla con que greengames crear arma un juego nuevo (packages/toolkit/plantilla/juego.json en el repositorio de Green Games). Al crear, la herramienta cambia el id por el nombre que diste.
{
"$schema": "../../packages/sdk/esquemas/juego.schema.json",
"formato": 1,
"id": "plantilla",
"version": "0.1.0",
"nombre": { "es": "Mi juego", "en": "My game" },
"descripcion": {
"es": "Junta todas las monedas antes de que se acabe el tiempo. No pises la lava.",
"en": "Collect every coin before time runs out. Do not step on the lava."
},
"autor": { "nombre": "Tu nombre" },
"portada": "recursos/portada.svg",
"jugadores": { "min": 1, "max": 1 },
"controles": {
"teclado": true,
"tactil": true,
"mando": true,
"acciones": {
"saltar": { "es": "Saltar", "en": "Jump" }
}
},
"etiquetas": ["recoleccion"],
"dificultades": [
{ "id": "facil", "nombre": { "es": "Fácil", "en": "Easy" } },
{ "id": "normal", "nombre": { "es": "Normal", "en": "Normal" } },
{ "id": "dificil", "nombre": { "es": "Difícil", "en": "Hard" } }
],
"dificultadInicial": "normal",
"puntajes": [
{ "id": "puntos", "nombre": { "es": "Mejores puntajes", "en": "High scores" }, "orden": "mayor", "formato": "numero" }
],
"escenaInicial": "principal",
"script": "scripts/principal.ts",
"textos": {
"es": {
"objetivo": "¡Junta las {total} monedas!",
"monedas": "{n} de {total}",
"lava": "¡Lava! Pierdes {seg} segundos.",
"caida": "Te caíste. Vuelves al inicio.",
"ganaste": "Te sobraron {seg} segundos",
"perdiste": "Juntaste {n} de {total} monedas"
},
"en": {
"objetivo": "Collect all {total} coins!",
"monedas": "{n} of {total}",
"lava": "Lava! You lose {seg} seconds.",
"caida": "You fell. Back to the start.",
"ganaste": "You had {seg} seconds left",
"perdiste": "You collected {n} of {total} coins"
}
}
}Las claves van sin tildes ni eñes (descripcion, tactil, dificultades). Los valores que el jugador lee sí llevan tildes.
Propiedades#
| Propiedad | Tipo | Qué es |
|---|---|---|
$schema | texto | Opcional. Ruta al esquema JSON, para que tu editor de texto complete y marque errores. |
formato | 1 | Versión del formato. Siempre 1. |
id | texto | Identificador del juego. Minúsculas, números y guiones, hasta 48 caracteres. Igual al nombre del directorio. |
version | texto | Versión del juego: tres números separados por puntos, como "1.0.0". |
nombre | { es, en } | Nombre del juego en los dos idiomas. Hasta 240 caracteres cada uno. |
descripcion | { es, en } | Qué hay que hacer, en una o dos frases. |
autor | { nombre, contacto? } | Quién lo hizo. nombre hasta 80 caracteres; contacto es opcional, hasta 120. |
portada | texto | Ruta a una imagen dentro de recursos/. |
jugadores | { min, max } | Cuántos jugadores admite la partida, de 1 a 16. Con max mayor que 1, el reproductor ofrece jugar con bots. |
multijugador | { local?, enLinea? } | Opcional. Cómo se juega de a varias personas. Ver Multijugador. |
controles | objeto | Con qué se juega (teclado, tactil, mando) y qué hace cada botón (acciones). |
etiquetas | lista de textos | Para el catálogo: ["obstaculos", "carrera"]. Hasta 8, sin repetir. |
dificultades | lista | Cada una con id y nombre en dos idiomas. Hasta 5; puede ser []. |
dificultadInicial | texto | Opcional. El id de la dificultad que aparece elegida. |
puntajes | lista | Tablas de puntajes locales. Hasta 8; la primera es la principal. |
escenaInicial | texto | El id de la escena con que empieza el juego (el archivo escenas/<id>.json). |
script | texto | Script de entrada dentro de scripts/, con extensión .ts o .js. |
textos | { es, en } | Los textos del juego, por clave, en los dos idiomas. Hasta 500 claves por idioma y 240 caracteres por texto. |
Reglas#
id y versión#
- El
idlleva solo minúsculas, números y guiones (torre-de-cajas), y debe ser igual al nombre del directorio del juego. Si no coincide, el validador lo marca. - El launcher usa
idyversionpara saber si un.ggxque importas es un juego nuevo o una versión más nueva de uno que ya tienes.
Portada#
- Imagen de proporción 16:9 dentro de
recursos/. - Formatos: svg, png, webp o jpg. Máximo 2 MB.
- La ruta debe existir en la carpeta: si falta el archivo, el paquete no se arma.
Multijugador#
Sin multijugador, el juego es de una persona (más bots, si jugadores.max lo permite). Con él, el juego declara cómo se juega de a varias. Así lo declara la plantilla multijugador (packages/toolkit/plantillas/multijugador/juego.json):
"jugadores": { "min": 1, "max": 8 },
"multijugador": {
"local": { "max": 4, "pantalla": "dividida" },
"enLinea": { "max": 8 }
},| Propiedad | Valores | Qué significa |
|---|---|---|
local.max | de 2 a 4 | Cuántas personas pueden jugar en el mismo equipo, sin conexión. La pantalla de inicio del juego deja elegir de 1 a ese número. |
local.pantalla | "dividida" o "compartida" | "dividida" (por defecto): una cámara y un HUD por persona; dos mitades con 2 jugadores, cuatro cuartos con 3 o 4. "compartida": una sola cámara que sigue al centro del grupo; elige un zoom o una distancia que deje ver toda la arena. |
enLinea.max | de 2 a 16 | Cuántos jugadores admitiría una sala por internet. |
enLinea.min | de 1 a 16 | Opcional. |
- Ningún
maxdemultijugadorpuede ser mayor quejugadores.max: el validador lo marca con GB122. - El multijugador local funciona en el portal, en el launcher 0.4.0 y en el editor 0.4.0. Con mandos, uno por persona; sin mandos suficientes, dos personas comparten el teclado.
- El script no necesita nada especial para varias personas, pero sí respetar las reglas de siempre: Varios jugadores.
Controles y acciones#
teclado, tactil y mando dicen con qué funciona el juego. El reproductor ya traduce los tres a las mismas acciones; declara los tres en true salvo que tu juego de verdad no sirva con alguno (el validador avisa si falta uno).
acciones dice qué hace cada botón en este juego. Hay tres acciones de siempre:
| Acción | Uso habitual |
|---|---|
saltar | Saltar. |
accion | La acción principal del juego: abrir, llamar un ascensor, construir. |
accion2 | Una segunda acción. |
La versión 1.1 del contrato suma dos, que se declaran igual: primaria y secundaria, los botones del puntero (clic izquierdo y derecho, los gatillos del mando, mantener el dedo y un toque corto). Las usa un juego de mundo abierto para romper y poner bloques, y sirven para cualquier otro. No funcionan en el launcher ni en el editor anteriores a la 0.3.0.
Solo las acciones declaradas tienen botón táctil y aparecen en la ayuda de controles. Moverse y girar la cámara existen siempre y no se declaran. El texto de cada acción es lo que el jugador lee en la tabla de controles: escribe lo que hace el botón ("Llamar el ascensor"), no su nombre.
Dificultades#
- Lo normal son tres:
facil,normalydificil. Con otra cantidad, el validador avisa. - El orden importa. El script recibe el índice de la dificultad elegida en
juego.nivelDificultad: 0 la primera, 1 la segunda, 2 la tercera. Sin dificultades vale -1, yjuego.dificultades una cadena vacía. dificultadInicialdebe ser uno de losiddeclarados.- Los mismos
idse usan en las escenas para que una pieza exista solo en algunas dificultades.
Tablas de puntajes#
Cada tabla tiene id, nombre en dos idiomas, orden y formato.
| Propiedad | Valores | Qué significa |
|---|---|---|
orden | "menor" o "mayor" | "menor": gana el valor más bajo (tiempos). "mayor": gana el más alto (puntos). |
formato | "tiempo" o "numero" | "tiempo": el valor son segundos y se muestra como 1:23.45. "numero": se muestra tal cual. |
Las tablas son locales: se guardan en el equipo de quien juega. Cada dificultad tiene su propia lista, de 10 entradas. No hay tablas globales.
El script registra un puntaje pasando tabla a juego.terminar. Una derrota no entra a la tabla. El detalle está en juego y puntajes.
Textos#
Todo texto que el juego muestra vive en textos, por clave, en español y en inglés. El script lo pide con interfaz.t('clave', { variables }) y cada reproductor lo muestra en el idioma del jugador.
- Las claves empiezan con minúscula y usan letras, números, punto, guion o guion bajo.
- Las variables se escriben entre llaves:
"monedas": "{n} de {total}". - Las dos listas deben tener las mismas claves y las mismas variables. Si
estiene{seg}yenno, es un error. - No armes frases concatenando en el script. Pon la frase completa en la plantilla y pasa los valores como variables.
Sigue con#
- Escenas: el mundo que el manifiesto nombra en
escenaInicial. - interfaz: cómo usa el script los textos, el HUD y los mensajes.
- El validador: los códigos que revisan el manifiesto.