QB1AGL0; 20160110

QB1AGL0 v6.0

LA IDEA ES – Recuperar el tipo de motor QB1 que yo usaba a finales de los 90 / principios de los 2000 para hacer aventuras gráficas de las de pantalla fija. Tiene que ser realmente minimal. No voy a hacer funciones especiales de pintar texto porque quiero que tenga un “aspecto muy QB”, si eso tiene algún sentido…

[redef/refine] Consiste en hacer un motor que de aspecto y manejo evoque los primeros que hacía para point’n’clicks estáticos a finales de los 90, pero bien programado, por supuesto. La risa es que funcione en QBasic, no pida demasiada máquina, cargue imagenes dibujadas (paleta fija VGA, posibilidad de versión EGA), y montar uno de mis N viejos guiones de Muttantes en forma de aventurita. [/eorr]

Esto es una especie de brainstorming:

  • Llevará el intérprete de siempre: flags, condicionales, saltos, y cosas que faciliten programar con esa mierda.
  • Llavará paleta fija. Los primeros dos colores serán FONDO y TEXTO. Los colores 16 a 31 serán una escala de 16 grises. Los colores 192 a 255 serán 64 colores RGB de 2 bits (como la master). El resto de la paleta por ahora se queda vacía hasta nueva orden.
  • El motor estará construido en QBasic 1.0 con la posibilidad de compilar en QB 4.5 con cambios mínimos (básicamente, cambiar de versión de Blast!).
  • El motor cargará imagenes BSV de pantalla completa o imagenes PUT. Las imagenes PUT se cargarán con BLOAD en un array y se pintarán con BlastPut (o como se llamase) con el color 0 = transparente.
  • Necesito un conversor y una forma de indicar las dimensiones de la imagen en las imagenes PUT.

Idea para esto último: XXXWWWHH.PUT, con XXX = un número, WWW la anchura en HEX y HH la altura en HEX. ¿Puedo hacer que desde QBasic se busque la primera imagen en el directorio que empiece por XXX? No tengo ni idea, hace años que no uso esta mierda. Voy a ver…

~~

OK – Resuelto a la vieja usanza. Necesita un archivo temporal y MSDOS, pero no poder contar con eso sería la mierda.

FUNCTION findFilename$ (prefix$)
    ' Finds first occurence of a file beginning with "prefix$".
    tempFn$ = "C:\_LSTF.TMP"
    SHELL "dir " + prefix$ + "*.* /b > " + tempFn$
    f% = FREEFILE: OPEN tempFn$ FOR INPUT AS #f%
    IF EOF(f%) THEN
        o$ = ""
    ELSE
        LINE INPUT #f%, o$
    END IF
    CLOSE #f%
    KILL tempFn$
    findFilename$ = o$
END FUNCTION

Ahora voy a meter un BLAST minimal, voy a pintar una imagen, la voy a capturar, la voy a grabar en el disco, y luego voy a intentar discernir el formato misterioso con el editor hex y mucha paciencia. Tengo que lograr poder generar esto “a mano” para hacerme un conversor cómodo de usar.

[al final no uso esa mierda porque soy tonto y las dimensiones vienen en el puto archivo, además de que el método que empleo para cargar esta mierda no necesita a priori saber las dimensiones. Qué tonto soy a veces]

~~

Espera, no, porque he encontrado un conversor mierder y gráfico que me hice en tiempos para otra paranoia que no terminé y parece que va así:

	pf = fopen (input [1], "wb");

	// Write QB header
	d = 0xfd;
	fputc (d, pf);
	word = 0;

	// Segment, offset = 0
	fwrite (&word, sizeof (short), 1, pf);
	fwrite (&word, sizeof (short), 1, pf);

	// Size in bytes
	fwrite (&s, sizeof (short), 1, pf);

	// width * 8
	fwrite (&w, sizeof (short), 1, pf);

	// height
	fwrite (&h, sizeof (short), 1, pf);

	// pixels
	for (y = y1; y <= y2; y ++) {
		for (x = x1; x <= x2; x ++) {
			d = (unsigned char) (getpixel (bmp, x, y));
			fputc (d, pf);
		}
	}

	fclose (pf);

O sea, tendríamos cabecera y luego los pixels ordenados por filas. La cabecera sería así:

FD 00 00 00 00 LL LL W8 W8 HH HH, con LL LL = longitud en bytes, W8 W8 = anchura por 8, HH HH = altura. Todos los números son LSB MSB. El tamaño no cuenta la cabecera inicial pero si las dimensiones y es, por tanto, W * H + 4.

Con esto lo tengo fácil. Pero primero tengo que generar la paleta.

~~

Hecho, ya lo tengo todo: paleta para QB, paleta en código para el conversor, un PNG grande para dibujar y un PNG pequeño para yo qué sé.

Voy al lío con el conversor. Voy a necesitar antes hacer un dibujet. Reusaré algo convirtiéndolo malamente.

~~

Para el conversor: el modo BSV graba toda la pantalla completa. En este caso el formato es parecido pero la imagen va directamente sin cabecera de imagen, o sea:

FD 00 A0 00 00 00 FA y luego 64000 bytes.

Voy al lío. El conversor debe quejarse si la imagen de entrada es de más de 320×200. Además, funcionará en modo bobo: habrá que usar los colores exactos de la paleta (para eso me he hecho un .ACT en Photoshop). Recibirá un parámetro BSV/PUT. Si se recibe BSV la imagen se rellenará hasta ser de 320×200 si es más pequeña.

Let’s get busy!

~~

¡Bien! He hecho el conversor, que parece que medio va, pero aún no lo he probado en condiciones. Para eso necesito más infraestructura – por lo pronto, crear un .BAS nuevo con la BLAST!. Voy a ello, que churum está casi despertándose.

Hay que ver qué fácil me distraigo de mis mierdas. Otra vez Cheril on medio hold. Pero no por mucho tiempo, lo compaginaré.

~~

He visto lo que hay y tal, y creo que puedo coger del tirón todo el esqueleto de la versión anterior, quitar el intérprete y las funciones que pintan botones y cuadros de texto bonitos (porque esta versión tendrá el look oldschool 100%) y empezar a construir desde ahí.

Pero de entrada debería probar que el conversor funciona guay. Aunque ahora, hasta la noche, imposible.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s