Pues añado otro parche, un poco más largo esta vez.
Este parche contiene el anterior, y además añade soporte para cargar una configuración a partir de un xml (por defecto "config.xml"), por lo que para compilar hace falta "libxml2". La librería "libxml2" está en WiiBrew, pero tiene un fallito. El directorio de includes se debe llamar "libxml" y no "libxml2".
Para hacer pruebas, he añadido soporte para poder especificar el nombre del png y la posición y tamaño de la consola (con lo que se podrá modificar el skin para que el rectángulo negro en donde aparece la información esté en donde quiera el diseñador del skin. Esta idea es bastante ampliable, además de que la he implementado muy "crudamente", pero ya dejo las pijaditas a los que están desarrollando los mods
.
Adjunto el diff de Makefile y usb-loader.c, y además los nuevos ficheros xml.h y xml.c. El código es muy sencillo y puede ser adaptado con rapidez para lo que se quiera, como podrán comprobar por ustedes mismos.
También adjunto un config.xml de ejemplo.
Misma licencia que el anterior, y avisen si se usa
.
Makefile:
diff -crB USB-Loader_v1.1/Makefile USB-Loader/Makefile
*** USB-Loader_v1.1/Makefile 2009-03-30 15:55:19.000000000 +0100
--- USB-Loader/Makefile 2009-04-04 16:58:55.000000000 +0100
***************
*** 32,38 ****
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
! LIBS := -lfat -lpng -lwiiuse -lbte -logc -lm -lz
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
--- 30,36 ----
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
! LIBS := -lxml2 -lfat -lpng -lwiiuse -lbte -logc -lm -lz
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
usb-loader.c:
diff -crB USB-Loader_v1.1/source/usb-loader.c USB-Loader/source/usb-loader.c
*** USB-Loader_v1.1/source/usb-loader.c 2009-03-30 12:37:00.000000000 +0100
--- USB-Loader/source/usb-loader.c 2009-04-04 16:48:36.000000000 +0100
***************
*** 1,5 ****
--- 1,9 ----
#include <stdio.h>
#include <ogcsys.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <fat.h>
+ #include "xml.h"
#include "disc.h"
#include "menu.h"
***************
*** 10,39 ****
#include "wpad.h"
/* Constants */
! #define CONSOLE_XCOORD 260
! #define CONSOLE_YCOORD 115
! #define CONSOLE_WIDTH 340
! #define CONSOLE_HEIGHT 218
void Background_Show(void)
{
- extern char bgData[];
-
PNGUPROP imgProp;
IMGCTX ctx;
s32 ret;
/* Select PNG data */
! ctx = PNGU_SelectImageFromBuffer(bgData);
if (!ctx)
return;
/* Get image properties */
ret = PNGU_GetImageProperties(ctx, &imgProp);
if (ret != PNGU_OK)
return;
/* Draw image */
Video_DrawPng(ctx, imgProp, 0, 0);
--- 14,75 ----
#include "wpad.h"
/* Constants */
! static int CONSOLE_XCOORD = 260;
! static int CONSOLE_YCOORD = 115;
! static int CONSOLE_WIDTH = 340;
! static int CONSOLE_HEIGHT = 218;
! static char BACKGROUND[0x100] = "";
+ void parseConfig(xmlNode *config)
+ {
+ xmlNode *cur_node = NULL;
+
+ for (cur_node = config->children; cur_node; cur_node = cur_node->next)
+ if (cur_node->type == XML_ELEMENT_NODE)
+ {
+ char *key = (char*)cur_node->name;
+ if (!strcmp(key, "background"))
+ setXmlStr(cur_node, BACKGROUND);
+ else if (!strcmp(key, "console_xcoord"))
+ setXmlInt(cur_node, &CONSOLE_XCOORD);
+ else if (!strcmp(key, "console_ycoord"))
+ setXmlInt(cur_node, &CONSOLE_YCOORD);
+ else if (!strcmp(key, "console_width"))
+ setXmlInt(cur_node, &CONSOLE_WIDTH);
+ else if (!strcmp(key, "console_height"))
+ setXmlInt(cur_node, &CONSOLE_HEIGHT);
+ else
+ printf("[+] ERROR: Invalid configuration file key (%s)\n", key);
+ }
+ }
void Background_Show(void)
{
PNGUPROP imgProp;
IMGCTX ctx;
s32 ret;
+ if (!strcmp(BACKGROUND, ""))
+ {
+ strcpy(BACKGROUND, "background.png");
+ }
+
/* Select PNG data */
! ctx = PNGU_SelectImageFromDevice(BACKGROUND);
if (!ctx)
+ {
+ printf("[+] ERROR: Cannot load \"%s\"!\n", BACKGROUND);
return;
+ }
/* Get image properties */
ret = PNGU_GetImageProperties(ctx, &imgProp);
if (ret != PNGU_OK)
+ {
+ printf("[+] ERROR: Cannot get image properties of \"%s\"! (ret = %d)\n", BACKGROUND, ret);
return;
+ }
/* Draw image */
Video_DrawPng(ctx, imgProp, 0, 0);
***************
*** 56,61 ****
--- 93,112 ----
/* Set video mode */
Video_SetMode();
+ /* Initialize libfat */
+ fatInitDefault();
+
+ /* Set current working directory as app path */
+ char buffer[0x100];
+ char *pos = strrchr(argv[0], '/');
+ pos++;
+ strncpy(buffer, argv[0], pos - argv[0]);
+ buffer[pos - argv[0]] = '\0';
+ chdir(buffer);
+
+ /* Load XML configuration */
+ parseConfig(loadXmlConfig("config.xml"));
+
/* Initialize console */
Con_Init(CONSOLE_XCOORD, CONSOLE_YCOORD, CONSOLE_WIDTH, CONSOLE_HEIGHT);