mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-22 19:29:18 +01:00
a4f3d16a56
*Added support for older Hermes IOS too (rev 2 and rev 3) *Changed Alternative Dol Browser to get the filelist (fst) with functions from libwbfs (like banner sounds) instead of from an emulated disk. This should fix all the weird crashes with it.
4041 lines
144 KiB
C++
4041 lines
144 KiB
C++
#include <gccore.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <dirent.h>
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "usbloader/wbfs.h"
|
|
#include "usbloader/wdvd.h"
|
|
#include "usbloader/partition_usbloader.h"
|
|
#include "usbloader/usbstorage2.h"
|
|
#include "usbloader/GameList.h"
|
|
#include "language/gettext.h"
|
|
#include "libwiigui/gui.h"
|
|
#include "libwiigui/gui_diskcover.h"
|
|
#include "libwiigui/Text.hpp"
|
|
#include "settings/CGameStatistics.h"
|
|
#include "network/networkops.h"
|
|
#include "network/http.h"
|
|
#include "prompts/PromptWindows.h"
|
|
#include "prompts/gameinfo.h"
|
|
#include "themes/CTheme.h"
|
|
#include "mload/mload.h"
|
|
#include "fatmounter.h"
|
|
#include "FileOperations/fileops.h"
|
|
#include "menu.h"
|
|
#include "menu.h"
|
|
#include "filelist.h"
|
|
#include "sys.h"
|
|
#include "wpad.h"
|
|
#include "wad/wad.h"
|
|
#include "zlib.h"
|
|
#include "svnrev.h"
|
|
#include "audio.h"
|
|
#include "xml/xml.h"
|
|
#include "language/UpdateLanguage.h"
|
|
#include "gecko.h"
|
|
#include "lstub.h"
|
|
#include "bannersound.h"
|
|
#include "buildtype.h"
|
|
|
|
/*** Variables that are also used extern ***/
|
|
int cntMissFiles = 0;
|
|
|
|
/*** Variables used only in this file ***/
|
|
static char missingFiles[500][12];
|
|
|
|
/*** Extern variables ***/
|
|
extern GuiWindow * mainWindow;
|
|
extern GuiSound * bgMusic;
|
|
s32 gameSelected = 0, gameStart = 0;
|
|
extern float gamesize;
|
|
extern u8 shutdown;
|
|
extern u8 reset;
|
|
extern u8 mountMethod;
|
|
extern struct discHdr *dvdheader;
|
|
extern char game_partition[6];
|
|
|
|
/*** Extern functions ***/
|
|
extern void ResumeGui();
|
|
extern void HaltGui();
|
|
|
|
/****************************************************************************
|
|
* OnScreenNumpad
|
|
*
|
|
* Opens an on-screen numpad window, with the data entered being stored
|
|
* into the specified variable.
|
|
***************************************************************************/
|
|
int OnScreenNumpad(char * var, u32 maxlen)
|
|
{
|
|
int save = -1;
|
|
|
|
GuiNumpad numpad(var, maxlen);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetSimpleTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
|
|
GuiText okBtnTxt(tr( "OK" ), 22, Theme.prompttext);
|
|
GuiImage okBtnImg(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
okBtnTxt.SetWidescreen(Settings.widescreen);
|
|
okBtnImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton okBtn(&okBtnImg, &okBtnImg, 0, 4, 5, -15, &trigA, &btnSoundOver, btnClick2, 1);
|
|
okBtn.SetLabel(&okBtnTxt);
|
|
GuiText cancelBtnTxt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage cancelBtnImg(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
cancelBtnTxt.SetWidescreen(Settings.widescreen);
|
|
cancelBtnImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton cancelBtn(&cancelBtnImg, &cancelBtnImg, 1, 4, -5, -15, &trigA, &btnSoundOver, btnClick2, 1);
|
|
cancelBtn.SetLabel(&cancelBtnTxt);
|
|
cancelBtn.SetTrigger(&trigB);
|
|
|
|
numpad.Append(&okBtn);
|
|
numpad.Append(&cancelBtn);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&numpad);
|
|
mainWindow->ChangeFocus(&numpad);
|
|
ResumeGui();
|
|
|
|
while (save == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
if (okBtn.GetState() == STATE_CLICKED)
|
|
save = 1;
|
|
else if (cancelBtn.GetState() == STATE_CLICKED) save = 0;
|
|
}
|
|
|
|
if (save == 1)
|
|
{
|
|
snprintf(var, maxlen, "%s", numpad.kbtextstr);
|
|
}
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&numpad);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
gprintf("\t%s", (save == 1 ? "saved" : "discarded"));
|
|
return save;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* OnScreenKeyboard
|
|
*
|
|
* Opens an on-screen keyboard window, with the data entered being stored
|
|
* into the specified variable.
|
|
***************************************************************************/
|
|
int OnScreenKeyboard(char * var, u32 maxlen, int min)
|
|
{
|
|
|
|
int save = -1;
|
|
int keyset = 0;
|
|
if (Settings.keyset == us)
|
|
keyset = 0;
|
|
else if (Settings.keyset == dvorak)
|
|
keyset = 1;
|
|
else if (Settings.keyset == euro)
|
|
keyset = 2;
|
|
else if (Settings.keyset == azerty)
|
|
keyset = 3;
|
|
else if (Settings.keyset == qwerty) keyset = 4;
|
|
|
|
gprintf("\nOnScreenKeyboard(%s, %i, %i) \n\tkeyset = %i", var, maxlen, min, keyset);
|
|
|
|
GuiKeyboard keyboard(var, maxlen, min, keyset);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetSimpleTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
|
|
GuiText okBtnTxt(tr( "OK" ), 22, Theme.prompttext);
|
|
GuiImage okBtnImg(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
okBtnTxt.SetWidescreen(Settings.widescreen);
|
|
okBtnImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton okBtn(&okBtnImg, &okBtnImg, 0, 4, 5, 15, &trigA, &btnSoundOver, btnClick2, 1);
|
|
okBtn.SetLabel(&okBtnTxt);
|
|
GuiText cancelBtnTxt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage cancelBtnImg(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
cancelBtnTxt.SetWidescreen(Settings.widescreen);
|
|
cancelBtnImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton cancelBtn(&cancelBtnImg, &cancelBtnImg, 1, 4, -5, 15, &trigA, &btnSoundOver, btnClick2, 1);
|
|
cancelBtn.SetLabel(&cancelBtnTxt);
|
|
cancelBtn.SetTrigger(&trigB);
|
|
|
|
keyboard.Append(&okBtn);
|
|
keyboard.Append(&cancelBtn);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&keyboard);
|
|
mainWindow->ChangeFocus(&keyboard);
|
|
ResumeGui();
|
|
|
|
while (save == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
if (okBtn.GetState() == STATE_CLICKED)
|
|
save = 1;
|
|
else if (cancelBtn.GetState() == STATE_CLICKED) save = 0;
|
|
}
|
|
|
|
if (save)
|
|
{
|
|
snprintf(var, maxlen, "%s", keyboard.kbtextstr);
|
|
}
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&keyboard);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
gprintf("\t%s", (save ? "saved" : "discarded"));
|
|
return save;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* WindowCredits
|
|
* Display credits
|
|
***************************************************************************/
|
|
void WindowCredits()
|
|
{
|
|
gprintf("WindowCredits()\n");
|
|
|
|
int angle = 0;
|
|
GuiSound * creditsMusic = NULL;
|
|
|
|
bgMusic->Pause();
|
|
|
|
creditsMusic = new GuiSound(credits_music_ogg, credits_music_ogg_size, 55);
|
|
creditsMusic->SetVolume(60);
|
|
creditsMusic->SetLoop(1);
|
|
creditsMusic->Play();
|
|
|
|
bool exit = false;
|
|
int i = 0;
|
|
int y = 20;
|
|
|
|
GuiWindow creditsWindow(screenwidth, screenheight);
|
|
GuiWindow creditsWindowBox(580, 448);
|
|
creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
|
|
GuiImageData creditsBox(credits_bg_png, credits_bg_png_size);
|
|
GuiImage creditsBoxImg(&creditsBox);
|
|
creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
creditsWindowBox.Append(&creditsBoxImg);
|
|
|
|
GuiImageData star(little_star_png, little_star_png_size);
|
|
GuiImage starImg(&star);
|
|
starImg.SetWidescreen(Settings.widescreen); //added
|
|
starImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
starImg.SetPosition(505, 350);
|
|
|
|
int numEntries = 21;
|
|
GuiText * txt[numEntries];
|
|
|
|
txt[i] = new GuiText(tr( "Credits" ), 26, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
txt[i]->SetPosition(0, 12);
|
|
i++;
|
|
|
|
#ifdef FULLCHANNEL
|
|
char svnTmp[4];//did this to hide the M after the rev# that is made by altering it
|
|
//to be ready to be in a full channel
|
|
snprintf( svnTmp, sizeof( svnTmp ), "%s", GetRev() );
|
|
char SvnRev[30];
|
|
snprintf( SvnRev, sizeof( SvnRev ), "Rev%sc IOS%u (Rev %u)", svnTmp, IOS_GetVersion(), IOS_GetRevision() );
|
|
#else
|
|
char SvnRev[30];
|
|
snprintf(SvnRev, sizeof(SvnRev), "Rev%s IOS%u (Rev %u)", GetRev(), IOS_GetVersion(), IOS_GetRevision());
|
|
#endif
|
|
|
|
txt[i] = new GuiText(SvnRev, 16, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
txt[i]->SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
|
|
txt[i]->SetPosition(0, y);
|
|
i++;
|
|
y += 34;
|
|
|
|
txt[i] = new GuiText("USB Loader GX", 24, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
txt[i]->SetPosition(0, y);
|
|
i++;
|
|
y += 26;
|
|
|
|
txt[i] = new GuiText(tr( "Official Site:" ), 20, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(10, y);
|
|
i++;
|
|
|
|
txt[i] = new GuiText("http://code.google.com/p/usbloader-gui/", 20, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 26;
|
|
|
|
GuiText::SetPresets(22, ( GXColor )
|
|
{ 255, 255, 255, 255}, 3000, FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
|
|
|
|
txt[i] = new GuiText(tr( "Coding:" ));
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(10, y);
|
|
i++;
|
|
|
|
txt[i] = new GuiText("dimok / nIxx / giantpune / ardi");
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
txt[i] = new GuiText("hungyip84 / DrayX7 / lustar / r-win");
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 26;
|
|
|
|
char text[100];
|
|
|
|
txt[i] = new GuiText(tr( "Design:" ));
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(10, y);
|
|
i++;
|
|
|
|
txt[i] = new GuiText("cyrex / NeoRame");
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 26;
|
|
|
|
txt[i] = new GuiText(tr( "Big thanks to:" ));
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(10, y);
|
|
i++;
|
|
|
|
sprintf(text, "lustar %s", tr( "for WiiTDB and hosting covers / disc images" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "CorneliousJD %s", tr( "for hosting the update files" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Kinyo %s", tr( "and translaters for language files updates" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Deak Phreak %s", tr( "for hosting the themes" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(160, y);
|
|
i++;
|
|
y += 26;
|
|
|
|
txt[i] = new GuiText(tr( "Special thanks to:" ));
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(10, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Waninkoko, Kwiirk & Hermes %s", tr( "for the USB Loader source" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(60, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Tantric %s", tr( "for his awesome tool LibWiiGui" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(60, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Fishears/Nuke %s", tr( "for Ocarina" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(60, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "WiiPower %s", tr( "for diverse patches" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(60, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
sprintf(text, "Oggzee %s", tr( "for FAT/NTFS support" ));
|
|
txt[i] = new GuiText(text);
|
|
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
txt[i]->SetPosition(60, y);
|
|
i++;
|
|
y += 22;
|
|
|
|
for (i = 0; i < numEntries; i++)
|
|
creditsWindowBox.Append(txt[i]);
|
|
|
|
creditsWindow.Append(&creditsWindowBox);
|
|
creditsWindow.Append(&starImg);
|
|
|
|
creditsWindow.SetEffect(EFFECT_FADE, 30);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&creditsWindow);
|
|
ResumeGui();
|
|
|
|
while (!exit)
|
|
{
|
|
angle++;
|
|
if (angle > 360) angle = 0;
|
|
usleep(12000);
|
|
starImg.SetAngle(angle);
|
|
if (ButtonsPressed() != 0) exit = true;
|
|
|
|
}
|
|
|
|
creditsMusic->Stop();
|
|
|
|
delete creditsMusic;
|
|
|
|
creditsWindow.SetEffect(EFFECT_FADE, -30);
|
|
while (creditsWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&creditsWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
for (i = 0; i < numEntries; i++)
|
|
{
|
|
delete txt[i];
|
|
txt[i] = NULL;
|
|
}
|
|
ResumeGui();
|
|
|
|
bgMusic->Resume();
|
|
}
|
|
|
|
/****************************************************************************
|
|
* WindowScreensaver
|
|
* Display screensaver
|
|
***************************************************************************/
|
|
int WindowScreensaver()
|
|
{
|
|
gprintf("WindowScreenSaver()\n");
|
|
int i = 0;
|
|
bool exit = false;
|
|
|
|
/* initialize random seed: */
|
|
srand(time(NULL));
|
|
|
|
GuiImageData GXlogo(Resources::GetFile("gxlogo.png"), Resources::GetFileSize("gxlogo.png"));//uncomment for themable screensaver
|
|
//GuiImageData GXlogo(gxlogo_png);//comment for themable screensaver
|
|
GuiImage GXlogoImg(&GXlogo);
|
|
GXlogoImg.SetPosition(172, 152);
|
|
GXlogoImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
|
|
GuiImage BackgroundImg(640, 480, ( GXColor )
|
|
{ 0, 0, 0, 255});
|
|
BackgroundImg.SetPosition(0, 0);
|
|
BackgroundImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
|
|
GuiWindow screensaverWindow(screenwidth, screenheight);
|
|
screensaverWindow.Append(&BackgroundImg);
|
|
screensaverWindow.Append(&GXlogoImg);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&screensaverWindow);
|
|
ResumeGui();
|
|
|
|
while (!exit)
|
|
{
|
|
i++;
|
|
if (IsWpadConnected())
|
|
{
|
|
exit = true;
|
|
}
|
|
/* Set position only every 400000th loop */
|
|
if ((i % 8000000) == 0)
|
|
{
|
|
/* Set random position */
|
|
GXlogoImg.SetPosition((rand() % 345), (rand() % 305));
|
|
}
|
|
|
|
}
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&screensaverWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
return 1;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* WindowPrompt
|
|
*
|
|
* Displays a prompt window to user, with information, an error message, or
|
|
* presenting a user with a choice of up to 4 Buttons.
|
|
*
|
|
* Give him 1 Title, 1 Subtitle and 4 Buttons
|
|
* If title/subtitle or one of the buttons is not needed give him a 0 on that
|
|
* place.
|
|
***************************************************************************/
|
|
int WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label,
|
|
const char *btn3Label, const char *btn4Label, int wait)
|
|
{
|
|
int choice = -1;
|
|
int count = wait;
|
|
gprintf("WindowPrompt( %s, %s, %s, %s, %s, %s, %i ): ", title, msg, btn1Label, btn2Label, btn3Label, btn4Label,
|
|
wait);
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 55);
|
|
GuiText msgTxt(msg, 22, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msgTxt.SetPosition(0, -40);
|
|
msgTxt.SetMaxWidth(430);
|
|
|
|
GuiText btn1Txt(btn1Label, 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiButton btn1(&btn1Img, &btn1Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
GuiText btn2Txt(btn2Label, 22, Theme.prompttext);
|
|
GuiImage btn2Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn2Txt.SetWidescreen(Settings.widescreen);
|
|
btn2Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn2(&btn2Img, &btn2Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn2.SetLabel(&btn2Txt);
|
|
if (!btn3Label && !btn4Label) btn2.SetTrigger(&trigB);
|
|
|
|
GuiText btn3Txt(btn3Label, 22, Theme.prompttext);
|
|
GuiImage btn3Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn3Txt.SetWidescreen(Settings.widescreen);
|
|
btn3Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn3(&btn3Img, &btn3Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn3.SetLabel(&btn3Txt);
|
|
if (!btn4Label) btn3.SetTrigger(&trigB);
|
|
|
|
GuiText btn4Txt(btn4Label, 22, Theme.prompttext);
|
|
GuiImage btn4Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn4Txt.SetWidescreen(Settings.widescreen);
|
|
btn4Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn4(&btn4Img, &btn4Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn4.SetLabel(&btn4Txt);
|
|
if (btn4Label) btn4.SetTrigger(&trigB);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen)) /////////////adjust buttons for widescreen
|
|
{
|
|
msgTxt.SetMaxWidth(330);
|
|
|
|
if (btn2Label && !btn3Label && !btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(70, -80);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-70, -80);
|
|
btn3.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(-70, -55);
|
|
btn4.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(70, -55);
|
|
}
|
|
else if (btn2Label && btn3Label && !btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(70, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-70, -120);
|
|
btn3.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn3.SetPosition(0, -55);
|
|
btn4.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(70, -55);
|
|
}
|
|
else if (btn2Label && btn3Label && btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(70, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-70, -120);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(70, -55);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-70, -55);
|
|
}
|
|
else if (!btn2Label && btn3Label && btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-70, -120);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(70, -55);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-70, -55);
|
|
}
|
|
else
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -80);
|
|
btn2.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(70, -120);
|
|
btn3.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(-70, -55);
|
|
btn4.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(70, -55);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if (btn2Label && !btn3Label && !btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(40, -45);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-40, -45);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(50, -65);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-50, -65);
|
|
}
|
|
else if (btn2Label && btn3Label && !btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(50, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-50, -120);
|
|
btn3.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn3.SetPosition(0, -65);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-50, -65);
|
|
}
|
|
else if (btn2Label && btn3Label && btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(50, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-50, -120);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(50, -65);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-50, -65);
|
|
}
|
|
else if (!btn2Label && btn3Label && btn4Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -120);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-50, -120);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(50, -65);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-50, -65);
|
|
}
|
|
else
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -45);
|
|
btn2.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(50, -120);
|
|
btn3.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn3.SetPosition(50, -65);
|
|
btn4.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn4.SetPosition(-50, -65);
|
|
}
|
|
|
|
}
|
|
|
|
GuiTrigger trigZ;
|
|
trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z);
|
|
|
|
GuiButton screenShotBtn(0, 0);
|
|
screenShotBtn.SetPosition(0, 0);
|
|
screenShotBtn.SetTrigger(&trigZ);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
promptWindow.Append(&screenShotBtn);
|
|
|
|
if (btn1Label) promptWindow.Append(&btn1);
|
|
if (btn2Label) promptWindow.Append(&btn2);
|
|
if (btn3Label) promptWindow.Append(&btn3);
|
|
if (btn4Label) promptWindow.Append(&btn4);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
while (choice == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
if (shutdown == 1)
|
|
{
|
|
wiilight(0);
|
|
Sys_Shutdown();
|
|
}
|
|
if (reset == 1) Sys_Reboot();
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
choice = 1;
|
|
}
|
|
else if (btn2.GetState() == STATE_CLICKED)
|
|
{
|
|
if (!btn3Label)
|
|
choice = 0;
|
|
else choice = 2;
|
|
}
|
|
else if (btn3.GetState() == STATE_CLICKED)
|
|
{
|
|
if (!btn4Label)
|
|
choice = 0;
|
|
else choice = 3;
|
|
}
|
|
else if (btn4.GetState() == STATE_CLICKED)
|
|
{
|
|
choice = 0;
|
|
}
|
|
else if (screenShotBtn.GetState() == STATE_CLICKED)
|
|
{
|
|
screenShotBtn.ResetState();
|
|
ScreenShot();
|
|
}
|
|
if (count > 0) count--;
|
|
if (count == 0) choice = 1;
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
gprintf(" %i\n", choice);
|
|
|
|
return choice;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* WindowExitPrompt
|
|
*
|
|
* Displays a prompt window to user, with information, an error message, or
|
|
* presenting a user with a choice of up to 4 Buttons.
|
|
*
|
|
* Give him 1 Titel, 1 Subtitel and 4 Buttons
|
|
* If titel/subtitle or one of the buttons is not needed give him a 0 on that
|
|
* place.
|
|
***************************************************************************/
|
|
int WindowExitPrompt()
|
|
{
|
|
gprintf("WindowExitPrompt()\n");
|
|
|
|
GuiSound * homein = NULL;
|
|
homein = new GuiSound(menuin_ogg, menuin_ogg_size, Settings.sfxvolume);
|
|
homein->SetVolume(Settings.sfxvolume);
|
|
homein->SetLoop(0);
|
|
homein->Play();
|
|
|
|
GuiSound * homeout = NULL;
|
|
homeout = new GuiSound(menuout_ogg, menuout_ogg_size, Settings.sfxvolume);
|
|
homeout->SetVolume(Settings.sfxvolume);
|
|
homeout->SetLoop(0);
|
|
|
|
int choice = -1;
|
|
|
|
u64 oldstub = getStubDest();
|
|
loadStub();
|
|
if (oldstub != 0x00010001554c4e52ll && oldstub != 0x00010001554e454fll) Set_Stub(oldstub);
|
|
|
|
GuiWindow promptWindow(640, 480);
|
|
promptWindow.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
promptWindow.SetPosition(0, 0);
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData top(exit_top_png, exit_top_png_size);
|
|
GuiImageData topOver(exit_top_over_png, exit_top_over_png_size);
|
|
GuiImageData bottom(exit_bottom_png, exit_bottom_png_size);
|
|
GuiImageData bottomOver(exit_bottom_over_png, exit_bottom_over_png_size);
|
|
GuiImageData button(exit_button_png, exit_button_png_size);
|
|
GuiImageData wiimote(wiimote_png, wiimote_png_size);
|
|
GuiImageData close(closebutton_png, closebutton_png_size);
|
|
|
|
GuiImageData battery(Resources::GetFile("battery_white.png"), Resources::GetFileSize("battery_white.png"));
|
|
GuiImageData batteryBar(Resources::GetFile("battery_bar_white.png"), Resources::GetFileSize("battery_bar_white.png"));
|
|
GuiImageData batteryRed(Resources::GetFile("battery_red.png"), Resources::GetFileSize("battery_red.png"));
|
|
GuiImageData batteryBarRed(Resources::GetFile("battery_bar_red.png"), Resources::GetFileSize("battery_bar_red.png"));
|
|
|
|
int i = 0, ret = 0, level;
|
|
char txt[3];
|
|
GuiText * batteryTxt[4];
|
|
GuiImage * batteryImg[4];
|
|
GuiImage * batteryBarImg[4];
|
|
GuiButton * batteryBtn[4];
|
|
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
|
|
sprintf(txt, "P%d", i + 1);
|
|
|
|
batteryTxt[i] = new GuiText(txt, 22, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
batteryTxt[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
batteryImg[i] = new GuiImage(&battery);
|
|
batteryImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
batteryImg[i]->SetPosition(36, 0);
|
|
batteryImg[i]->SetTile(0);
|
|
batteryBarImg[i] = new GuiImage(&batteryBar);
|
|
batteryBarImg[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
batteryBarImg[i]->SetPosition(33, 0);
|
|
|
|
batteryBtn[i] = new GuiButton(40, 20);
|
|
batteryBtn[i]->SetLabel(batteryTxt[i]);
|
|
batteryBtn[i]->SetImage(batteryBarImg[i]);
|
|
batteryBtn[i]->SetIcon(batteryImg[i]);
|
|
batteryBtn[i]->SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
batteryBtn[i]->SetRumble(false);
|
|
batteryBtn[i]->SetAlpha(70);
|
|
batteryBtn[i]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 50);
|
|
}
|
|
|
|
batteryBtn[0]->SetPosition(180, 150);
|
|
batteryBtn[1]->SetPosition(284, 150);
|
|
batteryBtn[2]->SetPosition(388, 150);
|
|
batteryBtn[3]->SetPosition(494, 150);
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
GuiTrigger trigHome;
|
|
trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
|
|
|
|
GuiText titleTxt(tr( "HOME Menu" ), 36, ( GXColor )
|
|
{ 255, 255, 255, 255});
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(-180, 40);
|
|
titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
GuiText closeTxt(tr( "Close" ), 28, ( GXColor )
|
|
{ 0, 0, 0, 255});
|
|
closeTxt.SetPosition(10, 3);
|
|
GuiImage closeImg(&close);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
closeTxt.SetWidescreen(Settings.widescreen);
|
|
closeImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton closeBtn(close.GetWidth(), close.GetHeight());
|
|
closeBtn.SetImage(&closeImg);
|
|
closeBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
closeBtn.SetPosition(190, 30);
|
|
closeBtn.SetLabel(&closeTxt);
|
|
closeBtn.SetRumble(false);
|
|
closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
GuiImage btn1Img(&top);
|
|
GuiImage btn1OverImg(&topOver);
|
|
GuiButton btn1(&btn1Img, &btn1OverImg, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 0);
|
|
btn1.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
GuiText btn2Txt(tr( "Back to Loader" ), 28, ( GXColor )
|
|
{ 0, 0, 0, 255});
|
|
GuiImage btn2Img(&button);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn2Txt.SetWidescreen(Settings.widescreen);
|
|
btn2Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn2(&btn2Img, &btn2Img, 2, 5, -150, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn2.SetLabel(&btn2Txt);
|
|
btn2.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 50);
|
|
btn2.SetRumble(false);
|
|
btn2.SetPosition(-150, 0);
|
|
|
|
GuiText btn3Txt(tr( "Wii Menu" ), 28, ( GXColor )
|
|
{ 0, 0, 0, 255});
|
|
GuiImage btn3Img(&button);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn3Txt.SetWidescreen(Settings.widescreen);
|
|
btn3Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn3(&btn3Img, &btn3Img, 2, 5, 150, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn3.SetLabel(&btn3Txt);
|
|
btn3.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 50);
|
|
btn3.SetRumble(false);
|
|
btn3.SetPosition(150, 0);
|
|
|
|
GuiImage btn4Img(&bottom);
|
|
GuiImage btn4OverImg(&bottomOver);
|
|
GuiButton btn4(&btn4Img, &btn4OverImg, 0, 4, 0, 0, &trigA, &btnSoundOver, btnClick2, 0);
|
|
btn4.SetTrigger(&trigB);
|
|
btn4.SetTrigger(&trigHome);
|
|
btn4.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 50);
|
|
|
|
GuiImage wiimoteImg(&wiimote);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
wiimoteImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
wiimoteImg.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
wiimoteImg.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_IN, 50);
|
|
wiimoteImg.SetPosition(50, 210);
|
|
|
|
promptWindow.Append(&btn2);
|
|
promptWindow.Append(&btn3);
|
|
promptWindow.Append(&btn4);
|
|
promptWindow.Append(&btn1);
|
|
promptWindow.Append(&closeBtn);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&wiimoteImg);
|
|
|
|
promptWindow.Append(batteryBtn[0]);
|
|
promptWindow.Append(batteryBtn[1]);
|
|
promptWindow.Append(batteryBtn[2]);
|
|
promptWindow.Append(batteryBtn[3]);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
while (choice == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
if (WPAD_Probe(i, NULL) == WPAD_ERR_NONE) // controller connected
|
|
{
|
|
level = (userInput[i].wpad.battery_level / 100.0) * 4;
|
|
if (level > 4) level = 4;
|
|
|
|
if (level <= 1)
|
|
{
|
|
batteryBarImg[i]->SetImage(&batteryBarRed);
|
|
batteryImg[i]->SetImage(&batteryRed);
|
|
}
|
|
else
|
|
{
|
|
batteryBarImg[i]->SetImage(&batteryBar);
|
|
}
|
|
|
|
batteryImg[i]->SetTile(level);
|
|
|
|
batteryBtn[i]->SetAlpha(255);
|
|
}
|
|
else // controller not connected
|
|
{
|
|
batteryImg[i]->SetTile(0);
|
|
batteryImg[i]->SetImage(&battery);
|
|
batteryBtn[i]->SetAlpha(70);
|
|
}
|
|
}
|
|
|
|
if (shutdown == 1)
|
|
{
|
|
wiilight(0);
|
|
Sys_Shutdown();
|
|
}
|
|
if (reset == 1) Sys_Reboot();
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
choice = 1;
|
|
btn1.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
btn4.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
btn2.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
btn3.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
wiimoteImg.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
batteryBtn[i]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
|
|
}
|
|
else if (btn4.GetState() == STATE_SELECTED)
|
|
{
|
|
wiimoteImg.SetPosition(50, 165);
|
|
}
|
|
else if (btn2.GetState() == STATE_CLICKED)
|
|
{
|
|
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
|
if (ret == 1)
|
|
{
|
|
|
|
choice = 2;
|
|
}
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
promptWindow.SetState(STATE_DEFAULT);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
btn2.ResetState();
|
|
}
|
|
else if (btn3.GetState() == STATE_CLICKED)
|
|
{
|
|
ret = WindowPrompt(tr( "Are you sure?" ), 0, tr( "Yes" ), tr( "No" ));
|
|
if (ret == 1)
|
|
{
|
|
choice = 3;
|
|
}
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
promptWindow.SetState(STATE_DEFAULT);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
btn3.ResetState();
|
|
}
|
|
else if (btn4.GetState() == STATE_CLICKED)
|
|
{
|
|
btn1.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
closeBtn.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
btn4.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
btn2.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
btn3.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
titleTxt.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
wiimoteImg.SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
batteryBtn[i]->SetEffect(EFFECT_SLIDE_BOTTOM | EFFECT_SLIDE_OUT, 50);
|
|
|
|
choice = 0;
|
|
}
|
|
else if (btn4.GetState() != STATE_SELECTED)
|
|
{
|
|
wiimoteImg.SetPosition(50, 210);
|
|
}
|
|
}
|
|
homeout->Play();
|
|
while (btn1.GetEffect() > 0)
|
|
usleep(50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
homein->Stop();
|
|
delete homein;
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
while (homeout->IsPlaying() > 0)
|
|
usleep(50);
|
|
homeout->Stop();
|
|
delete homeout;
|
|
ResumeGui();
|
|
return choice;
|
|
}
|
|
|
|
void SetupLockedButton(GuiButton *btnLocked, GuiImage *img, GuiSound *sndOver, GuiSound *sndClick,
|
|
GuiTrigger *trig)
|
|
{
|
|
btnLocked->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
//btnLocked->SetPosition(xPos, yPos);
|
|
btnLocked->SetPosition(125, 40);
|
|
btnLocked->SetImage(img);
|
|
btnLocked->SetSoundOver(sndOver);
|
|
btnLocked->SetSoundClick(sndClick);
|
|
btnLocked->SetTrigger(trig);
|
|
btnLocked->SetEffectGrow();
|
|
}
|
|
|
|
u8 SetLocked(GuiButton *lock1, u8* gameId, u8 locked)
|
|
{
|
|
int LockStatus = (locked == GameStatistics.GetLockStatus(gameId)) ? 0 : locked; // Press the current rank to reset the rank
|
|
|
|
GameStatistics.SetLockStatus(gameId, LockStatus);
|
|
GameStatistics.Save();
|
|
|
|
return LockStatus;
|
|
}
|
|
|
|
void SetLockedImage(const u8 * gameid, GuiImage *b1, GuiImageData *on, GuiImageData *off)
|
|
{
|
|
int lockedvar = GameStatistics.GetLockStatus(gameid);
|
|
b1->SetImage(lockedvar == 1 ? on : off);
|
|
}
|
|
|
|
void SetupFavoriteButton(GuiButton *btnFavorite, int xPos, GuiImage *img, GuiSound *sndOver, GuiSound *sndClick,
|
|
GuiTrigger *trig)
|
|
{
|
|
btnFavorite->SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
btnFavorite->SetPosition(xPos, -60);
|
|
btnFavorite->SetImage(img);
|
|
btnFavorite->SetSoundOver(sndOver);
|
|
btnFavorite->SetSoundClick(sndClick);
|
|
btnFavorite->SetTrigger(trig);
|
|
btnFavorite->SetEffectGrow();
|
|
}
|
|
|
|
u8 SetFavorite(GuiButton *fav1, GuiButton *fav2, GuiButton *fav3, GuiButton *fav4, GuiButton *fav5, u8* gameId,
|
|
u8 favorite)
|
|
{
|
|
int FavoriteRank = (favorite == GameStatistics.GetFavoriteRank(gameId)) ? 0 : favorite; // Press the current rank to reset the rank
|
|
|
|
GameStatistics.SetFavoriteRank(gameId, FavoriteRank);
|
|
GameStatistics.Save();
|
|
|
|
return FavoriteRank;
|
|
}
|
|
|
|
void SetFavoriteImages(const u8 * gameid, GuiImage *b1, GuiImage *b2, GuiImage *b3, GuiImage *b4, GuiImage *b5, GuiImageData *on,
|
|
GuiImageData *off)
|
|
{
|
|
int favoritevar = GameStatistics.GetFavoriteRank(gameid);
|
|
|
|
b1->SetImage(favoritevar >= 1 ? on : off);
|
|
b2->SetImage(favoritevar >= 2 ? on : off);
|
|
b3->SetImage(favoritevar >= 3 ? on : off);
|
|
b4->SetImage(favoritevar >= 4 ? on : off);
|
|
b5->SetImage(favoritevar >= 5 ? on : off);
|
|
}
|
|
|
|
/****************************************************************************
|
|
* GameWindowPrompt
|
|
*
|
|
* Displays a prompt window to user, with information, an error message, or
|
|
* presenting a user with a choice
|
|
***************************************************************************/
|
|
int GameWindowPrompt()
|
|
{
|
|
int choice = -1, angle = 0;
|
|
f32 size = 0.0;
|
|
char ID[5];
|
|
char IDFull[7];
|
|
|
|
GuiSound * gameSound = NULL;
|
|
|
|
gprintf("GameWindowPrompt()\n");
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
|
|
GuiImageData imgLocked(Resources::GetFile("lock.png"), Resources::GetFileSize("lock.png"));
|
|
GuiImageData imgNotLocked(Resources::GetFile("unlock.png"), Resources::GetFileSize("unlock.png"));
|
|
|
|
GuiImageData imgFavorite(Resources::GetFile("favorite.png"), Resources::GetFileSize("favorite.png"));
|
|
GuiImageData imgNotFavorite(Resources::GetFile("not_favorite.png"), Resources::GetFileSize("not_favorite.png"));
|
|
|
|
GuiImageData imgLeft(Resources::GetFile("startgame_arrow_left.png"), Resources::GetFileSize("startgame_arrow_left.png"));
|
|
GuiImageData imgRight(Resources::GetFile("startgame_arrow_right.png"), Resources::GetFileSize("startgame_arrow_right.png"));
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
GuiTrigger trigL;
|
|
trigL.SetButtonOnlyTrigger(-1, WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT, PAD_BUTTON_LEFT);
|
|
GuiTrigger trigR;
|
|
trigR.SetButtonOnlyTrigger(-1, WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT, PAD_BUTTON_RIGHT);
|
|
GuiTrigger trigPlus;
|
|
trigPlus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_PLUS | WPAD_CLASSIC_BUTTON_PLUS, 0);
|
|
GuiTrigger trigMinus;
|
|
trigMinus.SetButtonOnlyTrigger(-1, WPAD_BUTTON_MINUS | WPAD_CLASSIC_BUTTON_MINUS, 0);
|
|
GuiTrigger trigZ;
|
|
trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z);
|
|
|
|
GuiButton screenShotBtn(0, 0);
|
|
screenShotBtn.SetPosition(0, 0);
|
|
screenShotBtn.SetTrigger(&trigZ);
|
|
|
|
const char * image = "dialogue_box_startgame.png";
|
|
|
|
if (Settings.widescreen)
|
|
image = "wdialogue_box_startgame.png";
|
|
|
|
GuiImageData dialogBox(Resources::GetFile(image), Resources::GetFileSize(image));
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
|
|
GuiTooltip nameBtnTT(tr( "Rename Game on WBFS" ));
|
|
if (Settings.wsprompt == yes) nameBtnTT.SetWidescreen(Settings.widescreen);
|
|
GuiText nameTxt("", 22, Theme.prompttext);
|
|
if (Settings.wsprompt == yes) nameTxt.SetWidescreen(Settings.widescreen);
|
|
nameTxt.SetMaxWidth(350, SCROLL_HORIZONTAL);
|
|
GuiButton nameBtn(120, 50);
|
|
nameBtn.SetLabel(&nameTxt);
|
|
// nameBtn.SetLabelOver(&nameTxt);
|
|
nameBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
nameBtn.SetPosition(0, -122);
|
|
nameBtn.SetSoundOver(&btnSoundOver);
|
|
nameBtn.SetSoundClick(btnClick2);
|
|
if (!mountMethod) nameBtn.SetToolTip(&nameBtnTT, 24, -30, ALIGN_LEFT);
|
|
|
|
if (Settings.godmode == 1 && !mountMethod)
|
|
{
|
|
nameBtn.SetTrigger(&trigA);
|
|
nameBtn.SetEffectGrow();
|
|
}
|
|
|
|
GuiText sizeTxt((char*) NULL, 22, Theme.prompttext); //TODO: get the size here
|
|
sizeTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
|
|
sizeTxt.SetPosition(-60, 70);
|
|
|
|
// GuiImage diskImg;
|
|
GuiDiskCover diskImg;
|
|
diskImg.SetWidescreen(Settings.widescreen);
|
|
diskImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
diskImg.SetAngle(angle);
|
|
GuiDiskCover diskImg2;
|
|
diskImg2.SetWidescreen(Settings.widescreen);
|
|
diskImg2.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
diskImg2.SetPosition(0, -20);
|
|
diskImg2.SetAngle(angle);
|
|
diskImg2.SetBeta(180);
|
|
|
|
GuiText playcntTxt((char*) NULL, 18, Theme.info);
|
|
playcntTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
playcntTxt.SetPosition(-115, 45);
|
|
|
|
GuiButton btn1(160, 160);
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
btn1.SetPosition(0, -20);
|
|
btn1.SetImage(&diskImg);
|
|
|
|
btn1.SetSoundOver(&btnSoundOver);
|
|
btn1.SetSoundClick(btnClick2);
|
|
btn1.SetTrigger(&trigA);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
GuiText btn2Txt(tr( "Back" ), 22, Theme.prompttext);
|
|
GuiImage btn2Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn2Txt.SetWidescreen(Settings.widescreen);
|
|
btn2Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn2(&btn2Img, &btn2Img, 1, 5, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
if (Settings.godmode == 1 && mountMethod != 2 && mountMethod != 3)
|
|
{
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-50, -40);
|
|
}
|
|
else
|
|
{
|
|
btn2.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn2.SetPosition(0, -40);
|
|
}
|
|
|
|
btn2.SetLabel(&btn2Txt);
|
|
btn2.SetTrigger(&trigB);
|
|
|
|
GuiText btn3Txt(tr( "Settings" ), 22, Theme.prompttext);
|
|
GuiImage btn3Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn3Txt.SetWidescreen(Settings.widescreen);
|
|
btn3Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn3(&btn3Img, &btn3Img, 0, 4, 50, -40, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn3.SetLabel(&btn3Txt);
|
|
|
|
GuiImage btnFavoriteImg1;
|
|
btnFavoriteImg1.SetWidescreen(Settings.widescreen);
|
|
GuiImage btnFavoriteImg2;
|
|
btnFavoriteImg2.SetWidescreen(Settings.widescreen);
|
|
GuiImage btnFavoriteImg3;
|
|
btnFavoriteImg3.SetWidescreen(Settings.widescreen);
|
|
GuiImage btnFavoriteImg4;
|
|
btnFavoriteImg4.SetWidescreen(Settings.widescreen);
|
|
GuiImage btnFavoriteImg5;
|
|
btnFavoriteImg5.SetWidescreen(Settings.widescreen);
|
|
|
|
//GuiButton btnFavorite(&btnFavoriteImg,&btnFavoriteImg, 2, 5, -125, -60, &trigA, &btnSoundOver, &btnClick,1);
|
|
GuiButton btnFavorite1(imgFavorite.GetWidth(), imgFavorite.GetHeight());
|
|
GuiButton btnFavorite2(imgFavorite.GetWidth(), imgFavorite.GetHeight());
|
|
GuiButton btnFavorite3(imgFavorite.GetWidth(), imgFavorite.GetHeight());
|
|
GuiButton btnFavorite4(imgFavorite.GetWidth(), imgFavorite.GetHeight());
|
|
GuiButton btnFavorite5(imgFavorite.GetWidth(), imgFavorite.GetHeight());
|
|
|
|
SetupFavoriteButton(&btnFavorite1, -198, &btnFavoriteImg1, &btnSoundOver, btnClick2, &trigA);
|
|
SetupFavoriteButton(&btnFavorite2, -171, &btnFavoriteImg2, &btnSoundOver, btnClick2, &trigA);
|
|
SetupFavoriteButton(&btnFavorite3, -144, &btnFavoriteImg3, &btnSoundOver, btnClick2, &trigA);
|
|
SetupFavoriteButton(&btnFavorite4, -117, &btnFavoriteImg4, &btnSoundOver, btnClick2, &trigA);
|
|
SetupFavoriteButton(&btnFavorite5, -90, &btnFavoriteImg5, &btnSoundOver, btnClick2, &trigA);
|
|
|
|
GuiImage btnLockedImg;
|
|
btnLockedImg.SetWidescreen(Settings.widescreen);
|
|
GuiButton btnLocked(imgLocked.GetWidth(), imgLocked.GetHeight());
|
|
SetupLockedButton(&btnLocked, &btnLockedImg, &btnSoundOver, btnClick2, &trigA);
|
|
|
|
GuiImage btnLeftImg(&imgLeft);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btnLeftImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btnLeft(&btnLeftImg, &btnLeftImg, 0, 5, 20, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btnLeft.SetTrigger(&trigL);
|
|
btnLeft.SetTrigger(&trigMinus);
|
|
|
|
GuiImage btnRightImg(&imgRight);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btnRightImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btnRight(&btnRightImg, &btnRightImg, 1, 5, -20, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btnRight.SetTrigger(&trigR);
|
|
btnRight.SetTrigger(&trigPlus);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&nameBtn);
|
|
promptWindow.Append(&playcntTxt);
|
|
promptWindow.Append(&screenShotBtn);
|
|
promptWindow.Append(&btn2);
|
|
if (!mountMethod)//stuff we don't show if it is a DVD mounted
|
|
{
|
|
promptWindow.Append(&sizeTxt);
|
|
promptWindow.Append(&btnLeft);
|
|
promptWindow.Append(&btnRight);
|
|
promptWindow.Append(&btnFavorite1);
|
|
promptWindow.Append(&btnFavorite2);
|
|
promptWindow.Append(&btnFavorite3);
|
|
promptWindow.Append(&btnFavorite4);
|
|
promptWindow.Append(&btnFavorite5);
|
|
}
|
|
|
|
//check if unlocked
|
|
if (Settings.godmode == 1 && mountMethod != 2 && mountMethod != 3)
|
|
{
|
|
promptWindow.Append(&btn3);
|
|
promptWindow.Append(&btnLocked);
|
|
}
|
|
|
|
promptWindow.Append(&diskImg2);
|
|
promptWindow.Append(&btn1);
|
|
|
|
short changed = -1;
|
|
GuiImageData * diskCover = NULL;
|
|
GuiImageData * diskCover2 = NULL;
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
while (changed)
|
|
{
|
|
if (changed == 1)
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 50);
|
|
}
|
|
else if (changed == 2)
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 50);
|
|
}
|
|
else if (changed == 3 || changed == 4)
|
|
{
|
|
if (diskCover2) delete diskCover2;
|
|
diskCover2 = NULL;
|
|
if (diskCover) diskCover2 = diskCover;
|
|
diskCover = NULL;
|
|
}
|
|
|
|
//load disc image based or what game is seleted
|
|
struct discHdr * header = (mountMethod == 1 || mountMethod == 2 ? dvdheader : gameList[gameSelected]);
|
|
if (Settings.gamesoundvolume > 0)
|
|
{
|
|
if (gameSound)
|
|
{
|
|
gameSound->Stop();
|
|
delete gameSound;
|
|
gameSound = NULL;
|
|
}
|
|
u32 gameSoundDataLen;
|
|
const u8 *gameSoundData = LoadBannerSound(header->id, &gameSoundDataLen);
|
|
if (gameSoundData)
|
|
{
|
|
gameSound = new GuiSound(gameSoundData, gameSoundDataLen, Settings.gamesoundvolume, false, true);
|
|
bgMusic->SetVolume(0);
|
|
if (Settings.gamesound == 2) gameSound->SetLoop(1);
|
|
gameSound->Play();
|
|
}
|
|
}
|
|
snprintf(ID, sizeof(ID), "%c%c%c", header->id[0], header->id[1], header->id[2]);
|
|
snprintf(IDFull, sizeof(IDFull), "%c%c%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3],
|
|
header->id[4], header->id[5]);
|
|
|
|
gprintf("\t%s\n", IDFull);
|
|
if (diskCover) delete diskCover;
|
|
char imgPath[150];
|
|
snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, IDFull); //changed to current full id
|
|
diskCover = new GuiImageData(imgPath);
|
|
|
|
if (!diskCover->GetImage())
|
|
{
|
|
delete diskCover;
|
|
snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, ID); //changed to current id
|
|
diskCover = new GuiImageData(imgPath);
|
|
|
|
if (!diskCover->GetImage())
|
|
{
|
|
snprintf(ID, sizeof(ID), "%c%c%c%c", header->id[0], header->id[1], header->id[2], header->id[3]);
|
|
|
|
delete diskCover;
|
|
snprintf(imgPath, sizeof(imgPath), "%s%s.png", Settings.disc_path, ID); //changed to current id
|
|
diskCover = new GuiImageData(imgPath);
|
|
if (!diskCover->GetImage())
|
|
{
|
|
delete diskCover;
|
|
diskCover = Resources::GetImageData("nodisc.png");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (changed == 3)
|
|
{
|
|
diskImg.SetImage(diskCover2);
|
|
diskImg.SetBeta(0);
|
|
diskImg.SetBetaRotateEffect(-90, 15);
|
|
diskImg2.SetImage(diskCover);
|
|
diskImg2.SetAngle(diskImg.GetAngle());
|
|
diskImg2.SetBeta(180);
|
|
diskImg2.SetBetaRotateEffect(-90, 15);
|
|
sizeTxt.SetEffect(EFFECT_FADE, -17);
|
|
nameTxt.SetEffect(EFFECT_FADE, -17);
|
|
ResumeGui();
|
|
while (nameTxt.GetEffect() > 0 || diskImg.GetBetaRotateEffect())
|
|
usleep(50);
|
|
HaltGui();
|
|
diskImg.SetImage(diskCover);
|
|
diskImg.SetBeta(90);
|
|
diskImg.SetBetaRotateEffect(-90, 15);
|
|
diskImg2.SetImage(diskCover2);
|
|
diskImg2.SetBeta(270);
|
|
diskImg2.SetBetaRotateEffect(-90, 15);
|
|
sizeTxt.SetEffect(EFFECT_FADE, 17);
|
|
nameTxt.SetEffect(EFFECT_FADE, 17);
|
|
}
|
|
else if (changed == 4)
|
|
{
|
|
diskImg.SetImage(diskCover2);
|
|
diskImg.SetBeta(0);
|
|
diskImg.SetBetaRotateEffect(90, 15);
|
|
diskImg2.SetImage(diskCover);
|
|
diskImg2.SetAngle(diskImg.GetAngle());
|
|
diskImg2.SetBeta(180);
|
|
diskImg2.SetBetaRotateEffect(90, 15);
|
|
sizeTxt.SetEffect(EFFECT_FADE, -17);
|
|
nameTxt.SetEffect(EFFECT_FADE, -17);
|
|
ResumeGui();
|
|
while (nameTxt.GetEffect() > 0 || diskImg.GetBetaRotateEffect())
|
|
usleep(50);
|
|
HaltGui();
|
|
diskImg.SetImage(diskCover);
|
|
diskImg.SetBeta(270);
|
|
diskImg.SetBetaRotateEffect(90, 15);
|
|
diskImg2.SetImage(diskCover2);
|
|
diskImg2.SetBeta(90);
|
|
diskImg2.SetBetaRotateEffect(90, 15);
|
|
sizeTxt.SetEffect(EFFECT_FADE, 17);
|
|
nameTxt.SetEffect(EFFECT_FADE, 17);
|
|
}
|
|
else diskImg.SetImage(diskCover);
|
|
|
|
if (!mountMethod)
|
|
{
|
|
WBFS_GameSize(header->id, &size);
|
|
sizeTxt.SetTextf("%.2fGB", size); //set size text;
|
|
}
|
|
|
|
nameTxt.SetText(get_title(header));
|
|
playcntTxt.SetTextf("%s: %i", tr( "Play Count" ), GameStatistics.GetPlayCount(header));
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4, &btnFavoriteImg5,
|
|
&imgFavorite, &imgNotFavorite);
|
|
|
|
SetLockedImage(header->id, &btnLockedImg, &imgLocked, &imgNotLocked);
|
|
|
|
nameTxt.SetPosition(0, 1);
|
|
|
|
if (changed != 3 && changed != 4) // changed==3 or changed==4 --> only Resume the GUI
|
|
{
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
}
|
|
ResumeGui();
|
|
|
|
changed = 0;
|
|
while (choice == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
diskImg.SetSpin(btn1.GetState() == STATE_SELECTED);
|
|
diskImg2.SetSpin(btn1.GetState() == STATE_SELECTED);
|
|
if (shutdown == 1) //for power button
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
ResumeGui();
|
|
wiilight(0);
|
|
Sys_Shutdown();
|
|
}
|
|
|
|
if (reset == 1) //for reset button
|
|
Sys_Reboot();
|
|
|
|
if (gameSound)
|
|
{
|
|
if (!gameSound->IsPlaying())
|
|
{
|
|
if (Settings.gamesound == 1) bgMusic->SetVolume(Settings.volume);
|
|
}
|
|
}
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1);
|
|
GameStatistics.Save();
|
|
|
|
choice = 1;
|
|
}
|
|
|
|
else if (btn2.GetState() == STATE_CLICKED) //back
|
|
{
|
|
choice = 0;
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
wiilight(0);
|
|
}
|
|
|
|
else if (btn3.GetState() == STATE_CLICKED) //settings
|
|
{
|
|
choice = 2;
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
}
|
|
|
|
else if (nameBtn.GetState() == STATE_CLICKED) //rename
|
|
{
|
|
choice = 3;
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
}
|
|
else if (btnFavorite1.GetState() == STATE_CLICKED) //switch favorite
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetFavorite(&btnFavorite1, &btnFavorite2, &btnFavorite3, &btnFavorite4, &btnFavorite5, header->id,
|
|
1);
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4,
|
|
&btnFavoriteImg5, &imgFavorite, &imgNotFavorite);
|
|
}
|
|
btnFavorite1.ResetState();
|
|
}
|
|
else if (btnLocked.GetState() == STATE_CLICKED) //switch locked
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetLocked(&btnLocked, header->id, 1);
|
|
SetLockedImage(header->id, &btnLockedImg, &imgLocked, &imgNotLocked);
|
|
}
|
|
btnLocked.ResetState();
|
|
}
|
|
else if (btnFavorite2.GetState() == STATE_CLICKED) //switch favorite
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetFavorite(&btnFavorite1, &btnFavorite2, &btnFavorite3, &btnFavorite4, &btnFavorite5, header->id,
|
|
2);
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4,
|
|
&btnFavoriteImg5, &imgFavorite, &imgNotFavorite);
|
|
}
|
|
btnFavorite2.ResetState();
|
|
}
|
|
else if (btnFavorite3.GetState() == STATE_CLICKED) //switch favorite
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetFavorite(&btnFavorite1, &btnFavorite2, &btnFavorite3, &btnFavorite4, &btnFavorite5, header->id,
|
|
3);
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4,
|
|
&btnFavoriteImg5, &imgFavorite, &imgNotFavorite);
|
|
}
|
|
btnFavorite3.ResetState();
|
|
}
|
|
else if (btnFavorite4.GetState() == STATE_CLICKED) //switch favorite
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetFavorite(&btnFavorite1, &btnFavorite2, &btnFavorite3, &btnFavorite4, &btnFavorite5, header->id,
|
|
4);
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4,
|
|
&btnFavoriteImg5, &imgFavorite, &imgNotFavorite);
|
|
}
|
|
btnFavorite4.ResetState();
|
|
}
|
|
else if (btnFavorite5.GetState() == STATE_CLICKED) //switch favorite
|
|
{
|
|
if (isInserted(bootDevice))
|
|
{
|
|
SetFavorite(&btnFavorite1, &btnFavorite2, &btnFavorite3, &btnFavorite4, &btnFavorite5, header->id,
|
|
5);
|
|
SetFavoriteImages(header->id, &btnFavoriteImg1, &btnFavoriteImg2, &btnFavoriteImg3, &btnFavoriteImg4,
|
|
&btnFavoriteImg5, &imgFavorite, &imgNotFavorite);
|
|
}
|
|
btnFavorite5.ResetState();
|
|
}
|
|
else if (screenShotBtn.GetState() == STATE_CLICKED)
|
|
{
|
|
screenShotBtn.ResetState();
|
|
ScreenShot();
|
|
}
|
|
// this next part is long because nobody could agree on what the left/right buttons should do
|
|
else if ((btnRight.GetState() == STATE_CLICKED) && (Settings.xflip == no)) //next game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 1;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected + 1) % gameList.size();
|
|
btnRight.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnLeft.GetState() == STATE_CLICKED) && (Settings.xflip == no)) //previous game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 2;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected - 1 + gameList.size()) % gameList.size();
|
|
btnLeft.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnRight.GetState() == STATE_CLICKED) && (Settings.xflip == yes)) //previous game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 2;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected - 1 + gameList.size()) % gameList.size();
|
|
btnRight.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnLeft.GetState() == STATE_CLICKED) && (Settings.xflip == yes)) //next game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 1;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected + 1) % gameList.size();
|
|
btnLeft.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnRight.GetState() == STATE_CLICKED) && (Settings.xflip == sysmenu)) //previous game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 2;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected + 1) % gameList.size();
|
|
btnRight.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnLeft.GetState() == STATE_CLICKED) && (Settings.xflip == sysmenu)) //next game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 1;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected - 1 + gameList.size()) % gameList.size();
|
|
btnLeft.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnRight.GetState() == STATE_CLICKED) && (Settings.xflip == wtf)) //previous game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 1;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected - 1 + gameList.size()) % gameList.size();
|
|
btnRight.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnLeft.GetState() == STATE_CLICKED) && (Settings.xflip == wtf)) //next game
|
|
{
|
|
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
|
|
changed = 2;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected + 1) % gameList.size();
|
|
btnLeft.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnRight.GetState() == STATE_CLICKED) && (Settings.xflip == disk3d)) //next game
|
|
{
|
|
// diskImg.SetBetaRotateEffect(45, 90);
|
|
changed = 3;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected + 1) % gameList.size();
|
|
btnRight.ResetState();
|
|
break;
|
|
}
|
|
|
|
else if ((btnLeft.GetState() == STATE_CLICKED) && (Settings.xflip == disk3d)) //previous game
|
|
{
|
|
// diskImg.SetBetaRotateEffect(-45, 90);
|
|
// promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 1/*50*/);
|
|
changed = 4;
|
|
btnClick2->Play();
|
|
gameSelected = (gameSelected - 1 + gameList.size()) % gameList.size();
|
|
btnLeft.ResetState();
|
|
break;
|
|
}
|
|
}
|
|
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
if (changed != 3 && changed != 4) // changed==3 or changed==4 --> only Halt the GUI
|
|
{
|
|
mainWindow->Remove(&promptWindow);
|
|
ResumeGui();
|
|
}
|
|
}
|
|
delete diskCover;
|
|
delete diskCover2;
|
|
|
|
if (gameSound)
|
|
{
|
|
gameSound->Stop();
|
|
delete gameSound;
|
|
gameSound = NULL;
|
|
}
|
|
bgMusic->SetVolume(Settings.volume);
|
|
|
|
gprintf("\tret: %i\n", choice);
|
|
return choice;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* DiscWait
|
|
***************************************************************************/
|
|
int DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label, int IsDeviceWait)
|
|
{
|
|
int i = 30, ret = 0;
|
|
u32 cover = 0;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 60);
|
|
GuiText msgTxt(msg, 22, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msgTxt.SetPosition(0, -40);
|
|
msgTxt.SetMaxWidth(430);
|
|
|
|
GuiText btn1Txt(btn1Label, 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn1(&btn1Img, &btn1Img, 1, 5, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
|
|
if (btn2Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(40, -45);
|
|
}
|
|
else
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -45);
|
|
}
|
|
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetTrigger(&trigB);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
GuiText btn2Txt(btn2Label, 22, Theme.prompttext);
|
|
GuiImage btn2Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn2Txt.SetWidescreen(Settings.widescreen);
|
|
btn2Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn2(&btn2Img, &btn2Img, 1, 4, -20, -25, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn2.SetLabel(&btn2Txt);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen)) /////////////adjust buttons for widescreen
|
|
{
|
|
msgTxt.SetMaxWidth(380);
|
|
if (btn2Label)
|
|
{
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-70, -80);
|
|
btn1.SetPosition(70, -80);
|
|
}
|
|
else
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -80);
|
|
}
|
|
}
|
|
|
|
GuiText timerTxt((char*) NULL, 26, Theme.prompttext);
|
|
timerTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
timerTxt.SetPosition(0, 160);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
|
|
if (btn1Label) promptWindow.Append(&btn1);
|
|
if (btn2Label) promptWindow.Append(&btn2);
|
|
if (IsDeviceWait) promptWindow.Append(&timerTxt);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
if (IsDeviceWait)
|
|
{
|
|
while (i >= 0)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
timerTxt.SetTextf("%u %s", i, tr( "seconds left" ));
|
|
sleep(1);
|
|
USBDevice_deInit();
|
|
USBDevice_Init();
|
|
ret = WBFS_Init(WBFS_DEVICE_USB);
|
|
if (ret >= 0) break;
|
|
|
|
i--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while (!(cover & 0x2))
|
|
{
|
|
VIDEO_WaitVSync();
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
btn1.ResetState();
|
|
break;
|
|
}
|
|
ret = WDVD_GetCoverStatus(&cover);
|
|
if (ret < 0) break;
|
|
}
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* FormatingPartition
|
|
***************************************************************************/
|
|
int FormatingPartition(const char *title, partitionEntry *entry)
|
|
{
|
|
int ret;
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 60);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
VIDEO_WaitVSync();
|
|
ret = WBFS_Format(entry->sector, entry->size);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
return ret;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* SearchMissingImages
|
|
***************************************************************************/
|
|
bool SearchMissingImages(int choice2)
|
|
{
|
|
|
|
gprintf("\nSearchMissingImages(%i)", choice2);
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiText titleTxt(tr( "Checking existing artwork" ), 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 60);
|
|
|
|
char msg[20] = " ";
|
|
GuiText msgTxt(msg, 22, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msgTxt.SetPosition(0, -40);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
//make sure that all games are added to the gamelist
|
|
gameList.LoadUnfiltered();
|
|
|
|
cntMissFiles = 0;
|
|
int i = 0;
|
|
char filename[11];
|
|
|
|
//add IDs of games that are missing covers to cntMissFiles
|
|
bool found1 = false;
|
|
bool found2 = false;
|
|
bool found3 = false;
|
|
for (i = 0; i < gameList.size() && cntMissFiles < 500; i++)
|
|
{
|
|
struct discHdr* header = gameList[i];
|
|
if (choice2 != 3)
|
|
{
|
|
|
|
char *covers_path = choice2 == 1 ? Settings.covers2d_path : Settings.covers_path;
|
|
|
|
snprintf(filename, sizeof(filename), "%c%c%c.png", header->id[0], header->id[1], header->id[2]);
|
|
found2 = FindFile(filename, covers_path);
|
|
|
|
snprintf(filename, sizeof(filename), "%c%c%c%c.png", header->id[0], header->id[1], header->id[2],
|
|
header->id[3]);
|
|
found3 = FindFile(filename, covers_path);
|
|
|
|
snprintf(filename, sizeof(filename), "%c%c%c%c%c%c.png", header->id[0], header->id[1], header->id[2],
|
|
header->id[3], header->id[4], header->id[5]); //full id
|
|
found1 = FindFile(filename, covers_path);
|
|
if (!found1 && !found2 && !found3) //if could not find any image
|
|
{
|
|
snprintf(missingFiles[cntMissFiles], 11, "%s", filename);
|
|
cntMissFiles++;
|
|
}
|
|
}
|
|
else if (choice2 == 3)
|
|
{
|
|
snprintf(filename, sizeof(filename), "%c%c%c.png", header->id[0], header->id[1], header->id[2]);
|
|
found2 = FindFile(filename, Settings.disc_path);
|
|
snprintf(filename, sizeof(filename), "%c%c%c%c%c%c.png", header->id[0], header->id[1], header->id[2],
|
|
header->id[3], header->id[4], header->id[5]); //full id
|
|
found1 = FindFile(filename, Settings.disc_path);
|
|
if (!found1 && !found2)
|
|
{
|
|
snprintf(missingFiles[cntMissFiles], 11, "%s", filename);
|
|
cntMissFiles++;
|
|
}
|
|
}
|
|
}
|
|
if (cntMissFiles == 0)
|
|
{
|
|
msgTxt.SetText(tr( "No file missing!" ));
|
|
sleep(1);
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
gameList.FilterList();
|
|
ResumeGui();
|
|
|
|
gprintf(" = %i", cntMissFiles);
|
|
if (cntMissFiles > 0) //&& !IsNetworkInit()) {
|
|
{
|
|
NetworkInitPrompt();
|
|
}
|
|
|
|
if (cntMissFiles == 0)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
/****************************************************************************
|
|
* NetworkInitPrompt
|
|
***************************************************************************/
|
|
bool NetworkInitPrompt()
|
|
{
|
|
|
|
gprintf("\nNetworkinitPrompt()");
|
|
if (IsNetworkInit()) return true;
|
|
|
|
bool success = true;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiText titleTxt(tr( "Initializing Network" ), 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 60);
|
|
|
|
char msg[20] = " ";
|
|
GuiText msgTxt(msg, 22, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msgTxt.SetPosition(0, -40);
|
|
|
|
GuiText btn1Txt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn1(&btn1Img, &btn1Img, 2, 4, 0, -45, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen)) /////////////adjust buttons for widescreen
|
|
{
|
|
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
|
|
btn1.SetPosition(0, -80);
|
|
}
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
promptWindow.Append(&btn1);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
while (!IsNetworkInit())
|
|
{
|
|
|
|
VIDEO_WaitVSync();
|
|
|
|
Initialize_Network();
|
|
|
|
if (!IsNetworkInit())
|
|
{
|
|
msgTxt.SetText(tr( "Could not initialize network!" ));
|
|
sleep(3);
|
|
success = false;
|
|
break;
|
|
}
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
btn1.ResetState();
|
|
success = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
|
|
return success;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* ProgressDownloadWindow
|
|
*
|
|
* Opens a window, which displays progress to the user. Can either display a
|
|
* progress bar showing % completion, or a throbber that only shows that an
|
|
* action is in progress.
|
|
***************************************************************************/
|
|
int ProgressDownloadWindow(int choice2)
|
|
{
|
|
|
|
int i = 0, cntNotFound = 0;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png"));
|
|
GuiImage progressbarOutlineImg(&progressbarOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
progressbarOutlineImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarOutlineImg.SetPosition(25, 40);
|
|
|
|
GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png"));
|
|
GuiImage progressbarEmptyImg(&progressbarEmpty);
|
|
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarEmptyImg.SetPosition(25, 40);
|
|
progressbarEmptyImg.SetTile(100);
|
|
|
|
GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png"));
|
|
GuiImage progressbarImg(&progressbar);
|
|
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarImg.SetPosition(25, 40);
|
|
|
|
GuiText titleTxt(tr( "Downloading file" ), 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 60);
|
|
|
|
GuiText msgTxt((char*) NULL, 20, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
msgTxt.SetPosition(0, 130);
|
|
|
|
GuiText msg2Txt((char*) NULL, 26, Theme.prompttext);
|
|
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
msg2Txt.SetPosition(0, 100);
|
|
|
|
GuiText prTxt((char*) NULL, 26, Theme.prompttext);
|
|
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
prTxt.SetPosition(0, 40);
|
|
|
|
GuiText btn1Txt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn1(&btn1Img, &btn1Img, 2, 4, 0, -45, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen)) /////////////adjust for widescreen
|
|
{
|
|
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
progressbarOutlineImg.SetPosition(0, 40);
|
|
progressbarEmptyImg.SetPosition(80, 40);
|
|
progressbarEmptyImg.SetTile(78);
|
|
progressbarImg.SetPosition(80, 40);
|
|
}
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
promptWindow.Append(&msg2Txt);
|
|
promptWindow.Append(&progressbarEmptyImg);
|
|
promptWindow.Append(&progressbarImg);
|
|
promptWindow.Append(&progressbarOutlineImg);
|
|
promptWindow.Append(&prTxt);
|
|
promptWindow.Append(&btn1);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
int offset = 0, tries = 0;
|
|
int serverCnt3d = 1, serverCnt2d = 1, serverCntDisc = 2;
|
|
|
|
char server3d[100];
|
|
char serverDisc[100];
|
|
char serverDiscCustom[100];
|
|
char server2d[100];
|
|
|
|
snprintf(server3d, sizeof(server3d), "http://wiitdb.com/wiitdb/artwork/cover3D/");
|
|
snprintf(serverDisc, sizeof(serverDisc), "http://wiitdb.com/wiitdb/artwork/disc/");
|
|
snprintf(serverDiscCustom, sizeof(serverDiscCustom), "http://wiitdb.com/wiitdb/artwork/disccustom/");
|
|
snprintf(server2d, sizeof(server2d), "http://wiitdb.com/wiitdb/artwork/cover/");
|
|
|
|
//check if directory exist and if not create one
|
|
struct stat st;
|
|
if (stat(Settings.covers_path, &st) != 0)
|
|
{
|
|
if (!CreateSubfolder(Settings.covers_path))
|
|
{
|
|
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
cntMissFiles = 0;
|
|
}
|
|
}
|
|
if (stat(Settings.covers2d_path, &st) != 0)
|
|
{
|
|
if (!CreateSubfolder(Settings.covers2d_path))
|
|
{
|
|
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
cntMissFiles = 0;
|
|
}
|
|
}
|
|
if (stat(Settings.disc_path, &st) != 0)
|
|
{
|
|
if (!CreateSubfolder(Settings.disc_path))
|
|
{
|
|
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
cntMissFiles = 0;
|
|
}
|
|
}
|
|
|
|
//int server = 1;
|
|
while (i < cntMissFiles)
|
|
{
|
|
tries = 0;
|
|
prTxt.SetTextf("%i%%", 100 * i / cntMissFiles);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen))
|
|
{
|
|
//adjust for widescreen
|
|
progressbarImg.SetPosition(80, 40);
|
|
progressbarImg.SetTile(80 * i / cntMissFiles);
|
|
}
|
|
else
|
|
{
|
|
progressbarImg.SetTile(100 * i / cntMissFiles);
|
|
}
|
|
|
|
if (cntMissFiles - i > 1)
|
|
msgTxt.SetTextf("%i %s", cntMissFiles - i, tr( "files left" ));
|
|
else msgTxt.SetTextf("%i %s", cntMissFiles - i, tr( "file left" ));
|
|
msg2Txt.SetTextf("http://wiitdb.com : %s", missingFiles[i]);
|
|
|
|
//download cover
|
|
char imgPath[100];
|
|
char URLFile[100];
|
|
char tmp[75];
|
|
sprintf(tmp, tr( "Not Found" ));
|
|
struct block file = downloadfile(URLFile);
|
|
if (choice2 == 2)
|
|
{
|
|
while (tries < serverCnt3d)
|
|
{
|
|
|
|
//Creates URL depending from which Country the game is
|
|
switch (missingFiles[i][3])
|
|
{
|
|
case 'J':
|
|
sprintf(URLFile, "%sJA/%s", server3d, missingFiles[i]);
|
|
break;
|
|
case 'W':
|
|
sprintf(URLFile, "%sZH/%s", server3d, missingFiles[i]);
|
|
break;
|
|
case 'K':
|
|
sprintf(URLFile, "%sKO/%s", server3d, missingFiles[i]);
|
|
break;
|
|
case 'P':
|
|
case 'D':
|
|
case 'F':
|
|
case 'I':
|
|
case 'S':
|
|
case 'H':
|
|
case 'U':
|
|
case 'X':
|
|
case 'Y':
|
|
case 'Z':
|
|
sprintf(URLFile, "%s%s/%s", server3d, Settings.db_language, missingFiles[i]);
|
|
break;
|
|
case 'E':
|
|
sprintf(URLFile, "%sUS/%s", server3d, missingFiles[i]);
|
|
break;
|
|
}
|
|
|
|
sprintf(imgPath, "%s%s", Settings.covers_path, missingFiles[i]);
|
|
file = downloadfile(URLFile);
|
|
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174 || file.size
|
|
== 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", server3d, missingFiles[i]);
|
|
file = downloadfile(URLFile);
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174
|
|
|| file.size == 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
tries++;
|
|
}
|
|
|
|
}
|
|
if (choice2 == 3)
|
|
{
|
|
while (tries < serverCntDisc)
|
|
{
|
|
|
|
//Creates URL depending from which Country the game is
|
|
switch (missingFiles[i][3])
|
|
{
|
|
case 'J':
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sJA/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
break;
|
|
case 'W':
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sZH/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
break;
|
|
case 'K':
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sKO/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
break;
|
|
case 'P':
|
|
case 'D':
|
|
case 'F':
|
|
case 'I':
|
|
case 'S':
|
|
case 'H':
|
|
case 'U':
|
|
case 'X':
|
|
case 'Y':
|
|
case 'Z':
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDisc, Settings.db_language, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDiscCustom, Settings.db_language, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDisc, Settings.db_language, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDiscCustom, Settings.db_language, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDiscCustom, Settings.db_language, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%s%s/%s", serverDisc, Settings.db_language, missingFiles[i]);
|
|
}
|
|
break;
|
|
case 'E':
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sUS/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
sprintf(imgPath, "%s%s", Settings.disc_path, missingFiles[i]);
|
|
file = downloadfile(URLFile);
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174 || file.size
|
|
== 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (Settings.discart == 0)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 1)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 2 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 0)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDiscCustom, missingFiles[i]);
|
|
}
|
|
else if (Settings.discart == 3 && tries == 1)
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", serverDisc, missingFiles[i]);
|
|
}
|
|
file = downloadfile(URLFile);
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174
|
|
|| file.size == 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
tries++;
|
|
}
|
|
}
|
|
if (choice2 == 1)
|
|
{
|
|
while (tries < serverCnt2d)
|
|
{
|
|
|
|
//Creates URL depending from which Country the game is
|
|
switch (missingFiles[i][3])
|
|
{
|
|
case 'J':
|
|
sprintf(URLFile, "%sJA/%s", server2d, missingFiles[i]);
|
|
break;
|
|
case 'W':
|
|
sprintf(URLFile, "%sZH/%s", server2d, missingFiles[i]);
|
|
break;
|
|
case 'K':
|
|
sprintf(URLFile, "%sKO/%s", server2d, missingFiles[i]);
|
|
break;
|
|
case 'P':
|
|
case 'D':
|
|
case 'F':
|
|
case 'I':
|
|
case 'S':
|
|
case 'H':
|
|
case 'U':
|
|
case 'X':
|
|
case 'Y':
|
|
case 'Z':
|
|
sprintf(URLFile, "%s%s/%s", server2d, Settings.db_language, missingFiles[i]);
|
|
break;
|
|
case 'E':
|
|
sprintf(URLFile, "%sUS/%s", server2d, missingFiles[i]);
|
|
break;
|
|
}
|
|
|
|
sprintf(imgPath, "%s%s", Settings.covers2d_path, missingFiles[i]);
|
|
file = downloadfile(URLFile);
|
|
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174 || file.size
|
|
== 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
sprintf(URLFile, "%sEN/%s", server2d, missingFiles[i]);
|
|
file = downloadfile(URLFile);
|
|
if (!(file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174
|
|
|| file.size == 4446 || file.data == NULL))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
tries++;
|
|
}
|
|
}
|
|
|
|
offset++;
|
|
|
|
if (file.size == 36864 || file.size <= 1024 || file.size <= 1174 || file.size == 7386 || file.size == 4446
|
|
|| file.data == NULL)
|
|
{
|
|
cntNotFound++;
|
|
i++;
|
|
}
|
|
else
|
|
{
|
|
if (file.data != NULL)
|
|
{
|
|
// save png to sd card
|
|
FILE *pfile = NULL;
|
|
if ((pfile = fopen(imgPath, "wb")) != NULL)
|
|
{
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
}
|
|
free(file.data);
|
|
}
|
|
i++;
|
|
|
|
}
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
cntNotFound = cntMissFiles - i + cntNotFound;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**Temporary redownloading 1st image because of a fucking corruption bug **/
|
|
#if 0 // is no longer necessary, since libfat is fixed
|
|
char URLFile[100];
|
|
struct block file = downloadfile( URLFile );
|
|
if ( choice2 == 2 )
|
|
{
|
|
while ( tries < serverCnt3d )
|
|
{
|
|
sprintf( URLFile, "%s%s", server3d, missingFiles[0] );
|
|
sprintf( imgPath, "%s%s", Settings.covers_path, missingFiles[0] );
|
|
file = downloadfile( URLFile );
|
|
if ( !( file.size == 36864 || file.size <= 1024 || file.size <= 1174 || file.size == 7386 || file.size == 4446 || file.data == NULL ) )break;
|
|
tries++;
|
|
}
|
|
|
|
}
|
|
if ( choice2 == 3 )
|
|
{
|
|
while ( tries < serverCntDisc )
|
|
{
|
|
sprintf( URLFile, "%s%s", serverDisc, missingFiles[0] );
|
|
sprintf( imgPath, "%s%s", Settings.disc_path, missingFiles[0] );
|
|
file = downloadfile( URLFile );
|
|
if ( !( file.size == 36864 || file.size <= 1024 || file.size <= 1174 || file.size == 7386 || file.size == 4446 || file.data == NULL ) )break;
|
|
tries++;
|
|
}
|
|
}
|
|
if ( choice2 == 1 )
|
|
{
|
|
while ( tries < serverCnt2d )
|
|
{
|
|
sprintf( URLFile, "%s%s", server2d, missingFiles[0] );
|
|
sprintf( imgPath, "%s%s", Settings.covers2d_path, missingFiles[0] );
|
|
file = downloadfile( URLFile );
|
|
if ( !( file.size == 36864 || file.size <= 1024 || file.size <= 1174 || file.size == 7386 || file.size == 4446 || file.data == NULL ) )break;
|
|
tries++;
|
|
}
|
|
}
|
|
if ( file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.size <= 1174 || file.size == 4446 || file.data == NULL )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
if ( file.data != NULL )
|
|
{
|
|
// save png to sd card
|
|
FILE *pfile;
|
|
pfile = fopen( imgPath, "wb" );
|
|
fwrite( file.data, 1, file.size, pfile );
|
|
fclose ( pfile );
|
|
free( file.data );
|
|
}
|
|
}
|
|
#endif
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
|
|
if (cntNotFound != 0)
|
|
{
|
|
return cntNotFound;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/****************************************************************************
|
|
* ProgressWindow
|
|
*
|
|
* Opens a window, which displays progress to the user. Can either display a
|
|
* progress bar showing % completion, or a throbber that only shows that an
|
|
* action is in progress.
|
|
***************************************************************************/
|
|
#define BLOCKSIZE 1024
|
|
/*bool unzipArchive(char * zipfilepath, char * unzipfolderpath)
|
|
{
|
|
unzFile uf = unzOpen(zipfilepath);
|
|
if (uf==NULL)
|
|
{
|
|
// printf("Cannot open %s, aborting\n",zipfilepath);
|
|
return false;
|
|
}
|
|
//printf("%s opened\n",zipfilepath);
|
|
if(chdir(unzipfolderpath)) // can't access dir
|
|
{
|
|
makedir(unzipfolderpath); // attempt to make dir
|
|
if(chdir(unzipfolderpath)) // still can't access dir
|
|
{
|
|
//printf("Error changing into %s, aborting\n", unzipfolderpath);
|
|
return false;
|
|
}
|
|
}
|
|
extractZip(uf,0,1,0);
|
|
unzCloseCurrentFile(uf);
|
|
return true
|
|
}
|
|
*/
|
|
|
|
#ifdef FULLCHANNEL ///////////////////this is only used if the dol is being compiled for a full channel
|
|
int ProgressUpdateWindow()
|
|
{
|
|
int ret = 0, failed = 0;
|
|
|
|
gprintf( "\nProgressUpdateWindow(full channel)" );
|
|
GuiWindow promptWindow( 472, 320 );
|
|
promptWindow.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
promptWindow.SetPosition( 0, -10 );
|
|
|
|
GuiSound btnSoundOver( button_over_pcm, button_over_pcm_size, Settings.sfxvolume );
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if ( !btnClick2 ) btnClick2 = new GuiSound( button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume );
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, Settings.sfxvolume);
|
|
|
|
char imgPath[100];
|
|
snprintf( imgPath, sizeof( imgPath ), "%sbutton_dialogue_box.png", Settings.theme_path );
|
|
GuiImageData btnOutline( imgPath, button_dialogue_box_png );
|
|
snprintf( imgPath, sizeof( imgPath ), "%sdialogue_box.png", Settings.theme_path );
|
|
GuiImageData dialogBox( imgPath, dialogue_box_png );
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger( -1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A );
|
|
|
|
GuiImage dialogBoxImg( &dialogBox );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
dialogBoxImg.SetWidescreen( Settings.widescreen );
|
|
}
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar_outline.png", Settings.theme_path );
|
|
GuiImageData progressbarOutline( imgPath, progressbar_outline_png );
|
|
GuiImage progressbarOutlineImg( &progressbarOutline );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
progressbarOutlineImg.SetWidescreen( Settings.widescreen );
|
|
}
|
|
progressbarOutlineImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
progressbarOutlineImg.SetPosition( 25, 7 );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar_empty.png", Settings.theme_path );
|
|
GuiImageData progressbarEmpty( imgPath, progressbar_empty_png );
|
|
GuiImage progressbarEmptyImg( &progressbarEmpty );
|
|
progressbarEmptyImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
progressbarEmptyImg.SetPosition( 25, 7 );
|
|
progressbarEmptyImg.SetTile( 100 );
|
|
|
|
snprintf( imgPath, sizeof( imgPath ), "%sprogressbar.png", Settings.theme_path );
|
|
GuiImageData progressbar( imgPath, progressbar_png );
|
|
GuiImage progressbarImg( &progressbar );
|
|
progressbarImg.SetAlignment( ALIGN_LEFT, ALIGN_MIDDLE );
|
|
progressbarImg.SetPosition( 25, 7 );
|
|
|
|
char title[50];
|
|
sprintf( title, "%s", tr( "Checking for Updates" ) );
|
|
GuiText titleTxt( title, 26, Theme.prompttext );
|
|
titleTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
titleTxt.SetPosition( 0, 50 );
|
|
char msg[50];
|
|
sprintf( msg, "%s", tr( "Initializing Network" ) );
|
|
GuiText msgTxt( msg, 26, Theme.prompttext );
|
|
msgTxt.SetAlignment( ALIGN_CENTRE, ALIGN_TOP );
|
|
msgTxt.SetPosition( 0, 140 );
|
|
char msg2[50] = " ";
|
|
GuiText msg2Txt( msg2, 26, Theme.prompttext );
|
|
msg2Txt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
msg2Txt.SetPosition( 0, 50 );
|
|
|
|
GuiText prTxt( NULL, 26, Theme.prompttext );
|
|
prTxt.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
prTxt.SetPosition( 0, 7 );
|
|
|
|
GuiText btn1Txt( tr( "Cancel" ), 22, Theme.prompttext );
|
|
GuiImage btn1Img( &btnOutline );
|
|
if ( Settings.wsprompt == yes )
|
|
{
|
|
btn1Txt.SetWidescreen( Settings.widescreen );
|
|
btn1Img.SetWidescreen( Settings.widescreen );
|
|
}
|
|
GuiButton btn1( &btn1Img, &btn1Img, 2, 4, 0, -40, &trigA, &btnSoundOver, btnClick2, 1 );
|
|
btn1.SetLabel( &btn1Txt );
|
|
btn1.SetState( STATE_SELECTED );
|
|
|
|
if ( ( Settings.wsprompt == yes ) && ( Settings.widescreen ) ) /////////////adjust for widescreen
|
|
|
|
{
|
|
progressbarOutlineImg.SetAlignment( ALIGN_CENTRE, ALIGN_MIDDLE );
|
|
progressbarOutlineImg.SetPosition( 0, 7 );
|
|
progressbarEmptyImg.SetPosition( 80, 7 );
|
|
progressbarEmptyImg.SetTile( 78 );
|
|
progressbarImg.SetPosition( 80, 7 );
|
|
}
|
|
|
|
promptWindow.Append( &dialogBoxImg );
|
|
promptWindow.Append( &titleTxt );
|
|
promptWindow.Append( &msgTxt );
|
|
promptWindow.Append( &msg2Txt );
|
|
promptWindow.Append( &btn1 );
|
|
|
|
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50 );
|
|
|
|
HaltGui();
|
|
mainWindow->SetState( STATE_DISABLED );
|
|
mainWindow->Append( &promptWindow );
|
|
mainWindow->ChangeFocus( &promptWindow );
|
|
ResumeGui();
|
|
|
|
struct stat st;
|
|
if ( stat( Settings.update_path, &st ) != 0 )
|
|
{
|
|
if ( subfoldercreate( Settings.covers_path ) != 1 )
|
|
{
|
|
WindowPrompt( tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ) );
|
|
ret = -1;
|
|
failed = -1;
|
|
}
|
|
}
|
|
|
|
if ( stat( Settings.titlestxt_path, &st ) != 0 )
|
|
{
|
|
if ( subfoldercreate( Settings.titlestxt_path ) != 1 )
|
|
{
|
|
WindowPrompt( tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ) );
|
|
ret = -1;
|
|
failed = -1;
|
|
}
|
|
}
|
|
|
|
//make the URL to get XML based on our games
|
|
char XMLurl[3540];
|
|
build_XML_URL( XMLurl, sizeof( XMLurl ) );
|
|
|
|
char dolpath[150];
|
|
// char dolpathsuccess[150];//use coverspath as a folder for the update wad so we dont make a new folder and have to delete it
|
|
snprintf( dolpath, sizeof( dolpath ), "%sULNR.wad", Settings.covers_path );
|
|
//snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sUNEO.wad", Settings.covers_path);
|
|
Initialize_Network();
|
|
while ( !IsNetworkInit() )
|
|
{
|
|
|
|
VIDEO_WaitVSync();
|
|
|
|
Initialize_Network();
|
|
|
|
if ( IsNetworkInit() )
|
|
{
|
|
msgTxt.SetText( GetNetworkIP() );
|
|
}
|
|
else
|
|
{
|
|
msgTxt.SetText( tr( "Could not initialize network!" ) );
|
|
}
|
|
|
|
if ( btn1.GetState() == STATE_CLICKED )
|
|
{
|
|
ret = -1;
|
|
failed = -1;
|
|
btn1.ResetState();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( IsNetworkInit() && ret >= 0 )
|
|
{
|
|
|
|
int newrev = CheckUpdate();
|
|
|
|
if ( newrev > 0 )
|
|
{
|
|
FILE * pfile;
|
|
sprintf( msg, "Rev%i %s.", newrev, tr( "available" ) );
|
|
int choice = WindowPrompt( msg, 0, tr( "Update" ), tr( "Cancel" ) );
|
|
if ( choice == 1 )
|
|
{
|
|
titleTxt.SetTextf( "%s USB Loader GX", tr( "Updating" ) );
|
|
msgTxt.SetPosition( 0, 100 );
|
|
msgTxt.SetTextf( "%s", tr( "Updating WiiTDB.zip" ) );
|
|
|
|
char wiitdbpath[200];
|
|
char wiitdbpathtmp[200];
|
|
struct block file = downloadfile( XMLurl );
|
|
if ( file.data != NULL )
|
|
{
|
|
snprintf( wiitdbpath, sizeof( wiitdbpath ), "%swiitdb_%s.zip", Settings.titlestxt_path, game_partition );
|
|
snprintf( wiitdbpathtmp, sizeof( wiitdbpathtmp ), "%swiitmp_%s.zip", Settings.titlestxt_path, game_partition );
|
|
rename( wiitdbpath, wiitdbpathtmp );
|
|
pfile = fopen( wiitdbpath, "wb" );
|
|
fwrite( file.data, 1, file.size, pfile );
|
|
fclose( pfile );
|
|
free( file.data );
|
|
CloseXMLDatabase();
|
|
if ( OpenXMLDatabase( Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true, Settings.titlesOverride == 1 ? true : false, true ) ) // open file, reload titles, keep in memory
|
|
|
|
{
|
|
remove( wiitdbpathtmp );
|
|
}
|
|
else
|
|
{
|
|
remove( wiitdbpath );
|
|
rename( wiitdbpathtmp, wiitdbpath );
|
|
OpenXMLDatabase( Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true, Settings.titlesOverride == 1 ? true : false, true ); // open file, reload titles, keep in memory
|
|
}
|
|
}
|
|
|
|
msgTxt.SetTextf( "%s", tr( "Updating Language Files:" ) );
|
|
updateLanguageFiles();
|
|
promptWindow.Append( &progressbarEmptyImg );
|
|
promptWindow.Append( &progressbarImg );
|
|
promptWindow.Append( &progressbarOutlineImg );
|
|
promptWindow.Append( &prTxt );
|
|
msgTxt.SetTextf( "%s Rev%i wad.", tr( "Downloading" ), newrev );
|
|
s32 filesize;
|
|
if ( Settings.beta_upgrades )
|
|
{
|
|
char url[255];
|
|
memset( &url, 0, 255 );
|
|
sprintf( ( char * ) &url, "http://usbloader-gui.googlecode.com/files/r%d.wad", newrev );
|
|
filesize = download_request( ( char * ) & url );
|
|
}
|
|
else
|
|
{
|
|
filesize = download_request( "http://www.techjawa.com/usbloadergx/ULNR.file" );//for some reason it didn't download completely when saved as a wad.
|
|
}
|
|
|
|
if ( filesize > 0 )
|
|
{
|
|
|
|
pfile = fopen( dolpath, "wb" );//here we save the txt as a wad
|
|
u8 * blockbuffer = new unsigned char[BLOCKSIZE];
|
|
for ( s32 i = 0; i < filesize; i += BLOCKSIZE )
|
|
{
|
|
usleep( 100 );
|
|
prTxt.SetTextf( "%i%%", ( 100*i / filesize ) + 1 );
|
|
if ( ( Settings.wsprompt == yes ) && ( Settings.widescreen ) )
|
|
{
|
|
progressbarImg.SetTile( 80*i / filesize );
|
|
}
|
|
else
|
|
{
|
|
progressbarImg.SetTile( 100*i / filesize );
|
|
}
|
|
msg2Txt.SetTextf( "%iKB/%iKB", i / 1024, filesize / 1024 );
|
|
|
|
if ( btn1.GetState() == STATE_CLICKED )
|
|
{
|
|
fclose( pfile );
|
|
remove( dolpath );
|
|
failed = -1;
|
|
btn1.ResetState();
|
|
break;
|
|
}
|
|
|
|
u32 blksize;
|
|
blksize = ( u32 )( filesize - i );
|
|
if ( blksize > BLOCKSIZE )
|
|
blksize = BLOCKSIZE;
|
|
|
|
ret = network_read( blockbuffer, blksize );
|
|
if ( ret != ( s32 ) blksize )
|
|
{
|
|
failed = -1;
|
|
ret = -1;
|
|
fclose( pfile );
|
|
remove( dolpath );
|
|
break;
|
|
}
|
|
fwrite( blockbuffer, 1, blksize, pfile );
|
|
}
|
|
fclose( pfile );
|
|
delete blockbuffer;
|
|
if ( !failed )
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
failed = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ret = -1;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
WindowPrompt( tr( "No new updates." ), 0, tr( "OK" ) );
|
|
ret = -1;
|
|
}
|
|
|
|
}
|
|
promptWindow.SetEffect( EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50 );
|
|
while ( promptWindow.GetEffect() > 0 ) usleep( 50 );
|
|
|
|
HaltGui();
|
|
mainWindow->Remove( &promptWindow );
|
|
//mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
CloseConnection();
|
|
sleep( 1 );//sleep 1 because it froze without this for some reason
|
|
|
|
if ( !failed && ret >= 0 )
|
|
{
|
|
|
|
FILE *wadFile = NULL;
|
|
s32 error = 1;
|
|
int diarhea = 0;
|
|
char nipple[100];
|
|
wadFile = fopen ( dolpath , "rb" );
|
|
if ( wadFile == NULL ) //we can't open the file wad we just downloaded
|
|
|
|
{
|
|
sprintf( nipple, tr( "Unable to open the wad that was just downloaded (%s)." ), dolpath );
|
|
WindowPrompt( tr( "Error !" ), nipple, tr( "OK" ) );
|
|
failed = -1;
|
|
}
|
|
else
|
|
{
|
|
//sprintf(nipple, tr("The update wad has been saved as %s. Now let's try to install it."),dolpath);
|
|
//WindowPrompt(0,nipple, tr("OK"));
|
|
gprintf( "\n\tinstall wad" );
|
|
error = Wad_Install( wadFile );
|
|
fclose( wadFile );
|
|
if ( error == 0 )
|
|
{
|
|
diarhea = remove( dolpath );
|
|
if ( diarhea )
|
|
WindowPrompt( tr( "Success" ), tr( "The wad file was installed. But It could not be deleted from the SD card." ), tr( "OK" ) );
|
|
}
|
|
else
|
|
{
|
|
gprintf( " -> failed" );
|
|
sprintf( nipple, tr( "The wad installation failed with error %ld" ), error );
|
|
WindowPrompt( tr( "Error" ), nipple, tr( "OK" ) );
|
|
}
|
|
}
|
|
|
|
if ( error )
|
|
WindowPrompt( tr( "ERROR" ) , tr( "An Error occured" ), tr( "OK" ) );
|
|
else
|
|
{
|
|
WindowPrompt( tr( "Restarting..." ), tr( "Successfully Updated thanks to www.techjawa.com" ) , 0, 0, 0, 0, 150 );
|
|
}
|
|
CloseXMLDatabase();
|
|
ExitGUIThreads();
|
|
ShutdownAudio();
|
|
StopGX();
|
|
gprintf( "\nRebooting" );
|
|
WII_Initialize();
|
|
WII_LaunchTitle( TITLE_ID( 0x00010001, 0x554c4e52 ) );
|
|
}
|
|
|
|
// promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
//while(promptWindow.GetEffect() > 0) usleep(50);
|
|
|
|
HaltGui();
|
|
//mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState( STATE_DEFAULT );
|
|
ResumeGui();
|
|
|
|
if ( failed != 0 )
|
|
return failed;
|
|
|
|
return 1;
|
|
}
|
|
#else
|
|
int ProgressUpdateWindow()
|
|
{
|
|
|
|
gprintf("\nProgressUpdateWindow(not full channel)");
|
|
int ret = 0, failed = 0, updatemode = -1;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiImageData progressbarOutline(Resources::GetFile("progressbar_outline.png"), Resources::GetFileSize("progressbar_outline.png"));
|
|
GuiImage progressbarOutlineImg(&progressbarOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
progressbarOutlineImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarOutlineImg.SetPosition(25, 7);
|
|
|
|
GuiImageData progressbarEmpty(Resources::GetFile("progressbar_empty.png"), Resources::GetFileSize("progressbar_empty.png"));
|
|
GuiImage progressbarEmptyImg(&progressbarEmpty);
|
|
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarEmptyImg.SetPosition(25, 7);
|
|
progressbarEmptyImg.SetTile(100);
|
|
|
|
GuiImageData progressbar(Resources::GetFile("progressbar.png"), Resources::GetFileSize("progressbar.png"));
|
|
GuiImage progressbarImg(&progressbar);
|
|
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
|
|
progressbarImg.SetPosition(25, 7);
|
|
|
|
char title[50];
|
|
sprintf(title, "%s", tr( "Checking for Updates" ));
|
|
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 50);
|
|
char msg[50];
|
|
sprintf(msg, "%s", tr( "Initializing Network" ));
|
|
GuiText msgTxt(msg, 26, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
msgTxt.SetPosition(0, 140);
|
|
char msg2[50] = " ";
|
|
GuiText msg2Txt(msg2, 26, Theme.prompttext);
|
|
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msg2Txt.SetPosition(0, 50);
|
|
|
|
GuiText prTxt((char*) NULL, 26, Theme.prompttext);
|
|
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
prTxt.SetPosition(0, 7);
|
|
|
|
GuiText btn1Txt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn1(&btn1Img, &btn1Img, 2, 4, 0, -40, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen)) /////////////adjust for widescreen
|
|
{
|
|
progressbarOutlineImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
progressbarOutlineImg.SetPosition(0, 7);
|
|
progressbarEmptyImg.SetPosition(80, 7);
|
|
progressbarEmptyImg.SetTile(78);
|
|
progressbarImg.SetPosition(80, 7);
|
|
}
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
promptWindow.Append(&msg2Txt);
|
|
promptWindow.Append(&btn1);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
struct stat st;
|
|
if (stat(Settings.update_path, &st) != 0)
|
|
{
|
|
if (!CreateSubfolder(Settings.update_path))
|
|
{
|
|
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
ret = -1;
|
|
failed = -1;
|
|
}
|
|
}
|
|
|
|
char dolpath[150];
|
|
char dolpathsuccess[150];
|
|
snprintf(dolpath, sizeof(dolpath), "%sbootnew.dol", Settings.update_path);
|
|
snprintf(dolpathsuccess, sizeof(dolpathsuccess), "%sboot.dol", Settings.update_path);
|
|
|
|
while (!IsNetworkInit())
|
|
{
|
|
|
|
VIDEO_WaitVSync();
|
|
|
|
Initialize_Network();
|
|
|
|
if (IsNetworkInit())
|
|
{
|
|
msgTxt.SetText(GetNetworkIP());
|
|
}
|
|
else
|
|
{
|
|
msgTxt.SetText(tr( "Could not initialize network!" ));
|
|
}
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
ret = -1;
|
|
failed = -1;
|
|
btn1.ResetState();
|
|
break;
|
|
}
|
|
}
|
|
|
|
//make the URL to get XML based on our games
|
|
char XMLurl[3540];
|
|
build_XML_URL(XMLurl, sizeof(XMLurl));
|
|
|
|
if (IsNetworkInit() && ret >= 0)
|
|
{
|
|
|
|
updatemode = WindowPrompt(tr( "What do you want to update?" ), 0, "USB Loader GX", tr( "WiiTDB Files" ),
|
|
tr( "Language File" ), tr( "Cancel" ));
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
promptWindow.SetState(STATE_DEFAULT);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
|
|
if (updatemode == 1)
|
|
{
|
|
|
|
int newrev = CheckUpdate();
|
|
if (newrev > 0)
|
|
{
|
|
|
|
sprintf(msg, "Rev%i %s.", newrev, tr( "available" ));
|
|
int choice = WindowPrompt(msg, tr( "How do you want to update?" ), tr( "Update DOL" ),
|
|
tr( "Update All" ), tr( "Cancel" ));
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
promptWindow.SetState(STATE_DEFAULT);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
if (choice == 1 || choice == 2)
|
|
{
|
|
titleTxt.SetTextf("%s USB Loader GX", tr( "Updating" ));
|
|
msgTxt.SetPosition(0, 100);
|
|
promptWindow.Append(&progressbarEmptyImg);
|
|
promptWindow.Append(&progressbarImg);
|
|
promptWindow.Append(&progressbarOutlineImg);
|
|
promptWindow.Append(&prTxt);
|
|
msgTxt.SetTextf("%s Rev%i", tr( "Update to" ), newrev);
|
|
|
|
s32 filesize;
|
|
if (Settings.beta_upgrades)
|
|
{
|
|
char url[255];
|
|
memset(&url, 0, 255);
|
|
sprintf((char *) &url, "http://usbloader-gui.googlecode.com/files/r%d.dol", newrev);
|
|
filesize = download_request((char *) &url);
|
|
}
|
|
else
|
|
{
|
|
filesize = download_request("http://www.techjawa.com/usbloadergx/boot.dol");
|
|
}
|
|
if (filesize > 0)
|
|
{
|
|
FILE * pfile;
|
|
pfile = fopen(dolpath, "wb");
|
|
u8 * blockbuffer = new unsigned char[BLOCKSIZE];
|
|
for (s32 i = 0; i < filesize; i += BLOCKSIZE)
|
|
{
|
|
usleep(100);
|
|
prTxt.SetTextf("%i%%", (100 * i / filesize) + 1);
|
|
if ((Settings.wsprompt == yes) && (Settings.widescreen))
|
|
{
|
|
progressbarImg.SetTile(80 * i / filesize);
|
|
}
|
|
else
|
|
{
|
|
progressbarImg.SetTile(100 * i / filesize);
|
|
}
|
|
msg2Txt.SetTextf("%iKB/%iKB", i / 1024, filesize / 1024);
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
fclose(pfile);
|
|
remove(dolpath);
|
|
failed = -1;
|
|
btn1.ResetState();
|
|
break;
|
|
}
|
|
|
|
u32 blksize;
|
|
blksize = (u32) (filesize - i);
|
|
if (blksize > BLOCKSIZE) blksize = BLOCKSIZE;
|
|
|
|
ret = network_read(blockbuffer, blksize);
|
|
if (ret != (s32) blksize)
|
|
{
|
|
failed = -1;
|
|
ret = -1;
|
|
fclose(pfile);
|
|
remove(dolpath);
|
|
break;
|
|
}
|
|
fwrite(blockbuffer, 1, blksize, pfile);
|
|
}
|
|
fclose(pfile);
|
|
delete blockbuffer;
|
|
if (!failed)
|
|
{
|
|
//remove old
|
|
if (CheckFile(dolpathsuccess))
|
|
{
|
|
remove(dolpathsuccess);
|
|
}
|
|
//rename new to old
|
|
rename(dolpath, dolpathsuccess);
|
|
|
|
if (choice == 2)
|
|
{
|
|
//get the icon.png and the meta.xml
|
|
char xmliconpath[150];
|
|
struct block file = downloadfile("http://www.techjawa.com/usbloadergx/meta.file");
|
|
if (file.data != NULL)
|
|
{
|
|
sprintf(xmliconpath, "%smeta.xml", Settings.update_path);
|
|
pfile = fopen(xmliconpath, "wb");
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
free(file.data);
|
|
}
|
|
file = downloadfile("http://www.techjawa.com/usbloadergx/icon.png");
|
|
if (file.data != NULL)
|
|
{
|
|
sprintf(xmliconpath, "%sicon.png", Settings.update_path);
|
|
pfile = fopen(xmliconpath, "wb");
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
free(file.data);
|
|
}
|
|
msgTxt.SetTextf("%s", tr( "Updating WiiTDB.zip" ));
|
|
char wiitdbpath[200];
|
|
char wiitdbpathtmp[200];
|
|
file = downloadfile(XMLurl);
|
|
if (file.data != NULL)
|
|
{
|
|
CreateSubfolder(Settings.titlestxt_path);
|
|
snprintf(wiitdbpath, sizeof(wiitdbpath), "%swiitdb_%s.zip",
|
|
Settings.titlestxt_path, game_partition);
|
|
snprintf(wiitdbpathtmp, sizeof(wiitdbpathtmp), "%swiitmp_%s.zip",
|
|
Settings.titlestxt_path, game_partition);
|
|
rename(wiitdbpath, wiitdbpathtmp);
|
|
pfile = fopen(wiitdbpath, "wb");
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
free(file.data);
|
|
CloseXMLDatabase();
|
|
if (OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language,
|
|
Settings.db_JPtoEN, true, Settings.titlesOverride == 1 ? true : false, true)) // open file, reload titles, keep in memory
|
|
{
|
|
remove(wiitdbpathtmp);
|
|
}
|
|
else
|
|
{
|
|
remove(wiitdbpath);
|
|
rename(wiitdbpathtmp, wiitdbpath);
|
|
OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language,
|
|
Settings.db_JPtoEN, true, Settings.titlesOverride == 1 ? true : false,
|
|
true); // open file, reload titles, keep in memory
|
|
}
|
|
}
|
|
msgTxt.SetTextf("%s", tr( "Updating Language Files:" ));
|
|
updateLanguageFiles();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
failed = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ret = -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WindowPrompt(tr( "No new updates." ), 0, tr( "OK" ));
|
|
ret = -1;
|
|
}
|
|
|
|
}
|
|
else if (updatemode == 2)
|
|
{
|
|
msgTxt.SetTextf("%s", tr( "Updating WiiTDB.zip" ));
|
|
char wiitdbpath[200];
|
|
char wiitdbpathtmp[200];
|
|
struct block file = downloadfile(XMLurl);
|
|
if (file.data != NULL)
|
|
{
|
|
CreateSubfolder(Settings.titlestxt_path);
|
|
snprintf(wiitdbpath, sizeof(wiitdbpath), "%swiitdb_%s.zip", Settings.titlestxt_path, game_partition);
|
|
snprintf(wiitdbpathtmp, sizeof(wiitdbpathtmp), "%swiitmp_%s.zip", Settings.titlestxt_path,
|
|
game_partition);
|
|
rename(wiitdbpath, wiitdbpathtmp);
|
|
FILE *pfile = fopen(wiitdbpath, "wb");
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
free(file.data);
|
|
CloseXMLDatabase();
|
|
if (OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true,
|
|
Settings.titlesOverride == 1 ? true : false, true)) // open file, reload titles, keep in memory
|
|
{
|
|
remove(wiitdbpathtmp);
|
|
}
|
|
else
|
|
{
|
|
remove(wiitdbpath);
|
|
rename(wiitdbpathtmp, wiitdbpath);
|
|
OpenXMLDatabase(Settings.titlestxt_path, Settings.db_language, Settings.db_JPtoEN, true,
|
|
Settings.titlesOverride == 1 ? true : false, true); // open file, reload titles, keep in memory
|
|
}
|
|
}
|
|
ret = 1;
|
|
}
|
|
else if (updatemode == 3)
|
|
{
|
|
|
|
msgTxt.SetTextf("%s", tr( "Updating Language Files..." ));
|
|
updateLanguageFiles();
|
|
ret = 1;
|
|
}
|
|
else
|
|
{
|
|
ret = -1;
|
|
}
|
|
}
|
|
|
|
CloseConnection();
|
|
|
|
if (!failed && ret >= 0 && updatemode == 1)
|
|
{
|
|
WindowPrompt(tr( "Restarting..." ), tr( "Successfully Updated thanks to www.techjawa.com" ), 0, 0, 0, 0, 150);
|
|
|
|
loadStub();
|
|
Set_Stub_Split(0x00010001, "UNEO");
|
|
Sys_BackToLoader();
|
|
}
|
|
else if (updatemode > 0 && ret > 0)
|
|
{
|
|
WindowPrompt(tr( "Successfully Updated" ), 0, tr( "OK" ));
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
|
|
if (failed != 0) return failed;
|
|
|
|
return 1;
|
|
}
|
|
|
|
#endif
|
|
|
|
int CodeDownload(const char *id)
|
|
{
|
|
int ret = 0;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, -10);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
char title[50];
|
|
sprintf(title, "%s", tr( "Code Download" ));
|
|
GuiText titleTxt(title, 26, Theme.prompttext);
|
|
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
titleTxt.SetPosition(0, 50);
|
|
char msg[50];
|
|
sprintf(msg, "%s", tr( "Initializing Network" ));
|
|
GuiText msgTxt(msg, 26, Theme.prompttext);
|
|
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
msgTxt.SetPosition(0, 140);
|
|
char msg2[50] = " ";
|
|
GuiText msg2Txt(msg2, 26, Theme.prompttext);
|
|
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
msg2Txt.SetPosition(0, 50);
|
|
|
|
GuiText btn1Txt(tr( "Cancel" ), 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn1(&btn1Img, &btn1Img, 2, 4, 0, -40, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
promptWindow.Append(&titleTxt);
|
|
promptWindow.Append(&msgTxt);
|
|
promptWindow.Append(&msg2Txt);
|
|
promptWindow.Append(&btn1);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
struct stat st;
|
|
if (stat(Settings.TxtCheatcodespath, &st) != 0)
|
|
{
|
|
if (!CreateSubfolder(Settings.TxtCheatcodespath))
|
|
{
|
|
WindowPrompt(tr( "Error !" ), tr( "Can't create directory" ), tr( "OK" ));
|
|
ret = -1;
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
while (!IsNetworkInit())
|
|
{
|
|
|
|
VIDEO_WaitVSync();
|
|
|
|
Initialize_Network();
|
|
|
|
if (IsNetworkInit())
|
|
{
|
|
msgTxt.SetText(GetNetworkIP());
|
|
}
|
|
else
|
|
{
|
|
msgTxt.SetText(tr( "Could not initialize network!" ));
|
|
}
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
{
|
|
ret = -1;
|
|
btn1.ResetState();
|
|
goto exit;
|
|
}
|
|
}
|
|
|
|
if (IsNetworkInit() && ret >= 0)
|
|
{
|
|
|
|
char txtpath[150];
|
|
snprintf(txtpath, sizeof(txtpath), "%s%s.txt", Settings.TxtCheatcodespath, id);
|
|
|
|
char codeurl[150];
|
|
snprintf(codeurl, sizeof(codeurl), "http://geckocodes.org/codes/R/%s.txt", id);
|
|
|
|
struct block file = downloadfile(codeurl);
|
|
|
|
if (file.size == 333 || file.size == 216 || file.size == 284)
|
|
{
|
|
strcat(codeurl, tr( " is not on the server." ));
|
|
|
|
WindowPrompt(tr( "Error" ), codeurl, tr( "OK" ));
|
|
ret = -1;
|
|
goto exit;
|
|
}
|
|
|
|
if (file.data != NULL)
|
|
{
|
|
|
|
FILE * pfile;
|
|
pfile = fopen(txtpath, "wb");
|
|
fwrite(file.data, 1, file.size, pfile);
|
|
fclose(pfile);
|
|
free(file.data);
|
|
ret = 1;
|
|
strcat(
|
|
txtpath,
|
|
tr( " has been Saved. The text has not been verified. Some of the code may not work right with each other. If you experience trouble, open the text in a real text editor for more information." ));
|
|
|
|
WindowPrompt(0, txtpath, tr( "OK" ));
|
|
}
|
|
else
|
|
{
|
|
strcat(codeurl, tr( " could not be downloaded." ));
|
|
|
|
WindowPrompt(tr( "Error" ), codeurl, tr( "OK" ));
|
|
ret = -1;
|
|
}
|
|
|
|
CloseConnection();
|
|
}
|
|
exit: promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
|
|
return ret;
|
|
}
|
|
|
|
char * GetMissingFiles()
|
|
{
|
|
return (char *) missingFiles;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* HBCWindowPrompt
|
|
*
|
|
* Displays a prompt window to user, with information, an error message, or
|
|
* presenting a user with a choice of up to 2 Buttons.
|
|
*
|
|
***************************************************************************/
|
|
/* <name>
|
|
<coder>
|
|
<version>
|
|
<release_date>
|
|
<short_description>
|
|
<long_description>
|
|
SD:/APPS/FTPII/ICON.PNG*/
|
|
|
|
int HBCWindowPrompt(const char *name, const char *coder, const char *version, const char *release_date,
|
|
const char *long_description, const char *iconPath, u64 filesize)
|
|
{
|
|
int choice = -1;
|
|
|
|
GuiWindow promptWindow(472, 320);
|
|
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
|
|
promptWindow.SetPosition(0, 6);
|
|
|
|
GuiTrigger trigA;
|
|
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
|
|
GuiTrigger trigB;
|
|
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
|
GuiTrigger trigU;
|
|
trigU.SetButtonOnlyTrigger(-1, WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP, PAD_BUTTON_UP);
|
|
GuiTrigger trigD;
|
|
trigD.SetButtonOnlyTrigger(-1, WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN, PAD_BUTTON_DOWN);
|
|
|
|
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, Settings.sfxvolume);
|
|
// because destroy GuiSound must wait while sound playing is finished, we use a global sound
|
|
if (!btnClick2) btnClick2 = new GuiSound(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
// GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, Settings.sfxvolume);
|
|
|
|
GuiImageData btnOutline(Resources::GetFile("button_dialogue_box.png"), Resources::GetFileSize("button_dialogue_box.png"));
|
|
GuiImageData dialogBox(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
GuiImageData whiteBox(Resources::GetFile("bg_options.png"), Resources::GetFileSize("bg_options.png"));
|
|
|
|
GuiImageData scrollbar(Resources::GetFile("scrollbar.png"), Resources::GetFileSize("scrollbar.png"));
|
|
GuiImage scrollbarImg(&scrollbar);
|
|
scrollbarImg.SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
|
|
scrollbarImg.SetPosition(-40, 114);
|
|
scrollbarImg.SetSkew(0, 0, 0, 0, 0, -120, 0, -120);
|
|
|
|
GuiImageData arrowDown(Resources::GetFile("scrollbar_arrowdown.png"), Resources::GetFileSize("scrollbar_arrowdown.png"));
|
|
GuiImage arrowDownImg(&arrowDown);
|
|
arrowDownImg.SetScale(.8);
|
|
|
|
GuiImageData arrowUp(Resources::GetFile("scrollbar_arrowup.png"), Resources::GetFileSize("scrollbar_arrowup.png"));
|
|
GuiImage arrowUpImg(&arrowUp);
|
|
arrowUpImg.SetScale(.8);
|
|
|
|
GuiButton arrowUpBtn(arrowUpImg.GetWidth(), arrowUpImg.GetHeight());
|
|
arrowUpBtn.SetImage(&arrowUpImg);
|
|
arrowUpBtn.SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
|
|
arrowUpBtn.SetPosition(-25, 91);
|
|
arrowUpBtn.SetTrigger(&trigA);
|
|
arrowUpBtn.SetTrigger(&trigU);
|
|
arrowUpBtn.SetEffectOnOver(EFFECT_SCALE, 50, 130);
|
|
arrowUpBtn.SetSoundClick(btnClick2);
|
|
|
|
GuiButton arrowDownBtn(arrowDownImg.GetWidth(), arrowDownImg.GetHeight());
|
|
arrowDownBtn.SetImage(&arrowDownImg);
|
|
arrowDownBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
arrowDownBtn.SetPosition(-25, -27);
|
|
arrowDownBtn.SetTrigger(&trigA);
|
|
arrowDownBtn.SetTrigger(&trigD);
|
|
arrowDownBtn.SetEffectOnOver(EFFECT_SCALE, 50, 130);
|
|
arrowDownBtn.SetSoundClick(btnClick2);
|
|
|
|
GuiImageData *iconData = NULL;
|
|
GuiImage *iconImg = NULL;
|
|
|
|
char imgPath[150];
|
|
snprintf(imgPath, sizeof(imgPath), "%s", iconPath);
|
|
|
|
bool iconExist = CheckFile(imgPath);
|
|
if (iconExist)
|
|
{
|
|
iconData = new GuiImageData(imgPath);
|
|
if(!iconData->GetImage())
|
|
{
|
|
delete iconData;
|
|
iconData = new GuiImageData(Resources::GetFile("dialogue_box.png"), Resources::GetFileSize("dialogue_box.png"));
|
|
}
|
|
iconImg = new GuiImage(iconData);
|
|
iconImg->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
iconImg->SetPosition(45, 10);
|
|
}
|
|
|
|
GuiImage dialogBoxImg(&dialogBox);
|
|
dialogBoxImg.SetSkew(0, -80, 0, -80, 0, 50, 0, 50);
|
|
|
|
GuiImage whiteBoxImg(&whiteBox);
|
|
whiteBoxImg.SetPosition(0, 110);
|
|
whiteBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
whiteBoxImg.SetSkew(0, 0, 0, 0, 0, -120, 0, -120);
|
|
/*if (Settings.wsprompt == yes){
|
|
dialogBoxImg.SetWidescreen(Settings.widescreen);
|
|
}*/
|
|
|
|
char tmp[510];
|
|
|
|
GuiText nameTxt(name, 30, Theme.prompttext);
|
|
nameTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
|
|
nameTxt.SetPosition(0, -15);
|
|
nameTxt.SetMaxWidth(430, SCROLL_HORIZONTAL);
|
|
|
|
if (strcmp(coder, "")) snprintf(tmp, sizeof(tmp), tr( "Coded by: %s" ), coder);
|
|
GuiText coderTxt(tmp, 16, Theme.prompttext);
|
|
coderTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
coderTxt.SetPosition(180, 30);
|
|
coderTxt.SetMaxWidth(280);
|
|
|
|
if (strcmp(version, "")) snprintf(tmp, sizeof(tmp), tr( "Version: %s" ), version);
|
|
GuiText versionTxt(tmp, 16, Theme.prompttext);
|
|
versionTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
versionTxt.SetPosition(40, 65);
|
|
versionTxt.SetMaxWidth(430);
|
|
|
|
//if (release_date)
|
|
//snprintf(tmp, sizeof(tmp), tr("Released: %s"),release_date);
|
|
GuiText release_dateTxt(release_date, 16, Theme.prompttext);
|
|
release_dateTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
release_dateTxt.SetPosition(40, 85);
|
|
release_dateTxt.SetMaxWidth(430);
|
|
|
|
int pagesize = 6;
|
|
Text long_descriptionTxt(long_description, 20, Theme.prompttext);
|
|
long_descriptionTxt.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
|
|
long_descriptionTxt.SetPosition(46, 117);
|
|
long_descriptionTxt.SetMaxWidth(360);
|
|
long_descriptionTxt.SetLinesToDraw(pagesize);
|
|
long_descriptionTxt.Refresh();
|
|
|
|
//convert filesize from u64 to char and put unit of measurement after it
|
|
char temp2[7];
|
|
char filesizeCH[15];
|
|
f32 sizeAdjusted;
|
|
if (filesize <= 1024.0)
|
|
{
|
|
sizeAdjusted = filesize;
|
|
snprintf(temp2, sizeof(temp2), "%.2f", sizeAdjusted);
|
|
snprintf(filesizeCH, sizeof(filesizeCH), "%s B", temp2);
|
|
|
|
}
|
|
if (filesize > 1024.0)
|
|
{
|
|
sizeAdjusted = filesize / 1024.0;
|
|
snprintf(temp2, sizeof(temp2), "%.2f", sizeAdjusted);
|
|
snprintf(filesizeCH, sizeof(filesizeCH), "%s KB", temp2);
|
|
|
|
}
|
|
if (filesize > 1048576.0)
|
|
{
|
|
sizeAdjusted = filesize / 1048576.0;
|
|
snprintf(temp2, sizeof(temp2), "%.2f", sizeAdjusted);
|
|
snprintf(filesizeCH, sizeof(filesizeCH), "%s MB", temp2);
|
|
|
|
}
|
|
GuiText filesizeTxt(filesizeCH, 16, Theme.prompttext);
|
|
filesizeTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
|
|
filesizeTxt.SetPosition(-40, 12);
|
|
|
|
GuiText btn1Txt(tr( "Load" ), 22, Theme.prompttext);
|
|
GuiImage btn1Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn1Txt.SetWidescreen(Settings.widescreen);
|
|
btn1Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
|
|
GuiButton btn1(&btn1Img, &btn1Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn1.SetLabel(&btn1Txt);
|
|
btn1.SetState(STATE_SELECTED);
|
|
|
|
GuiText btn2Txt(tr( "Back" ), 22, Theme.prompttext);
|
|
GuiImage btn2Img(&btnOutline);
|
|
if (Settings.wsprompt == yes)
|
|
{
|
|
btn2Txt.SetWidescreen(Settings.widescreen);
|
|
btn2Img.SetWidescreen(Settings.widescreen);
|
|
}
|
|
GuiButton btn2(&btn2Img, &btn2Img, 0, 3, 0, 0, &trigA, &btnSoundOver, btnClick2, 1);
|
|
btn2.SetLabel(&btn2Txt);
|
|
btn2.SetTrigger(&trigB);
|
|
|
|
btn1.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
|
btn1.SetPosition(40, 2);
|
|
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
|
|
btn2.SetPosition(-40, 2);
|
|
|
|
GuiTrigger trigZ;
|
|
trigZ.SetButtonOnlyTrigger(-1, WPAD_NUNCHUK_BUTTON_Z | WPAD_CLASSIC_BUTTON_ZL, PAD_TRIGGER_Z);
|
|
|
|
GuiButton screenShotBtn(0, 0);
|
|
screenShotBtn.SetPosition(0, 0);
|
|
screenShotBtn.SetTrigger(&trigZ);
|
|
promptWindow.Append(&screenShotBtn);
|
|
|
|
promptWindow.Append(&dialogBoxImg);
|
|
if (strcmp(long_description, "")) promptWindow.Append(&whiteBoxImg);
|
|
if (strcmp(long_description, "")) promptWindow.Append(&scrollbarImg);
|
|
if (strcmp(long_description, "")) promptWindow.Append(&arrowDownBtn);
|
|
if (strcmp(long_description, "")) promptWindow.Append(&arrowUpBtn);
|
|
|
|
if (strcmp(name, "")) promptWindow.Append(&nameTxt);
|
|
if (strcmp(version, "")) promptWindow.Append(&versionTxt);
|
|
if (strcmp(coder, "")) promptWindow.Append(&coderTxt);
|
|
if (strcmp(release_date, "")) promptWindow.Append(&release_dateTxt);
|
|
if (strcmp(long_description, "")) promptWindow.Append(&long_descriptionTxt);
|
|
promptWindow.Append(&filesizeTxt);
|
|
if (iconExist) promptWindow.Append(iconImg);
|
|
promptWindow.Append(&btn1);
|
|
promptWindow.Append(&btn2);
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
|
|
HaltGui();
|
|
mainWindow->SetState(STATE_DISABLED);
|
|
mainWindow->Append(&promptWindow);
|
|
mainWindow->ChangeFocus(&promptWindow);
|
|
ResumeGui();
|
|
|
|
while (choice == -1)
|
|
{
|
|
VIDEO_WaitVSync();
|
|
|
|
if (shutdown == 1)
|
|
{
|
|
wiilight(0);
|
|
Sys_Shutdown();
|
|
}
|
|
else if (reset == 1)
|
|
{
|
|
wiilight(0);
|
|
Sys_Reboot();
|
|
}
|
|
|
|
if (btn1.GetState() == STATE_CLICKED)
|
|
choice = 1;
|
|
else if (btn2.GetState() == STATE_CLICKED)
|
|
choice = 0;
|
|
|
|
else if (screenShotBtn.GetState() == STATE_CLICKED)
|
|
{
|
|
gprintf("\n\tscreenShotBtn clicked");
|
|
screenShotBtn.ResetState();
|
|
ScreenShot();
|
|
gprintf("...It's easy, mmmmmmKay");
|
|
}
|
|
else if (arrowUpBtn.GetState() == STATE_CLICKED || arrowUpBtn.GetState() == STATE_HELD)
|
|
{
|
|
long_descriptionTxt.PreviousLine();
|
|
|
|
usleep(6000);
|
|
if (!((ButtonsHold() & WPAD_BUTTON_UP) || (ButtonsHold() & PAD_BUTTON_UP))) arrowUpBtn.ResetState();
|
|
}
|
|
else if (arrowDownBtn.GetState() == STATE_CLICKED || arrowDownBtn.GetState() == STATE_HELD)
|
|
{
|
|
long_descriptionTxt.NextLine();
|
|
|
|
usleep(60000);
|
|
if (!((ButtonsHold() & WPAD_BUTTON_DOWN) || (ButtonsHold() & PAD_BUTTON_DOWN))) arrowDownBtn.ResetState();
|
|
}
|
|
}
|
|
|
|
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_OUT, 50);
|
|
while (promptWindow.GetEffect() > 0)
|
|
usleep(50);
|
|
HaltGui();
|
|
mainWindow->Remove(&promptWindow);
|
|
mainWindow->SetState(STATE_DEFAULT);
|
|
ResumeGui();
|
|
return choice;
|
|
}
|
|
|