Holas.
Machiminax, he sacado un poco de tiempo para desempolvar y revisar el código del
Mamelayplus que hicimos Lord Hiryu y yo tal y como te comenté por privado.
Como Antolin y otras personas también me han preguntado en otras ocasiones por el, he pensado que lo mejor sería explicarlo abiertamente, así que voy a ello.
Antes de nada he de decir que el trabajo gordo de la modificación del Mamelayplus no estuvo realmente en el código que se añadió o modificó, sino en la investigación sobre los cientos de ficheros y millones de líneas de código que tiene el Mame.
Es importante recalcar que el código original del Mame suele ser muy cambiante, por lo que normalmente los parches que se proporcionan para modificar algo del Mame, suelen estar orientados a una única versión, esta es la razón por la que nosotros para el Mamelayplus proporcionamos, aparte de los ejecutables, un parche para poder usarse combinado con otros parches que existen en muchos foros.
He pensado que la mejor manera de explicar el mod del Mamelayplus, es explicar el propio código línea por línea, así que voy a ello
El parche realmente contiene dos modificaciones diferentes: una es realmente la característica especial que nos permite leer los directorios definibles y la otra es un simple mod para que no muestre unas barras feas que pone el Mame por defecto cuando no encuentra una imagen determinada. Las dos modificaciones se hacen en el fichero "src/emu/rendlay.c":
/**
* Fichero que hay que modificar
*/
+++ src/emu/rendlay.c 2013-07-11 10:36:32.641164200 +0200
/**
* Línea en la que se aplica esta primera parte del parche
*/
@@ -620,6 +620,22 @@
if (dirname != NULL)
m_dirname = dirname;
/**
* Esta línea lo que hace es tomar el contenido de "file" desde el .lay. En este
* caso se trata del nombre del fichero, por ejemplo en <image file="%df1" />
* m_imagefile[0] tomará el valor "%df1".
* En esta variable m_imagefile, el Mame guarda el path a la imagen que necesita para
* poner en pantalla y completar así una descripción que viene en el fichero .lay que
* está procesando
*/
m_imagefile[0] = xml_get_attribute_string_with_subst(machine, compnode, "file", "");
+
+ // Tapule & LordHiryu mod ----------------------------------------------------------
+ // Use %dfX as file name to let the layout use arwork/definableX/gamename.png as image
/**
* Aquí se comprueba si el nombre leído del .lay es un parámetro "%df" que hemos definido
* nosotros mismo, es decir, no existe en MAME, si es así, le aplicará nuestro código
*/
+ if(m_imagefile[0][0] == '%' && m_imagefile[0][1] == 'd' && m_imagefile[0][2] == 'f'){
/**
* Volvemos a leer el parámetro "file" en una variable temporal para obtener el valor
* numérico del definable, por ejemplo, en "%df1", necesitamos ese 1 para identificar
* la carpeta especial donde se guardarán las imágenes
*/
+ const char *l_img = xml_get_attribute_string_with_subst(machine, compnode, "file", "");
/**
* En esta variable guardaremos el identificador del definable
*/
+ int l_definable = 0;
/**
* En esta variable guardaremos el nombre de nuestra carpeta para el definable
*/
+ char l_temp[100];
+
/**
* Leemos el identificador a partir de la posición 3. En las posiciones 0..2 ya sabemos
* que el contenido es "%df", así que lo saltamos. Guardamos el identificador en l_definable
*/
+ sscanf(&l_img[3], "%d", &l_definable);
/**
* Montamos el nombre del directorio especial donde se guardarán nuestras imágenes para
* el definable que acabamos de leer. Tendrá el formato "definable" + Identificador del
* definable
*/
+ sprintf(l_temp, "definable%d", l_definable);
/**
* Creamos una ruta relativa completa al fichero de imagen real que se deberá usar.
* machine.basename() es un método del MAME que devuelve el nombre de la máquina
* para la que se está procesando el .lay, es decir, contiene el nombre del juego.
* Por ejemplo para el ghost'n goblins, usando el %df1, el nombre final guardado
* en m_imagefile[0] será:
* "definable1" + "\" + "gng" + ".png"
+ m_imagefile[0].cpy(l_temp).cat(PATH_SEPARATOR).cat(machine.basename()).cat(".png");
+ // Reset dirname to force arwork folder as default for the definables
/**
* Esta línea fuerza al mame a que tome como directorio base "artwork" y que monte
* la ruta final del fichero a partir de el, por lo tanto, nuestra ruta final para
* la imagen, siguiendo con el ghost'n goblins y el %df1 será:
* "artwork\definable1\gng.png"
+ m_dirname.reset();
+ }
+ // Tapule & LordHiryu mod ----------------------------------------------------------
+
m_alphafile[0] = xml_get_attribute_string_with_subst(machine, compnode, "alphafile", "");
m_file[0] = global_alloc(emu_file(machine.options().art_path(), OPEN_FLAG_READ));
}
/**
* Línea en la que se aplica esta segunda parte del parcheo
*/
@@ -1193,6 +1209,10 @@
// draw some stripes in the bitmap
m_bitmap[0].allocate(100, 100);
m_bitmap[0].fill(0);
/**
* Estas líneas realmente lo que hacen es "comentar", es decir, deshabilitar unas líneas
* de código originales del MAME.
* Estas líneas de código, si no localizan el fichero correspondiente, dibujan una barras
* muy feas en lugar de la imagen y además vuelcan información del error.
* Esto hacía que los layouts que no encontraban alguna imagen se vieran feísimos, así
* que decidí deshabilitarlo.
*/
+
+ /*
+ // Tapule & LordHiryu mod ----------------------------------------------------------
+ // Don't draw ugly stripes and don't log errors if dinamic images does not exist
for (int step = 0; step < 100; step += 25)
for (int line = 0; line < 100; line++)
m_bitmap[0].pix32((step + line) % 100, line % 100) = MAKE_ARGB(0xff,0xff,0xff,0xff);
@@ -1202,6 +1222,8 @@
mame_printf_warning("Unable to load component bitmap '%s'", m_imagefile[0].cstr());
else
mame_printf_warning("Unable to load component bitmap '%s'/'%s'", m_imagefile[0].cstr(), m_alphafile[0].cstr());
+ // Tapule & LordHiryu mod ----------------------------------------------------------
+ */
}
}
Bueno, pues eso es lo que hace nuestro mod. Como podéis ver no es tanto código, pero realmente me llevó muchas horas poder llegar a saber donde tenía que tocar, los que habéis visto el código fuente del Mame supongo que sabréis perfectamente de lo que hablo
Espero que esto os sirva para lo que queréis hacer y aunque ando bastante liado con el frontend que estoy programando (BMonkey), si necesitáis un cable, mandadme un privado para que me llegue al correo, que si lo reviso a diario.
Saludos y muchos ánimos con el proyecto