CÓDIGO → CINTA → JUEGO
ONDA BASIC 1
Escribe un juego. Dale una carátula.
Llévalo a la consola en una cinta de audio.
Un lenguaje propio de ONDA, inspirado en BASIC. Studio compila tus reglas para que viajen con el juego. Usa sintaxis inglesa, cartuchos OND5 y VM 3. Antes de la versión 1.0 no se mantienen alias ni migraciones de revisiones retiradas.
01 / STUDIO
Tu mesa de trabajo
Studio abre el código a todo el ancho. Los menús agrupan las herramientas y las ventanas de configuración conservan el proyecto mientras editas.
| Menú | Acciones |
|---|---|
| Archivo | Nuevo juego, abrir y guardar un proyecto JSON, exportar una cinta WAV. |
| Ejemplos | Arcade: Neon Breaker, Star Invaders y Orbit Collector. Aventura: Cosmic Cow y Moss Snake. Marea Cromática muestra animación de paletas. |
| Cinta | Configurar nombre, autor, carátula y paleta en una misma ventana. Los cambios se aplican al proyecto; guárdalo para conservarlos. |
| Ejecutar | Probar juego inicia una partida con el código actual. Abrir previsualización permite continuar una prueba suspendida. |
| Ayuda | Insertar instrucciones en el cursor y abrir esta guía. |
Ctrl + O abre un proyecto; Ctrl + S lo descarga como JSON; Ctrl + Enter compila y prueba. En Mac puedes usar Cmd. Guardar descarga un archivo: no sobrescribe automáticamente el que abriste.
El editor comprueba el programa mientras escribes. Pulsa un error para ir a su línea. Tab inserta dos espacios y Enter conserva la sangría. Las ayudas se insertan en la posición del cursor: colócalas dentro de init o frame.
Puedes guardar un borrador con errores. Para probarlo o exportarlo debe compilar correctamente. Al abrir un JSON se requiere el campo source con código en inglés y una carátula de 64 × 48; no hay conversión de proyectos. El JSON conserva código, comentarios, carátula y paleta; el WAV transporta el programa compilado y los datos del juego.
02 / PRIMER JUEGO
Tu primer juego
Abre Archivo → Nuevo juego en Studio. Este ejemplo dibuja un cuadrado que puedes mover con la cruceta. La pantalla mide 320 × 240: x crece hacia la derecha, y hacia abajo.
# Los comentarios empiezan por #.
init
x = 150
y_pos = 100
end
frame
clear 0
if key("right") then
x = min(308, x + 100 * dt)
end
if key("left") then
x = max(0, x - 100 * dt)
end
rect x, y_pos, 12, 12, 6
text "MI PRIMER JUEGO", 70, 40, 7, 12
endinit se ejecuta una vez al arrancar. frame se ejecuta continuamente mientras juegas. Cada bloque acaba con end. El bloque init es opcional; frame es obligatorio. Solo puedes tener uno de cada.
dt es el tiempo del fotograma en segundos. Multiplicar una velocidad por dt evita que el movimiento dependa del número de fotogramas. Es una variable de solo lectura; se limita a 0,04 s.
03 / BLOQUES Y BUCLES
Condiciones y repeticiones
if vidas <= 0 then finish "GAME OVER" else text vidas, 20, 20, 7, 10 end repeat i, 10 rect i * 30, 50, 25, 8, 6 end
else es opcional, igual que la palabra then. El índice de repeat comienza en 0: repeat 10 veces produce los índices 0 a 9. Puedes anidar bloques; cada uno necesita su propio end. La indentación ayuda a leer, pero no cambia el comportamiento.
04 / INSTRUCCIONES
Instrucciones
Una instrucción por línea. Separa los argumentos con comas. Usa comillas dobles para los textos.
| Escritura | Qué hace |
|---|---|
vidas = 3 | Crea o modifica una variable. Las variables que todavía no se han asignado valen 0. |
clear 0 | Rellena toda la pantalla con un color de la paleta. |
rect x, y, ancho, alto, color | Dibuja un rectángulo relleno. |
text "Hola", x, y, color, tamano | Dibuja texto o un valor. Tamaño entre 6 y 24; y es la línea base del texto. |
tone 440, 0.1 | Emite un tono de 440 Hz durante una décima de segundo. Úsalo en acontecimientos como un choque, para no dispararlo cada fotograma. |
store indice, valor | Guarda un número en una celda de memoria; índices entre 0 y 1023. |
sprite x, y, ancho, alto, pixel | Dibuja píxeles de la carátula a tamaño real, desde el índice indicado. Las filas de origen tienen 64 píxeles. |
finish "¡Has ganado!" | Detiene el juego y muestra el mensaje final. |
Los colores son índices de 0 a 15, en el orden de la paleta del estudio. En la paleta ONDA original, 0 es el fondo oscuro, 6 es verde lima y 7 es blanco cálido. Los píxeles de la carátula también viajan en el cartucho.
05 / VALORES Y CONTROLES
Valores, operadores y funciones
Números: 3, -90, 0.1. Los decimales llevan punto. Textos: "Hola"; puedes escribir \" para incluir comillas. Un # dentro de comillas es texto; fuera de ellas inicia un comentario. Los textos que empiezan por $ están reservados por el formato interno.
Los nombres distinguen mayúsculas y minúsculas. Escribe instrucciones en minúscula y variables con letras a–z, números y guion bajo, empezando por una letra, máximo 21 caracteres. Evita nombres de instrucciones o funciones.
| Operadores | Ejemplo |
|---|---|
+ - * / % | x + velocidad * dt; % calcula el resto. |
== != < > <= >= | vidas != 0 |
and or not | vidas > 0 and not key("b") |
Precedencia, de mayor a menor: paréntesis; signo negativo y not; multiplicación/división/resto; suma/resta; comparaciones de orden; igualdad/desigualdad; and; or. Los operadores numéricos no concatenan texto. Dividir por cero devuelve 0. Las condiciones producen 1 o 0.
| Función | Resultado |
|---|---|
key("right") | 1 mientras se pulsa, 0 cuando se suelta. Nombres: left, right, up, down, a, b, start, select. En consola y estudio, Start inicia y luego controla la pausa; Select abre la ayuda. Durante pausa o ayuda no se ejecutan fotogramas. Al continuar, Start no se entrega de nuevo como acción al juego. |
min(x, 300) / max(x, 0) | El menor / mayor de dos números. |
abs(x) | Valor absoluto. |
mem(i) | Lee una celda guardada con store. Todas empiezan en cero. |
En el ordenador: flechas para la cruceta, X o espacio para A, Z para B, Enter para Start y Shift para Select. Mientras escribes en el editor, estas teclas escriben texto: pulsa Probar juego o Ctrl + Enter. La ventana de previsualización recibe el foco para jugar. Escape la cierra y suspende la prueba.
06 / PALETAS Y CARÁTULA
Paletas y animación de colores
Cada juego tiene 16 índices de color. Abre Cinta → Nombre, carátula y paleta. Elige ONDA, una selección de Amstrad CPC o escala de grises, o edita cada índice con el selector de color. Para el CPC, selecciona primero un índice del juego y después uno de sus 27 colores. La representación RGB utiliza intensidades 0, 128 y 255 como aproximación digital del monitor original.
La carátula usa la paleta del juego. Ambos se guardan en el proyecto y viajan por audio. Cambiar de paleta reasigna colores a los índices existentes; no modifica los píxeles. La importación de imágenes busca los colores más próximos de la paleta seleccionada.
# Cambia todos los píxeles dibujados con el índice 8. ink 8, "#0066CC" # Rota los colores 8 a 11 una posición hacia índices mayores. cycle 8, 11, 1 # En sentido contrario. cycle 8, 11, -1
ink indice, "#RRGGBB" requiere un índice entero entre 0 y 15 y un color hexadecimal de seis cifras. cycle primero, ultimo, pasos incluye los dos extremos; los argumentos son enteros, el rango debe estar entre 0 y 15 y primero no puede superar ultimo. Los pasos negativos invierten el sentido; cero no cambia nada.
Los cambios se aplican a toda la pantalla, incluidos los píxeles dibujados en init. Dos índices con el mismo RGB siguen siendo independientes. Afectan a rectángulos, textos y sprites que usen esos índices. Al reiniciar se recupera la paleta original; la carátula y la copia guardada no se alteran.
Abre Ejemplos → Marea Cromática: la escena se dibuja una vez y las olas avanzan rotando cuatro colores cada 0,15 segundos. A (X) oscurece el cielo; B (Z) pausa las olas. Reserva rangos exclusivos para efectos si no quieres cambiar también al personaje.
07 / TEXTO BITMAP
Texto y fuentes bitmap
La instrucción text usa fuentes bitmap incluidas en el motor. Los tamaños de 6 a 11 usan m5x7 a escala nativa. De 12 a 15 usan Press Start 2P a escala 1; de 16 a 23, a escala 2; y 24, a escala 3. Las coordenadas se redondean a píxeles enteros. El tamaño se ajusta a estas escalas para evitar trazos irregulares. Revisa la anchura al cambiar de tamaño: las fuentes tienen métricas diferentes.
Los caracteres no disponibles se representan con ?. Las fuentes funcionan sin conexión y no aumentan el tamaño de los cartuchos. El menú conserva Space Mono.
08 / AUDIO Y VIBRACIÓN
Sonido, música y vibración
Canales 0 y 1: pulsos; 2: bajo triangular; 3: ruido. Partituras MIDI:tiempos, con 0 para silencio. Se repiten con el reloj del juego y se pausan con él.
init music 0, "72:.5 76:.5 79:1 0:1", 120, .3 music 2, "48:1 55:1", 120, .4 end frame # En un evento del juego: # note 1, 84, .12, .5 # vibrate 40, .5 end
| Instrucción | Uso |
|---|---|
tone hz, seconds | Tono simple: 60–4.000 Hz y 0,01–0,3 s. Hasta cuatro llamadas por fotograma. |
note channel, midi, seconds, volume | Nota puntual: canales 0–3, MIDI 24–96 (0 apaga la voz), duración en segundos y volumen 0–1. La voz nueva sustituye a la anterior del mismo canal. |
music channel, score, bpm, volume | Partitura en bucle, tempo 40–240 BPM y volumen 0–1. Máximo 120 caracteres; cada nota dura 0,125–8 tiempos. |
silence channel | Detiene la partitura y la voz del canal. |
vibrate ms, intensity | Hasta 200 ms e intensidad 0–1. Requiere un dispositivo compatible y vibración activada en Ajustes de la consola. La previsualización de Studio no emite vibración. |
music, note, silence y vibrate comparten un máximo de ocho llamadas por fotograma. Todos los cartuchos usan VM 3.
Para sonidos de acciones, detecta la pulsación nueva. Si reproduces una nota en cada fotograma mientras se mantiene un botón, la reiniciarás continuamente:
init
last_a = 0
end
frame
if key("a") and not last_a then
note 0, 76, .12, .3
vibrate 25, .3
end
last_a = key("a")
endPara una melodía puntual, programa sus notas con un contador y dt, o detén la partitura con silence al terminar. music se repite hasta que la detienes.
09 / LÍMITES Y EXPORTACIÓN
Tamaño y límites
La barra inferior de Studio muestra el tamaño real de la cinta, el programa descomprimido y una estimación de duración del audio en modo Original. Son medidas diferentes: el texto que escribes se compila y el programa resultante se comprime.
| Recurso | Límite |
|---|---|
| Cinta transmitida | 16 KiB (16.384 bytes), incluida cabecera, carátula y programa comprimido. |
| Programa descomprimido | 64 KiB (65.536 bytes) de programa JSON. |
| Código fuente | 100.000 caracteres y 2.000 líneas. |
| Memoria numérica | 1.024 celdas, índices 0–1023. Se reinicia al comenzar una partida. |
| Bucles y ejecución | Hasta 1.024 iteraciones por bucle y 20.000 operaciones del intérprete por inicialización o fotograma; las expresiones también consumen operaciones. |
| Complejidad | Hasta 24 niveles de anidación; el validador también limita el tamaño y la profundidad del programa compilado. |
No hay funciones propias, importaciones, acceso a red o archivos, ni ejecución de JavaScript desde el juego. Si agotas el presupuesto de ejecución, el motor detiene el cartucho.
La sintaxis válida no garantiza que el juego esté equilibrado: prueba giros, colisiones, pausas, derrota y victoria. Las cintas ya exportadas conservan sus reglas; exporta otro WAV para compartir una versión nueva.