Saltar al contenido
Docs

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.

juego.json
{
	"$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#

PropiedadTipoQué es
$schematextoOpcional. Ruta al esquema JSON, para que tu editor de texto complete y marque errores.
formato1Versión del formato. Siempre 1.
idtextoIdentificador del juego. Minúsculas, números y guiones, hasta 48 caracteres. Igual al nombre del directorio.
versiontextoVersió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.
portadatextoRuta 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.
controlesobjetoCon qué se juega (teclado, tactil, mando) y qué hace cada botón (acciones).
etiquetaslista de textosPara el catálogo: ["obstaculos", "carrera"]. Hasta 8, sin repetir.
dificultadeslistaCada una con id y nombre en dos idiomas. Hasta 5; puede ser [].
dificultadInicialtextoOpcional. El id de la dificultad que aparece elegida.
puntajeslistaTablas de puntajes locales. Hasta 8; la primera es la principal.
escenaInicialtextoEl id de la escena con que empieza el juego (el archivo escenas/<id>.json).
scripttextoScript 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 id lleva 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 id y version para saber si un .ggx que 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):

juego.json (fragmento)
	"jugadores": { "min": 1, "max": 8 },
	"multijugador": {
		"local": { "max": 4, "pantalla": "dividida" },
		"enLinea": { "max": 8 }
	},
PropiedadValoresQué significa
local.maxde 2 a 4Cuá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.maxde 2 a 16Cuántos jugadores admitiría una sala por internet.
enLinea.minde 1 a 16Opcional.
  • Ningún max de multijugador puede ser mayor que jugadores.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ónUso habitual
saltarSaltar.
accionLa acción principal del juego: abrir, llamar un ascensor, construir.
accion2Una 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, normal y dificil. 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, y juego.dificultad es una cadena vacía.
  • dificultadInicial debe ser uno de los id declarados.
  • Los mismos id se 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.

PropiedadValoresQué 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 es tiene {seg} y en no, 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.