Parches para USB Loader

Buenas.

He estado trasteando un poco con el ya famoso USB Loader, y he hecho algunos cambios, en este caso, la imagen que se carga de fondo la obtiene de un fichero "background.png" en el mismo lugar en donde esté el "boot.dol", lo que indudablemente mejorará un poco la manera de cambiar los "skin".

Pero como se habló en el hilo "A todos los sceners que estáis liados con USB-Loader", me parece un error sacar OTRO loader más, así que lo que haré será poner un diff hecho contra el loader original, para que cualquiera de los que ahora están creando los suyos propios pueda aplicar el parche.

Para los que no usen linux y no tengan las utilidades de parcheo, un parche se lee:
  • Línea que comienza con +: Línea añadida
  • Línea que comienza con -: Línea eliminada
  • Línea que comienza con !: Línea modificada. Para ver qué línea se ha modificado, buscar la misma línea en la siguiente parte separada por ----
...entre otras cosas. Si usan Linux, usando "patch" es automático. Si aún lo quieren leer "manualmente", peguen esto en Kate o Vim y se los coloreará ;).

Si hay alguna duda, pregunten o busquen en la Red, que hay miles de páginas de documentación al respecto.

La licencia es como no, la GPLv2. Si alguien lo añade, que deje un comentario por aquí. Espero que sirva de ayuda.

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 14:50:38.000000000 +0100
***************
*** 1,5 ****
--- 1,8 ----
  #include <stdio.h>
  #include <ogcsys.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <fat.h>

  #include "disc.h"
  #include "menu.h"
***************
*** 18,39 ****

  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);
--- 21,46 ----

  void Background_Show(void)
  {
     PNGUPROP imgProp;
     IMGCTX ctx;

     s32 ret;

     /* Select PNG data */
!    ctx = PNGU_SelectImageFromDevice("./background.png");
     if (!ctx)
+    {
+       printf("[+] ERROR: Cannot load \"background.png\"!\n");
        return;
+    }

     /* Get image properties */
     ret = PNGU_GetImageProperties(ctx, &imgProp);
     if (ret != PNGU_OK)
+    {
+       printf("[+] ERROR: Cannot get image properties of \"background.png\"! (ret = %d)\n", ret);
        return;
+    }

     /* Draw image */
     Video_DrawPng(ctx, imgProp, 0, 0);
***************
*** 59,64 ****
--- 67,83 ----
     /* Initialize console */
     Con_Init(CONSOLE_XCOORD, CONSOLE_YCOORD, CONSOLE_WIDTH, CONSOLE_HEIGHT);

+    /* 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);
+
     /* Show background */
     Background_Show();
Osea que ésto solo cambia el background del usb loader.
[buuuaaaa] Buaaaa! Dejar el Usb loader en paaz.
broly7 escribió:Osea que ésto solo cambia el background del usb loader.
[buuuaaaa] Buaaaa! Dejar el Usb loader en paaz.


Hmm... Sí, esto sólo cambia el background por cualquiera que el usuario quiera. Pero no consigo entender tu indignación...
mmm pues a mi me gusta,, asi no antaran los 50mil .dol por ahi que solo cambian unos de otros por el fondo. Asi cada cual se pone el que quiere y listos.
Saludos
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 XD.

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);




config.xml (169 Bytes)

Los parámetros que se pueden añadir al archivo se pueden ver en usb-loader.c, función parseConfig()
yo tengo niños y no me gustaria que borraran los juegos del disco duro asi que quite la opcion de quitar los juegos con (-)menos.
abri el archivo menu.c y elimine las siguientes lineas:
/* MINUS (-) button */
if (buttons & WPAD_BUTTON_MINUS)
Menu_Remove();
de esta forma instalo los juegos con wbfs_win y ellos solo juegan.
Muchas gracias Dabore por currarte el parche. Personalmente veo muy práctico algo así.

@ Broly : este parche es para que los programadores que están modificando el original de waninkoko y kwiirk creen aplicaciones en las que poniendo una imagen de fondo en la misma carpeta la cargue en lugar de la que trae por defecto. Está pensado para que cualquiera pueda hacer su propio fondo y no tenga más que colocarlo en la tarjeta SD; ahora mismo si quieres cambiar el fondo tienes que compilar el programa entrero habiendo tenido que instalar el devkit antes, vamos, un pequeño coñazo si sólo quieres hacer ese pequeño cambio.
Si si solo digo que ya hay 2000 variedades de mods para el usb loader. No os gusta la original? Y cuando saque waninkoko la 1.2, "descolocación del proyecto"! ya no valdran. Y menos si no saca el source...
Creo que el source va a tener que seguir liberándolo porque utiliza código cuyas licencias lo obligan a ello, pero vamos que tampoco estoy 100% seguro aunque me da que es así.
broly7 escribió:Si si solo digo que ya hay 2000 variedades de mods para el usb loader. No os gusta la original? Y cuando saque waninkoko la 1.2, "descolocación del proyecto"! ya no valdran. Y menos si no saca el source...

Por eso mismo pongo aquí los parches, para que no hayan variedades, sino 1 sólo tipo de parche, al menos en estas cuestiones de fondos o configuración, porque si te das cuenta, hay 200.000 pero únicamente con el fondo cambiado. Si se aplica este parche, se reducen más o menos a 3, un número bastante manejable.

Y si se saca otra versión del loader sin estos cambios, posiblemente se puedan volver a añadir, no es nada tan complicado, además de que esta aplicación es demasiado pequeña como para que suponga un problema.

Y en cuanto al código, la aplicación es GPLv2, con lo que debe sacar el código. No creo que Waninkoko vaya a incumplir la licencia de su propio software, además de que se basa en código de otros que lo obligan a ello... Y si, él también tiene que cumplirla, lo de las licencias no es una broma, aunque no vamos a entrar en un debate estúpido, porque una cosa es "deber", otra "tener que", etc...

Al resto (y a tí también, broly7), gracias por su opinión ;)
9 respuestas