Bienvenidos amigos!! Pasad, pasad! :)
En este mini-tutorial repasaremos conceptos de BennuGD para Dreamcast: su estado, cómo funciona y cómo convertir viejos juegos de Fenix a BennuGD. ¿Empezamos?
Download BennuGD for Dreamcast - Under Update!
¿QUÉ ES BENNUGD?
Según Wikipedia:
BennuGD o simplemente Bennu es un lenguaje de programación, orientado al desarrollo de videojuegos en 2 y 3 dimensiones. Es una continuación de DIV Games Studio y Fénix y se distribuye bajo licencia GNU General Public License.
De hecho, BennuGD se compila encima de la librería SDL, quiere decir que le añade otra capa de lenguaje encima. Es un lenguaje simple y potente, pero el rendimiento es un poco más pequeño que usando sólo SDL.
Los amigos colombianos hicieron un port muy interesante de BennuGD, que lo pueden descargar de aquí:
https://code.google.com/p/bennugddrea...dreamcast/
¿CÓMO FUNCIONA?
BennuGD tiene un compilador y un intérprete. El compilador compila nuestro código (PRG) a un binario que se puede ejecutar en sus múltiples plataformas (DCB). En Dreamcast sólo está el intérprete, y el binario se tiene que decir "main.dcb" y ponerse junto al ejecutable bin de DC.
Por consiguiente, programaremos un entorno en nuestro ordenador (host), y compilaremos para DC (target). Fácil no? :)
La descarga del compilador e intérprete la podéis encontrar aquí:
http://www.bennugd.org/es/node/30
Nota para Maqueros: Os recomiendo seguir el tutorial del siguiente post para compilar la última versión...
PARCHES BENNUGD PARA KOS 2.0
*
MUY IMPORTANTE!!! Para que funcione BennuGD con KOS 2.0 y en hard real, hay que hacer estos cambios:
Fichero
/core/bgdi/src/main.c :
1. Añadir una línea de inicialización de flags del KOS:
#include <kos.h>
KOS_INIT_FLAGS(INIT_DEFAULT);
2. Eliminar un código redundante que hace que se bloquee la consola, que es el de la búsqueda del main.dcb. Debe quedar algo así:
int main( int argc, char *argv[] )
{
char * filename = NULL, dcbname[ __MAX_PATH ], *ptr ;
int i, j, ret = -1;
file * fp = NULL;
INSTANCE * mainproc_running;
dcb_signature dcb_signature;
//DREAMCAST specific code!!
#if 1
filename = "/cd/main.dcb";
if (!file_exists(filename)) {
printf("%s doesn't exist, quitting. \n",filename);
return -1;
}
// Remember to compile DCB with debug (bgdc -g) info!
//debug = 1;
#endif
[...]
Fichero
/modules/mod_sound/mod_sound.c :
Editar la función para cargar canciones (load_song) y así recuperamos la funcionalidad de las canciones y arreglamos un bug en la carga de múltiples ficheros en KOS:
static int load_song( const char * filename )
{
Mix_Music *music = NULL;
file *fp;
if ( !audio_initialized && sound_init() ) return ( 0 );
if ( !( fp = file_open( filename, "rb0" ) ) ) return ( 0 );
if ( !( music = Mix_LoadMUS_RW( SDL_RWFromBGDFP( fp ) ) ) )
{
file_close( fp );
fprintf( stderr, "Couldn't load %s: %s\n", filename, SDL_GetError() );
return( 0 );
}
file_close( fp );
return (( int )music );
}
3. Recientes versiones de KOS hace que se tenga que arreglar otro bug en el fichero:
modules/libvideo/g_video.c
La variable "scale_resolution" devuelve un valor -1, que hace que falle en la condición de asignar el tamaño del driver, y falle. En la línea 347 cambiar la condición por esta:
if ( scale_resolution > 0)
{
[...]
}
CONVERTIR FENIX A BENNUGD - NOTAS
* En BennuGD hay que importar "módulos", es decir, las funciones que se usarán. Hay de varios tipos: video, sound, math... Aquí un ejemplo:
import "mod_grproc";
import "mod_key"; //Teclado
import "mod_math";
import "mod_map";
import "mod_mouse"; //Ratón
import "mod_proc";
import "mod_rand";
import "mod_screen";
import "mod_scroll";
import "mod_sound";
import "mod_text";
import "mod_timers";
import "mod_video";
* No se define los "PROGRAM" en BennuGD, se quita esa línea.
* Para poner FLAGS en el código tenemos dos opciones.
- Se puede usar un #ifdef (ej. en un CONSTANT), y usarlo en el compilador: >> ./bgdc fichero.prg -DDREAMCAST
- O podéis consultar el valor de la variable "os_id" ya en el código, que en Dreamcast es OS_DC (= 5)
*
IMPORTANTE: Para encontrar los ficheros en Dreamcast, hay que ponerle la ruta "/cd/" a los ficheros!!!
* Importando "mod_dream" podremos guardar y cargar en la VMU (sólo puerto A1), además de reproducir música S3M y vídeos ROQ.
* Importando "mod_say" y la función say() podremos poner mensajes en la consola, para debug ;)
Y usando write(fontid, x, y, aligment, string) escribiremos cadenas de texto por pantalla.
Otros módulos interesantes son "mod_wm" (para poner con set_title un nombre a la ventana) o "mod_file" para cargar y guardar ficheros.
* El módulo "mod_joy" puede leer el PAD para Dreamcast (recuerda de inicializar KOS en el main.c del bgdi, sino te devolverá 0). La lectura es con joy_getbuttons() y los axis.
* Además, mod_key y mod_mouse emulan un teclado y ratón. Al estar basado en SDL, el ratón se emula con el stick analógico :) .
Los chicos de BennuGD nos han dejado un mapping por defecto de estas teclas del teclado (lo podéis cambiar y añadir un segundo jugador editando también el fichero:
/core/bgdi/src/main.c ).
SDL_DC_MapKey(0, SDL_DC_START, SDLK_RETURN);
SDL_DC_MapKey(0, SDL_DC_A, SDLK_s);
SDL_DC_MapKey(0, SDL_DC_B, SDLK_d);
SDL_DC_MapKey(0, SDL_DC_X, SDLK_a);
SDL_DC_MapKey(0, SDL_DC_Y, SDLK_w);
SDL_DC_MapKey(0, SDL_DC_LEFT, SDLK_LEFT);
SDL_DC_MapKey(0, SDL_DC_RIGHT, SDLK_RIGHT);
SDL_DC_MapKey(0, SDL_DC_UP, SDLK_UP);
SDL_DC_MapKey(0, SDL_DC_DOWN, SDLK_DOWN);
TIME TO PLAY!
¡Ya sólo nos queda disfrutarlo! Os funcionará tanto en emus (lxdream, nullDC) como en consola real. También lo podéis lanzar el binario 1ST_READ vía BBA añadiendo una imagen ISO con el main.dcb y los ficheros del juego.
Happy deving! :D