usbloadergx/source/menu.cpp

4081 lines
113 KiB
C++

/****************************************************************************
* libwiigui Template
* Tantric 2009
*
* menu.cpp
* Menu flow routines - handles all menu logic
***************************************************************************/
#include <gccore.h>
#include <ogcsys.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <wiiuse/wpad.h>
#include <fat.h>
#include <sdcard/wiisd_io.h>
#include <stdio.h> //CLOCK
#include <time.h> //CLOCK
#include <dirent.h>
#include "libwiigui/gui.h"
#include "menu.h"
#include "main.h"
#include "input.h"
#include "http.h"
#include "dns.h"
#include "partition.h"
#include "wbfs.h"
#include "utils.h"
#include "usbstorage.h"
#include "disc.h"
#include "filelist.h"
#include "wdvd.h"
#include "libwbfs/libwbfs.h"
#include "sys.h"
#include "patchcode.h"
#include "wpad.h"
#include "cfg.h"
#include "libwiigui/gui_customoptionbrowser.h"
#include "libwiigui/gui_gamebrowser.h"
#define MAX_CHARACTERS 38
static GuiImage * coverImg = NULL;
static GuiImageData * cover = NULL;
//char GamesHDD[320][14];
static struct discHdr *gameList = NULL;
static GuiImageData * pointer[4];
static GuiImage * bgImg = NULL;
static GuiButton * btnLogo = NULL;
static GuiImageData * background = NULL;
static char prozent[10] = "0%";
static char timet[50] = " ";
static GuiText prTxt(prozent, 26, (GXColor){0, 0, 0, 255});
static GuiText timeTxt(prozent, 26, (GXColor){0, 0, 0, 255});
static GuiText *GameIDTxt = NULL;
static GuiText *GameRegionTxt = NULL;
static GuiSound * bgMusic = NULL;
static GuiSound * creditsMusic = NULL;
static wbfs_t *hdd = NULL;
static u32 gameCnt = 0;
static s32 gameSelected = 0, gameStart = 0;
static GuiWindow * mainWindow = NULL;
static lwp_t guithread = LWP_THREAD_NULL;
static bool guiHalt = true;
static GuiImageData progressbar(progressbar_png);
static GuiImage progressbarImg(&progressbar);
static double progressDone = 0;
static double progressTotal = 1;
int godmode = 0;
int height = 224;
int width = 160;
static int startat = 0;
static int offset = 0, networkisinitialized = 0;
int vol = Settings.volume;
//downloadvariables
static char missingFiles[500][12]; //fixed
static int cntMissFiles = 0;
int direction = 0; // direction the gameprompt slides in
static char gameregion[7];
//power button fix
extern u8 shutdown;
//Wiilight stuff
static vu32 *_wiilight_reg = (u32*)0xCD0000C0;
void wiilight(int enable){ // Toggle wiilight (thanks Bool for wiilight source)
u32 val = (*_wiilight_reg&~0x20);
if(enable) val |= 0x20;
*_wiilight_reg=val;}
//Prototypes
int WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label);
static void HaltGui();
static void ResumeGui();
//libfat helper functions
int isSdInserted() { return __io_wiisd.isInserted(); }
//Initialise SD CARD
int SDCard_Init()
{
__io_wiisd.startup();
if (!isSdInserted()){
printf("No SD card inserted!");
return -1;
} if (!fatMountSimple ("SD", &__io_wiisd)){
printf("Failed to mount front SD card!");
return -1;
}
return 1;
}
void SDCARD_deInit()
{
//First unmount all the devs...
fatUnmount ("SD");
//...and then shutdown em!
__io_wiisd.shutdown();
}
bool findfile(const char * filename, const char * path)
{
DIR *dir;
struct dirent *file;
dir = opendir(path);
char temp[11];
while ((file = readdir(dir)))
{
snprintf(temp,sizeof(temp),"%s",file->d_name);
if (!strncmpi(temp,filename,11))
{
//WindowPrompt(path, filename,"go" ,0);
closedir(dir);
return true;
}
}
closedir(dir);
return false;
}
/****************************************************************************
* ResumeGui
*
* Signals the GUI thread to start, and resumes the thread. This is called
* after finishing the removal/insertion of new elements, and after initial
* GUI setup.
***************************************************************************/
static void
ResumeGui()
{
guiHalt = false;
LWP_ResumeThread (guithread);
}
/****************************************************************************
* HaltGui
*
* Signals the GUI thread to stop, and waits for GUI thread to stop
* This is necessary whenever removing/inserting new elements into the GUI.
* This eliminates the possibility that the GUI is in the middle of accessing
* an element that is being changed.
***************************************************************************/
static void
HaltGui()
{
guiHalt = true;
// wait for thread to finish
while(!LWP_ThreadIsSuspended(guithread))
usleep(50);
}
/****************************************************************************
* WindowCredits
* Display credits
***************************************************************************/
static void WindowCredits(void * ptr)
{
int angle = 0;
if(btnLogo->GetState() != STATE_CLICKED) {
return;
}
bgMusic->Stop();
creditsMusic = new GuiSound(credits_music_ogg, credits_music_ogg_size, SOUND_OGG, 40);
creditsMusic->SetVolume(40);
creditsMusic->SetLoop(1);
creditsMusic->Play();
btnLogo->ResetState();
bool exit = false;
int i = 0;
int y = 95;
GuiWindow creditsWindow(screenwidth,screenheight);
GuiWindow creditsWindowBox(580,448);
creditsWindowBox.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
GuiImageData creditsBox(credits_bg_png);
GuiImage creditsBoxImg(&creditsBox);
creditsBoxImg.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
creditsWindowBox.Append(&creditsBoxImg);
GuiImageData star(little_star_png);
GuiImage starImg(&star);
starImg.SetWidescreen(CFG.widescreen); //added
starImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
starImg.SetPosition(500,335);
int numEntries = 15;
GuiText * txt[numEntries];
txt[i] = new GuiText("Official Site: http://code.google.com/p/usbloader-gui/", 20, (GXColor){255, 255, 255, 255});
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y); i++; y+=26;
txt[i]->SetPresets(22, (GXColor){255, 255, 255, 255}, 0,
FTGX_JUSTIFY_LEFT | FTGX_ALIGN_TOP, ALIGN_LEFT, ALIGN_TOP);
txt[i] = new GuiText("Coding:");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(100,y);
i++;
txt[i] = new GuiText("dimok");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=22;
txt[i] = new GuiText("nIxx");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=22;
txt[i] = new GuiText("hungyip84");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=22;
txt[i] = new GuiText("giantpune");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=24;
txt[i] = new GuiText("Design:");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(100,y);
i++;
txt[i] = new GuiText("cyrex");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=22;
txt[i] = new GuiText("NeoRame");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=22;
txt[i] = new GuiText("WiiShizza");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=24;
txt[i] = new GuiText("Ocarina & Vidpatch thanks to:");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(100,y);
i++;
y+=22;
txt[i] = new GuiText("Fishears & WiiPower");
txt[i]->SetAlignment(ALIGN_LEFT, ALIGN_TOP); txt[i]->SetPosition(320,y);
i++;
y+=26;
txt[i] = new GuiText("Special thanks to Tantric for libwiigui");
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y);
i++;
y+=22;
txt[i] = new GuiText("and to Waninkoko & Kwiirk for the USB Loader ");
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y);
i++;
y+=22;
txt[i] = new GuiText("and releasing the source code ;)");
txt[i]->SetAlignment(ALIGN_CENTRE, ALIGN_TOP); txt[i]->SetPosition(0,y);
i++;
y+=22;
for(i=0; i < numEntries; i++)
creditsWindowBox.Append(txt[i]);
creditsWindow.Append(&creditsWindowBox);
creditsWindow.Append(&starImg);
while(!exit)
{
creditsWindow.Draw();
angle ++;
angle = int(angle) % 360;
usleep(12000);
starImg.SetAngle(angle);
for(i=3; i >= 0; i--)
{
#ifdef HW_RVL
if(userInput[i].wpad.ir.valid)
Menu_DrawImg(userInput[i].wpad.ir.x-48, userInput[i].wpad.ir.y-48,
96, 96, pointer[i]->GetImage(), userInput[i].wpad.ir.angle, CFG.widescreen? 0.8 : 1, 1, 255);
if(Settings.rumble == RumbleOn){
DoRumble(i);
}
#endif
}
Menu_Render();
for(i=0; i < 4; i++)
{
if(userInput[i].wpad.btns_d || userInput[i].pad.btns_d)
exit = true;
}
}
// clear buttons pressed
for(i=0; i < 4; i++)
{
userInput[i].wpad.btns_d = 0;
userInput[i].pad.btns_d = 0;
}
creditsMusic->Stop();
for(i=0; i < numEntries; i++)
delete txt[i];
delete creditsMusic;
bgMusic->SetLoop(1);
bgMusic->Play();
}
/****************************************************************************
* WiiMenuWindowPrompt
* Display Menu WindowPrompt
***************************************************************************/
int
WiiMenuWindowPrompt(const char *title, const char *btn1Label, const char *btn2Label, const char *btn3Label)
{
int choice = -1;
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_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);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt(title, 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,55);
GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn1.SetPosition(-50, -120);
btn1.SetImage(&btn1Img);
btn1.SetLabel(&btn1Txt);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn2Img(&btnOutline);
GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight());
btn2.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
btn2.SetPosition(50, -120);
btn2.SetLabel(&btn2Txt);
btn2.SetImage(&btn2Img);
btn2.SetSoundOver(&btnSoundOver);
btn2.SetSoundClick(&btnClick);
btn2.SetTrigger(&trigA);
btn2.SetEffectGrow();
GuiText btn3Txt(btn3Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn3Img(&btnOutline);
GuiButton btn3(btnOutline.GetWidth(), btnOutline.GetHeight());
btn3.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn3.SetPosition(0, -65);
btn3.SetLabel(&btn3Txt);
btn3.SetImage(&btn3Img);
btn3.SetSoundOver(&btnSoundOver);
btn3.SetSoundClick(&btnClick);
btn3.SetTrigger(&trigB);
btn3.SetTrigger(&trigA);
btn3.SetEffectGrow();
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&btn1);
promptWindow.Append(&btn2);
promptWindow.Append(&btn3);
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(btn1.GetState() == STATE_CLICKED) {
choice = 1;
}
else if(btn2.GetState() == STATE_CLICKED) {
choice = 2;
}
else if(btn3.GetState() == STATE_CLICKED) {
choice = 0;
}
}
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;
}
/****************************************************************************
* WindowPrompt
*
* Displays a prompt window to user, with information, an error message, or
* presenting a user with a choice
***************************************************************************/
int
WindowPrompt(const char *title, const char *msg, const char *btn1Label, const char *btn2Label)
{
int choice = -1;
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_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);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt(title, 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,55);
GuiText msgTxt(msg, 22, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msgTxt.SetPosition(0,-40);
msgTxt.SetMaxWidth(430);
GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
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.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn2Img(&btnOutline);
GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight());
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn2.SetPosition(-40, -45);
btn2.SetLabel(&btn2Txt);
btn2.SetImage(&btn2Img);
btn2.SetSoundOver(&btnSoundOver);
btn2.SetSoundClick(&btnClick);
btn2.SetTrigger(&trigB);
btn2.SetTrigger(&trigA);
btn2.SetEffectGrow();
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&btn1);
if(btn2Label)
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();
}
if(btn1.GetState() == STATE_CLICKED) {
choice = 1;
}
else if(btn2.GetState() == STATE_CLICKED) {
choice = 0;
}
}
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;
}
/****************************************************************************
* DownloadWindowPrompt
* Display download
***************************************************************************/
int
DownloadWindowPrompt()
{
int choice = -1;
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_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);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt("Cover Download", 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,55);
GuiText btn1Txt("3D Covers", 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn1.SetPosition(-50, -120);
btn1.SetImage(&btn1Img);
btn1.SetLabel(&btn1Txt);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
GuiText btn2Txt("Normal Covers", 22, (GXColor){0, 0, 0, 255});
GuiImage btn2Img(&btnOutline);
GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight());
btn2.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
btn2.SetPosition(50, -120);
btn2.SetLabel(&btn2Txt);
btn2.SetImage(&btn2Img);
btn2.SetSoundOver(&btnSoundOver);
btn2.SetSoundClick(&btnClick);
btn2.SetTrigger(&trigA);
btn2.SetEffectGrow();
GuiText btn3Txt("Back", 22, (GXColor){0, 0, 0, 255});
GuiImage btn3Img(&btnOutline);
GuiButton btn3(btnOutline.GetWidth(), btnOutline.GetHeight());
btn3.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn3.SetPosition(-50, -65);
btn3.SetLabel(&btn3Txt);
btn3.SetImage(&btn3Img);
btn3.SetSoundOver(&btnSoundOver);
btn3.SetSoundClick(&btnClick);
btn3.SetTrigger(&trigB);
btn3.SetTrigger(&trigA);
btn3.SetEffectGrow();
GuiText btn4Txt("Disc Images", 22, (GXColor){0, 0, 0, 255});
GuiImage btn4Img(&btnOutline);
GuiButton btn4(btnOutline.GetWidth(), btnOutline.GetHeight());
btn4.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
btn4.SetPosition(50, -65);
btn4.SetLabel(&btn4Txt);
btn4.SetImage(&btn4Img);
btn4.SetSoundOver(&btnSoundOver);
btn4.SetSoundClick(&btnClick);
btn4.SetTrigger(&trigA);
btn4.SetEffectGrow();
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&btn1);
promptWindow.Append(&btn2);
promptWindow.Append(&btn3);
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(btn1.GetState() == STATE_CLICKED) {
choice = 2;
}
else if(btn2.GetState() == STATE_CLICKED) {
choice = 1;
}
else if(btn4.GetState() == STATE_CLICKED) {
choice = 3;
}
else if(btn3.GetState() == STATE_CLICKED) {
choice = 0;
}
}
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;
}
/****************************************************************************
* DeviceWait
***************************************************************************/
int
DeviceWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label)
{
int i = 30;
char timer[20];
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiImageData btnOutline(button_dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText timerTxt(timer, 26, (GXColor){0, 0, 0, 255});
timerTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
timerTxt.SetPosition(0,200);
GuiText titleTxt(title, 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,60);
GuiText msgTxt(msg, 22, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msgTxt.SetPosition(0,0);
msgTxt.SetMaxWidth(430);
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&timerTxt);
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
HaltGui();
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(&promptWindow);
mainWindow->ChangeFocus(&promptWindow);
ResumeGui();
s32 ret2;
while(i >= 0)
{
sprintf(timer, "%u s left", i);
timerTxt.SetText(timer);
VIDEO_WaitVSync();
if(Settings.cios == ios222) {
ret2 = IOS_ReloadIOS(222);
} else {
ret2 = IOS_ReloadIOS(249);
}
sleep(1);
ret2 = WBFS_Init(WBFS_DEVICE_USB);
if(ret2>=0)
break;
i--;
}
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 ret2;
}
/****************************************************************************
* 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;
char sizeText[15];
f32 size = 0.0;
char ID[4];
char IDFull[7];
char gameName[CFG.maxcharacters + 4];
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_dialogue_box_png);
GuiImageData imgLeft(startgame_arrow_left_png);
GuiImageData imgRight(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);
char imgPath[100];
if (CFG.widescreen)
snprintf(imgPath, sizeof(imgPath), "%swdialogue_box_startgame.png", CFG.theme_path);
else
snprintf(imgPath, sizeof(imgPath), "%sdialogue_box_startgame.png", CFG.theme_path);
GuiImageData dialogBox(imgPath, CFG.widescreen ? wdialogue_box_startgame_png : dialogue_box_startgame_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText msgTxt("", 22, (GXColor){50, 50, 50, 255});
GuiButton nameBtn(120,50);
nameBtn.SetLabel(&msgTxt);
nameBtn.SetLabelOver(&msgTxt);
nameBtn.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
nameBtn.SetPosition(0,-122);
nameBtn.SetSoundOver(&btnSoundOver);
nameBtn.SetSoundClick(&btnClick);
if (CFG.godmode == 1){
nameBtn.SetTrigger(&trigA);
nameBtn.SetEffectGrow();
}
GuiText sizeTxt("", 22, (GXColor){50, 50, 50, 255}); //TODO: get the size here
sizeTxt.SetAlignment(ALIGN_RIGHT, ALIGN_TOP);
sizeTxt.SetPosition(-60,70);
GuiImage diskImg;
diskImg.SetWidescreen(CFG.widescreen);
diskImg.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
diskImg.SetAngle(angle);
GuiButton btn1(160, 160);
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
btn1.SetPosition(0, -20);
btn1.SetImage(&diskImg);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
//btn1.SetEffectGrow(); just commented it out if anybody wants to use it again.
GuiText btn2Txt("Back", 22, (GXColor){0, 0, 0, 255});
GuiImage btn2Img(&btnOutline);
GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight());
//check if unlocked
if (CFG.godmode == 1)
{
btn2.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
btn2.SetPosition(40, -40);
}
else
{
btn2.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn2.SetPosition(0, -40);
}
btn2.SetLabel(&btn2Txt);
btn2.SetImage(&btn2Img);
btn2.SetSoundOver(&btnSoundOver);
btn2.SetSoundClick(&btnClick);
btn2.SetTrigger(&trigB);
btn2.SetTrigger(&trigA);
btn2.SetEffectGrow();
GuiText btn3Txt("Settings", 22, (GXColor){0, 0, 0, 255});
GuiImage btn3Img(&btnOutline);
GuiButton btn3(btnOutline.GetWidth(), btnOutline.GetHeight());
btn3.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn3.SetPosition(-50, -40);
btn3.SetLabel(&btn3Txt);
btn3.SetImage(&btn3Img);
btn3.SetSoundOver(&btnSoundOver);
btn3.SetSoundClick(&btnClick);
btn3.SetTrigger(&trigA);
btn3.SetEffectGrow();
GuiImage btnLeftImg(&imgLeft);
GuiButton btnLeft(imgLeft.GetWidth(), imgLeft.GetHeight());
btnLeft.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
btnLeft.SetPosition(20, 0);
btnLeft.SetImage(&btnLeftImg);
btnLeft.SetSoundOver(&btnSoundOver);
btnLeft.SetSoundClick(&btnClick);
btnLeft.SetTrigger(&trigA);
btnLeft.SetTrigger(&trigL);
btnLeft.SetTrigger(&trigMinus);
btnLeft.SetEffectGrow();
GuiImage btnRightImg(&imgRight);
GuiButton btnRight(imgRight.GetWidth(), imgRight.GetHeight());
btnRight.SetAlignment(ALIGN_RIGHT, ALIGN_MIDDLE);
btnRight.SetPosition(-20, 0);
btnRight.SetImage(&btnRightImg);
btnRight.SetSoundOver(&btnSoundOver);
btnRight.SetSoundClick(&btnClick);
btnRight.SetTrigger(&trigA);
btnRight.SetTrigger(&trigR);
btnRight.SetTrigger(&trigPlus);
btnRight.SetEffectGrow();
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&nameBtn);
promptWindow.Append(&sizeTxt);
promptWindow.Append(&btn1);
promptWindow.Append(&btn2);
promptWindow.Append(&btnLeft);
promptWindow.Append(&btnRight);
//check if unlocked
if (CFG.godmode == 1)
{
promptWindow.Append(&btn3);
}
short changed = 3;
GuiImageData * diskCover = NULL;
promptWindow.SetEffect(EFFECT_SLIDE_TOP | EFFECT_SLIDE_IN, 50);
while (changed)
{
if (changed == 1){
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_IN, 50);
}
if (changed == 2){
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_IN, 50);
}
changed = 0;
struct discHdr * header = &gameList[gameSelected];
WBFS_GameSize(header->id, &size);
snprintf(sizeText, sizeof(sizeText), "%.2fGB", size); //set size text
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]);
//set name
if (strlen(get_title(header)) < (u32)(CFG.maxcharacters + 3)) {
sprintf(gameName, "%s", get_title(header));
}
else {
strncpy(gameName, get_title(header), CFG.maxcharacters);
gameName[CFG.maxcharacters] = '\0';
strncat(gameName, "...", 3);
}
snprintf(imgPath,sizeof(imgPath),"%s%s.png", CFG.disc_path, ID); //changed to current id
if (diskCover)
delete diskCover;
diskCover = new GuiImageData(imgPath,0);
if (!diskCover->GetImage())
{
delete diskCover;
snprintf(imgPath, sizeof(imgPath), "%s%s.png", CFG.disc_path, IDFull); //changed to current full id
diskCover = new GuiImageData(imgPath, 0);
if (!diskCover->GetImage())
{
delete diskCover;
diskCover = new GuiImageData(imgPath,nodisc_png);
}
}
diskImg.SetImage(diskCover);
sizeTxt.SetText(sizeText);
msgTxt.SetText(gameName);
HaltGui();
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(&promptWindow);
mainWindow->ChangeFocus(&promptWindow);
ResumeGui();
float speedup = 1; //speedup increases while disc is selected
while(choice == -1)
{
VIDEO_WaitVSync();
//angle++;
angle = int(angle+speedup) % 360;
//disc speedup and slowdown
if (btn1.GetState() == STATE_SELECTED) { //if mouse over
if (speedup < 11) // speed up
{
speedup = (speedup+0.20);
}
}
else //if not mouse over
{
if (speedup > 1) {speedup = (speedup-0.05);} //slow down
}
if (speedup < 1)
{
speedup = 1;
}
diskImg.SetAngle(angle);
if(shutdown == 1) //for power button
{
wiilight(0);
Sys_Shutdown();
}
if(btn1.GetState() == STATE_CLICKED) { //boot
choice = 1;
SDCARD_deInit();
}
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(btnRight.GetState() == STATE_CLICKED) {
promptWindow.SetEffect(EFFECT_SLIDE_RIGHT | EFFECT_SLIDE_OUT, 50);
changed = 1;
gameSelected = (gameSelected + 1) % gameCnt;
btnRight.ResetState();
break;
}
else if(btnLeft.GetState() == STATE_CLICKED) {
promptWindow.SetEffect(EFFECT_SLIDE_LEFT | EFFECT_SLIDE_OUT, 50);
changed = 2;
gameSelected = (gameSelected - 1 + gameCnt) % gameCnt;
btnLeft.ResetState();
break;
}
}
while(promptWindow.GetEffect() > 0) usleep(50);
HaltGui();
mainWindow->Remove(&promptWindow);
ResumeGui();
}
delete diskCover;
return choice;
}
/****************************************************************************
* DiscWait
***************************************************************************/
int
DiscWait(const char *title, const char *msg, const char *btn1Label, const char *btn2Label)
{
int choice = -1;
u32 cover = 0;
s32 ret;
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_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);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt(title, 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,60);
GuiText msgTxt(msg, 22, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msgTxt.SetPosition(0,-40);
msgTxt.SetMaxWidth(430);
GuiText btn1Txt(btn1Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
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.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigB);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
GuiText btn2Txt(btn2Label, 22, (GXColor){0, 0, 0, 255});
GuiImage btn2Img(&btnOutline);
GuiButton btn2(btnOutline.GetWidth(), btnOutline.GetHeight());
btn2.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
btn2.SetPosition(-20, -25);
btn2.SetLabel(&btn2Txt);
btn2.SetImage(&btn2Img);
btn2.SetSoundOver(&btnSoundOver);
btn2.SetSoundClick(&btnClick);
btn2.SetTrigger(&trigA);
btn2.SetEffectGrow();
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&btn1);
if(btn2Label)
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(!(cover & 0x2))
{
VIDEO_WaitVSync();
if(btn1.GetState() == STATE_CLICKED) {
choice = 1;
break;
}
ret = WDVD_GetCoverStatus(&cover);
if (ret < 0)
return ret;
}
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 0;
}
/****************************************************************************
* 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(button_dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt(title, 26, (GXColor){0, 0, 0, 255});
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;
}
/****************************************************************************
* NetworkInit
***************************************************************************/
char * NetworkInitPromp(int choice2)
{
char myIP [16];
char * IP = 0;
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiText titleTxt("Initializing Network", 26, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,60);
char msg[20] = " ";
GuiText msgTxt(msg, 22, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
msgTxt.SetPosition(0,-40);
GuiText btn1Txt("Cancel", 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn1.SetPosition(0, -45);
btn1.SetLabel(&btn1Txt);
btn1.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
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();
VIDEO_WaitVSync();
while (!IP)
{
Net_Init(myIP);
IP = myIP;
if (IP) {
sprintf(msg, "IP: %s", IP);
msgTxt.SetText(msg);
cntMissFiles = 0;
u32 i = 0;
char filename[11];
// char filenameshort[10];
bool found1 = false;
bool found2 = false;
for (i = 0; i < gameCnt && cntMissFiles < 500; i++)
{
struct discHdr* header = &gameList[i];
if (choice2 != 3) {
snprintf (filename,sizeof(filename),"%c%c%c.png", header->id[0], header->id[1], header->id[2]);
found2 = findfile(filename, CFG.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, CFG.covers_path);
if (!found1 && !found2) //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, CFG.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,CFG.disc_path);
if (!found1 && !found2)
{
snprintf(missingFiles[cntMissFiles],11,"%s",filename);
cntMissFiles++;
}
}
}
break;
}
if(btn1.GetState() == STATE_CLICKED) { //pending: this should be inside the for loop
IP = 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 IP;
}
/****************************************************************************
* ShowProgress
*
* Updates the variables used by the progress window for drawing a progress
* bar. Also resumes the progress window thread if it is suspended.
***************************************************************************/
void
ShowProgress (s32 done, s32 total)
{
static time_t start;
static u32 expected;
f32 percent; //, size;
u32 d, h, m, s;
//first time
if (!done) {
start = time(0);
expected = 300;
}
//Elapsed time
d = time(0) - start;
if (done != total) {
//Expected time
if (d)
expected = (expected * 3 + d * total / done) / 4;
//Remaining time
d = (expected > d) ? (expected - d) : 0;
}
//Calculate time values
h = d / 3600;
m = (d / 60) % 60;
s = d % 60;
//Calculate percentage/size
percent = (done * 100.0) / total;
//size = (hdd->wbfs_sec_sz / GB_SIZE) * total;
progressTotal = total;
progressDone = done;
sprintf(prozent, "%0.2f%%", percent);
prTxt.SetText(prozent);
sprintf(timet,"Time left: %d:%02d:%02d",h,m,s);
timeTxt.SetText(timet);
progressbarImg.SetTile(100*progressDone/progressTotal);
}
/****************************************************************************
* 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.
***************************************************************************/
int
ProgressWindow(const char *title, const char *msg)
{
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiImageData btnOutline(button_dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiImageData progressbarOutline(progressbar_outline_png);
GuiImage progressbarOutlineImg(&progressbarOutline);
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(25, 40);
GuiImageData progressbarEmpty(progressbar_empty_png);
GuiImage progressbarEmptyImg(&progressbarEmpty);
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarEmptyImg.SetPosition(25, 40);
progressbarEmptyImg.SetTile(100);
GuiImageData progressbar(progressbar_png);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 40);
GuiText titleTxt(title, 26, (GXColor){70, 70, 10, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,60);
GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msgTxt.SetPosition(0,130);
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 40);
timeTxt.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
timeTxt.SetPosition(0,-30);
promptWindow.Append(&dialogBoxImg);
promptWindow.Append(&titleTxt);
promptWindow.Append(&msgTxt);
promptWindow.Append(&progressbarEmptyImg);
promptWindow.Append(&progressbarImg);
promptWindow.Append(&progressbarOutlineImg);
promptWindow.Append(&prTxt);
promptWindow.Append(&timeTxt);
HaltGui();
mainWindow->SetState(STATE_DISABLED);
mainWindow->Append(&promptWindow);
mainWindow->ChangeFocus(&promptWindow);
ResumeGui();
s32 ret;
ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, ShowProgress, ONLY_GAME_PARTITION, 0);
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);
ResumeGui();
if (ret < 0) {
return ret;
}
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.
***************************************************************************/
int
ProgressDownloadWindow(int choice2)
{
int i = 0, cntNotFound = 0;
// char filename[11];
GuiWindow promptWindow(472,320);
promptWindow.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
promptWindow.SetPosition(0, -10);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(button_dialogue_box_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiImageData dialogBox(dialogue_box_png);
GuiImage dialogBoxImg(&dialogBox);
GuiImageData progressbarOutline(progressbar_outline_png);
GuiImage progressbarOutlineImg(&progressbarOutline);
progressbarOutlineImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarOutlineImg.SetPosition(25, 40);
GuiImageData progressbarEmpty(progressbar_empty_png);
GuiImage progressbarEmptyImg(&progressbarEmpty);
progressbarEmptyImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarEmptyImg.SetPosition(25, 40);
progressbarEmptyImg.SetTile(100);
GuiImageData progressbar(progressbar_png);
progressbarImg.SetAlignment(ALIGN_LEFT, ALIGN_MIDDLE);
progressbarImg.SetPosition(25, 40);
GuiText titleTxt("Downloading file:", 26, (GXColor){70, 70, 10, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,60);
char msg[25] = " ";
GuiText msgTxt(msg, 26, (GXColor){0, 0, 0, 255});
msgTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msgTxt.SetPosition(0,130);
char msg2[15] = " ";
GuiText msg2Txt(msg2, 26, (GXColor){0, 0, 0, 255});
msg2Txt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
msg2Txt.SetPosition(0,100);
prTxt.SetAlignment(ALIGN_CENTRE, ALIGN_MIDDLE);
prTxt.SetPosition(0, 40);
GuiText btn1Txt("Cancel", 22, (GXColor){0, 0, 0, 255});
GuiImage btn1Img(&btnOutline);
GuiButton btn1(btnOutline.GetWidth(), btnOutline.GetHeight());
btn1.SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btn1.SetPosition(0, -45);
btn1.SetLabel(&btn1Txt);
btn1.SetImage(&btn1Img);
btn1.SetSoundOver(&btnSoundOver);
btn1.SetSoundClick(&btnClick);
btn1.SetTrigger(&trigA);
btn1.SetState(STATE_SELECTED);
btn1.SetEffectGrow();
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();
//check if directory exist and if not create one
struct stat st;
if(stat(CFG.covers_path, &st) != 0) {
char dircovers[100];
snprintf(dircovers,strlen(CFG.covers_path),"%s",CFG.covers_path);
if (mkdir(dircovers, 0777) == -1) {
WindowPrompt("Error:","Can't create directory","OK",0);
cntMissFiles = 0;
}
}
if(stat(CFG.disc_path,&st) != 0) {
char dirdiscs[100];
snprintf(dirdiscs,strlen(CFG.disc_path),"%s",CFG.disc_path);
if (mkdir(dirdiscs, 0777) == -1) {
WindowPrompt("Error:","Can't create directory","OK",0);
cntMissFiles = 0;
}
}
while (i < cntMissFiles) {
sprintf(prozent, "%i%%", 100*i/cntMissFiles);
prTxt.SetText(prozent);
progressbarImg.SetTile(100*i/cntMissFiles);
sprintf(msg, "%i file(s) left", cntMissFiles - i);
msgTxt.SetText(msg);
sprintf(msg2, "%s", missingFiles[i]);
msg2Txt.SetText(msg2);
//download boxart image
char imgPath[100];
char URLFile[100];
if (choice2 == 2) {
sprintf(URLFile,"http://www.theotherzone.com/wii/3d/176/248/%s",missingFiles[i]); // For 3D Covers
sprintf(imgPath,"%s%s", CFG.covers_path, missingFiles[i]);
}
if(choice2 == 3) {
sprintf(URLFile,"http://www.theotherzone.com/wii/diskart/160/160/%s",missingFiles[i]);
sprintf(imgPath,"%s%s", CFG.disc_path, missingFiles[i]);
}
if(choice2 == 1) {
sprintf(URLFile,"http://www.theotherzone.com/wii/resize/160/224/%s",missingFiles[i]);
sprintf(imgPath,"%s%s", CFG.covers_path, missingFiles[i]);
}
struct block file = downloadfile(URLFile);
if (file.size == 36864 || file.size <= 1024 || file.size == 7386 || file.data == NULL) {
cntNotFound++;
i++;
} else {
if(file.data != NULL)
{
// save png to sd card
FILE *pfile;
pfile = fopen(imgPath, "wb");
if (!pfile)
return -1;
fwrite(file.data,1,file.size,pfile);
fclose (pfile);
free(file.data);
}
i++;
}
if(btn1.GetState() == STATE_CLICKED) {
cntNotFound = cntMissFiles-i+cntNotFound;
break;
}
}
HaltGui();
mainWindow->Remove(&promptWindow);
mainWindow->SetState(STATE_DEFAULT);
ResumeGui();
if (cntNotFound != 0) {
return cntNotFound;
} else {
return 0;
}
}
/****************************************************************************
* UpdateGUI
*
* Primary thread to allow GUI to respond to state changes, and draws GUI
***************************************************************************/
static void *
UpdateGUI (void *arg)
{
while(1)
{
if(guiHalt)
{
LWP_SuspendThread(guithread);
}
else
{
mainWindow->Draw();
#ifdef HW_RVL
for(int i=3; i >= 0; i--) // so that player 1's cursor appears on top!
{
if(userInput[i].wpad.ir.valid)
Menu_DrawImg(userInput[i].wpad.ir.x-48, userInput[i].wpad.ir.y-48,
96, 96, pointer[i]->GetImage(), userInput[i].wpad.ir.angle, CFG.widescreen? 0.8 : 1, 1, 255);
if(Settings.rumble == RumbleOn)
{
DoRumble(i);
}
}
#endif
Menu_Render();
for(int i=0; i < 4; i++)
mainWindow->Update(&userInput[i]);
if(ExitRequested)
{
for(int a = 0; a < 255; a += 15)
{
mainWindow->Draw();
Menu_DrawRectangle(0,0,screenwidth,screenheight,(GXColor){0, 0, 0, a},1);
Menu_Render();
}
ExitApp();
}
}
}
return NULL;
}
/****************************************************************************
* InitGUIThread
*
* Startup GUI threads
***************************************************************************/
void
InitGUIThreads()
{
LWP_CreateThread (&guithread, UpdateGUI, NULL, NULL, 0, 70);
}
/****************************************************************************
* EntryCmp
***************************************************************************/
s32 __Menu_EntryCmp(const void *a, const void *b)
{
struct discHdr *hdr1 = (struct discHdr *)a;
struct discHdr *hdr2 = (struct discHdr *)b;
/* Compare strings */
return stricmp(get_title(hdr1), get_title(hdr2));
}
/****************************************************************************
* Get Gamelist
***************************************************************************/
s32 __Menu_GetEntries(void)
{
struct discHdr *buffer = NULL;
struct discHdr *buffer2 = NULL;
struct discHdr *header = NULL;
u32 cnt, len;
s32 ret;
/* Get list length */
ret = WBFS_GetCount(&cnt);
if (ret < 0)
return ret;
/* Buffer length */
len = sizeof(struct discHdr) * cnt;
/* Allocate memory */
buffer = (struct discHdr *)memalign(32, len);
if (!buffer)
return -1;
/* Clear buffer */
memset(buffer, 0, len);
/* Get header list */
ret = WBFS_GetHeaders(buffer, cnt, sizeof(struct discHdr));
if (ret < 0)
goto err;
if (CFG.parentalcontrol && !CFG.godmode)
{
u32 cnt2 = 0;
for (u32 i = 0; i < cnt; i++)
{
header = &buffer[i];
if (get_block(header) < CFG.parentalcontrol)
{
buffer2 = (discHdr *) realloc(buffer2, (cnt2+1) * sizeof(struct discHdr));
if (!buffer2)
{
free(buffer);
return -1;
}
memcpy((buffer2 + cnt2), (buffer + i), sizeof(struct discHdr));
cnt2++;
}
}
free(buffer);
buffer = buffer2;
buffer2 = NULL;
cnt = cnt2;
}
/* Sort entries */
qsort(buffer, cnt, sizeof(struct discHdr), __Menu_EntryCmp);
/* Free memory */
if (gameList)
free(gameList);
/* Set values */
gameList = buffer;
gameCnt = cnt;
/* Reset variables */
gameSelected = gameStart = 0;
return 0;
err:
/* Free memory */
if (buffer)
free(buffer);
return ret;
}
/****************************************************************************
* OnScreenKeyboard
*
* Opens an on-screen keyboard window, with the data entered being stored
* into the specified variable.
***************************************************************************/
static int OnScreenKeyboard(char * var, u16 maxlen)
{
int save = -1;
GuiKeyboard keyboard(var, maxlen);
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
GuiImageData btnOutline(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("OK", 22, (GXColor){0, 0, 0, 255});
GuiImage okBtnImg(&btnOutline);
GuiButton okBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
okBtn.SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
okBtn.SetPosition(25, -25);
okBtn.SetLabel(&okBtnTxt);
okBtn.SetImage(&okBtnImg);
okBtn.SetSoundOver(&btnSoundOver);
okBtn.SetSoundClick(&btnClick);
okBtn.SetTrigger(&trigA);
okBtn.SetEffectGrow();
GuiText cancelBtnTxt("Cancel", 22, (GXColor){0, 0, 0, 255});
GuiImage cancelBtnImg(&btnOutline);
GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
cancelBtn.SetAlignment(ALIGN_RIGHT, ALIGN_BOTTOM);
cancelBtn.SetPosition(-25, -25);
cancelBtn.SetLabel(&cancelBtnTxt);
cancelBtn.SetImage(&cancelBtnImg);
cancelBtn.SetSoundOver(&btnSoundOver);
cancelBtn.SetSoundClick(&btnClick);
cancelBtn.SetTrigger(&trigA);
cancelBtn.SetTrigger(&trigB);
cancelBtn.SetEffectGrow();
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();
return save;
}
/****************************************************************************
* MenuInstall
***************************************************************************/
static int MenuInstall()
{
int menu = MENU_NONE;
static struct discHdr headerdisc ATTRIBUTE_ALIGN(32);
if(Settings.cios == ios222) {
Disc_SetUSB(NULL, 1);
} else {
Disc_SetUSB(NULL, 0);
}
int ret, choice = 0;
char *name;
static char buffer[MAX_CHARACTERS + 4];
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiImageData battery(battery_png);
GuiImageData batteryRed(battery_red_png);
GuiImageData batteryBar(battery_bar_png);
#ifdef HW_RVL
int i = 0, level;
char txt[3];
GuiText * batteryTxt[4];
GuiImage * batteryImg[4];
GuiImage * batteryBarImg[4];
GuiButton * batteryBtn[4];
for(i=0; i < 4; i++)
{
if(i == 0)
sprintf(txt, "P%d", i+1);
else
sprintf(txt, "P%d", i+1);
batteryTxt[i] = new GuiText(txt, 22, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 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_TOP);
batteryBtn[i]->SetRumble(false);
batteryBtn[i]->SetAlpha(70);
}
batteryBtn[0]->SetPosition(THEME.battery1_x, THEME.battery1_y);
batteryBtn[1]->SetPosition(THEME.battery2_x, THEME.battery2_y);
batteryBtn[2]->SetPosition(THEME.battery3_x, THEME.battery3_y);
batteryBtn[3]->SetPosition(THEME.battery4_x, THEME.battery4_y);
#endif
HaltGui();
GuiWindow w(screenwidth, screenheight);
if (THEME.showBattery)
{
#ifdef HW_RVL
w.Append(batteryBtn[0]);
w.Append(batteryBtn[1]);
w.Append(batteryBtn[2]);
w.Append(batteryBtn[3]);
#endif
}
mainWindow->Append(&w);
ResumeGui();
while(menu == MENU_NONE)
{
VIDEO_WaitVSync ();
#ifdef HW_RVL
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;
batteryImg[i]->SetTile(level);
if(level == 0)
batteryBarImg[i]->SetImage(&batteryRed);
else
batteryBarImg[i]->SetImage(&batteryBar);
batteryBtn[i]->SetAlpha(255);
}
else // controller not connected
{
batteryImg[i]->SetTile(0);
batteryImg[i]->SetImage(&battery);
batteryBtn[i]->SetAlpha(70);
}
}
#endif
ret = DiscWait("Insert Disk","Waiting...","Cancel",0);
if (ret < 0) {
WindowPrompt ("Error reading Disc",0,"Back",0);
menu = MENU_DISCLIST;
break;
}
ret = Disc_Open();
if (ret < 0) {
WindowPrompt ("Could not open Disc",0,"Back",0);
menu = MENU_DISCLIST;
break;
}
ret = Disc_IsWii();
if (ret < 0) {
choice = WindowPrompt ("Not a Wii Disc","Insert a Wii Disc!","OK","Back");
if (choice == 1) {
menu = MENU_INSTALL;
break;
} else
menu = MENU_DISCLIST;
break;
}
Disc_ReadHeader(&headerdisc);
name = headerdisc.title;
if (strlen(name) < (22 + 3)) {
memset(buffer, 0, sizeof(buffer));
sprintf(name, "%s", name);
} else {
strncpy(buffer, name, MAX_CHARACTERS);
strncat(buffer, "...", 3);
sprintf(name, "%s", buffer);
}
ret = WBFS_CheckGame(headerdisc.id);
if (ret) {
WindowPrompt ("Game is already installed:",name,"Back",0);
menu = MENU_DISCLIST;
break;
}
hdd = GetHddInfo();
if (!hdd) {
WindowPrompt ("No HDD found!","Error!!","Back",0);
menu = MENU_DISCLIST;
break;
}
f32 freespace, used;
WBFS_DiskSpace(&used, &freespace);
u32 estimation = wbfs_estimate_disc(hdd, __WBFS_ReadDVD, NULL, ONLY_GAME_PARTITION);
f32 gamesize = ((f32) estimation)/1073741824;
char gametxt[50];
sprintf(gametxt, "Installing game %.2fGB:", gamesize);
if (gamesize > freespace) {
char errortxt[50];
sprintf(errortxt, "Game Size: %.2fGB, Free Space: %.2fGB", gamesize, freespace);
choice = WindowPrompt("Not enough free space!",errortxt,"Go on", "Return");
if (choice == 1) {
ret = ProgressWindow(gametxt, name);
if (ret != 0) {
WindowPrompt ("Install error!",0,"Back",0);
menu = MENU_DISCLIST;
break;
}
else {
__Menu_GetEntries(); //get the entries again
wiilight(1);
WindowPrompt ("Successfully installed:",name,"OK",0);
menu = MENU_DISCLIST;
wiilight(0);
break;
}
} else {
menu = MENU_DISCLIST;
break;
}
}
else {
ret = ProgressWindow(gametxt, name);
if (ret != 0) {
WindowPrompt ("Install error!",0,"Back",0);
menu = MENU_DISCLIST;
break;
} else {
__Menu_GetEntries(); //get the entries again
wiilight(1);
WindowPrompt ("Successfully installed:",name,"OK",0);
menu = MENU_DISCLIST;
wiilight(0);
break;
}
}
if (shutdown == 1)
Sys_Shutdown();
}
HaltGui();
#ifdef HW_RVL
for(i=0; i < 4; i++)
{
delete batteryTxt[i];
delete batteryImg[i];
delete batteryBarImg[i];
delete batteryBtn[i];
}
#endif
mainWindow->Remove(&w);
ResumeGui();
return menu;
}
/****************************************************************************
* MenuDiscList
***************************************************************************/
static int MenuDiscList()
{
int menu = MENU_NONE;
char imgPath[100];
f32 freespace, used, size = 0.0;
u32 nolist;
char text[MAX_CHARACTERS + 4]; //text2[20];
int choice = 0, selectedold = 100;
s32 ret;
//CLOCK
struct tm * timeinfo;
char theTime[80];
int counter = 0;
WBFS_DiskSpace(&used, &freespace);
if (!gameCnt) {
nolist = 1;
}
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
snprintf(imgPath, sizeof(imgPath), "%sbutton_install.png", CFG.theme_path);
GuiImageData btnInstall(imgPath, button_install_png);
snprintf(imgPath, sizeof(imgPath), "%sbutton_install_over.png", CFG.theme_path);
GuiImageData btnInstallOver(imgPath, button_install_over_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_button.png", CFG.theme_path);
GuiImageData btnSettings(imgPath, settings_button_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_button_over.png", CFG.theme_path);
GuiImageData btnSettingsOver(imgPath, settings_button_over_png);
snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff.png", CFG.theme_path);
GuiImageData btnpwroff(imgPath, wiimote_poweroff_png);
snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff_over.png", CFG.theme_path);
GuiImageData btnpwroffOver(imgPath, wiimote_poweroff_over_png);
snprintf(imgPath, sizeof(imgPath), "%smenu_button.png", CFG.theme_path);
GuiImageData btnhome(imgPath, menu_button_png);
snprintf(imgPath, sizeof(imgPath), "%smenu_button_over.png", CFG.theme_path);
GuiImageData btnhomeOver(imgPath, menu_button_over_png);
snprintf(imgPath, sizeof(imgPath), "%sSDcard.png", CFG.theme_path);
GuiImageData btnsdcard(imgPath, sdcard_png);
GuiImageData battery(battery_png);
GuiImageData batteryRed(battery_red_png);
GuiImageData batteryBar(battery_bar_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiTrigger trigHome;
trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
char spaceinfo[30];
sprintf(spaceinfo,"%.2fGB of %.2fGB free",freespace,(freespace+used));
GuiText usedSpaceTxt(spaceinfo, 18, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 255});
usedSpaceTxt.SetAlignment(THEME.hddInfoAlign, ALIGN_TOP);
usedSpaceTxt.SetPosition(THEME.hddInfo_x, THEME.hddInfo_y);
char GamesCnt[15];
sprintf(GamesCnt,"Games: %i",gameCnt);
GuiText gamecntTxt(GamesCnt, 18, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 255});
gamecntTxt.SetAlignment(THEME.gameCntAlign, ALIGN_TOP);
gamecntTxt.SetPosition(THEME.gameCnt_x,THEME.gameCnt_y);
GuiImageData tooltipLarge(tooltip_large_png);
GuiImage tooltipLargeImg(&tooltipLarge);
GuiText ttinstallTxt("Install a game", 22, (GXColor){0, 0, 0, 255}); //TOOLTIP DATA FOR INSTALL BUTTON
GuiImageData ttinstall(tooltip_medium_png);
GuiImage ttinstallImg(&ttinstall);
GuiImage installBtnImg(&btnInstall);
GuiImage installBtnImgOver(&btnInstallOver);
installBtnImg.SetWidescreen(CFG.widescreen); //added
installBtnImgOver.SetWidescreen(CFG.widescreen); //added
GuiButton installBtn(btnInstall.GetWidth(), btnInstall.GetHeight());
installBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
installBtn.SetPosition(THEME.install_x, THEME.install_y);
installBtn.SetImage(&installBtnImg);
installBtn.SetImageOver(&installBtnImgOver);
installBtn.SetSoundOver(&btnSoundOver);
installBtn.SetSoundClick(&btnClick);
installBtn.SetTrigger(&trigA);
installBtn.SetEffectGrow();
if (Settings.tooltips == TooltipsOn && THEME.showToolTip != 0)
installBtn.SetToolTip(&ttinstallImg,&ttinstallTxt,175,-30);
GuiText ttsettingsTxt("Settings", 22, (GXColor){0, 0, 0, 255}); //TOOLTIP DATA FOR SETTINGS BUTTON
GuiImageData ttsettings(tooltip_png);
GuiImage ttsettingsImg(&ttsettings);
GuiImage settingsBtnImg(&btnSettings);
settingsBtnImg.SetWidescreen(CFG.widescreen); //added
GuiImage settingsBtnImgOver(&btnSettingsOver);
settingsBtnImgOver.SetWidescreen(CFG.widescreen); //added
GuiButton settingsBtn(btnSettings.GetWidth(), btnSettings.GetHeight());
settingsBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
settingsBtn.SetPosition(THEME.setting_x, THEME.setting_y);
settingsBtn.SetImage(&settingsBtnImg);
settingsBtn.SetImageOver(&settingsBtnImgOver);
settingsBtn.SetSoundOver(&btnSoundOver);
settingsBtn.SetSoundClick(&btnClick);
settingsBtn.SetTrigger(&trigA);
settingsBtn.SetEffectGrow();
if (Settings.tooltips == TooltipsOn && THEME.showToolTip != 0)
settingsBtn.SetToolTip(&ttsettingsImg,&ttsettingsTxt,65,-30);
GuiText tthomeTxt("Back to HBC or Wii Menu", 22, (GXColor){0, 0, 0, 255}); //TOOLTIP DATA FOR HOME BUTTON
GuiImageData tthome(tooltip_large_png);
GuiImage tthomeImg(&tthome);
GuiImage homeBtnImg(&btnhome);
homeBtnImg.SetWidescreen(CFG.widescreen); //added
GuiImage homeBtnImgOver(&btnhomeOver);
homeBtnImgOver.SetWidescreen(CFG.widescreen); //added
GuiButton homeBtn(btnhome.GetWidth(), btnhome.GetHeight());
homeBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
homeBtn.SetPosition(THEME.home_x, THEME.home_y);
homeBtn.SetImage(&homeBtnImg);
homeBtn.SetImageOver(&homeBtnImgOver);
homeBtn.SetSoundOver(&btnSoundOver);
homeBtn.SetSoundClick(&btnClick);
homeBtn.SetTrigger(&trigA);
homeBtn.SetTrigger(&trigHome);
homeBtn.SetEffectGrow();
if (Settings.tooltips == TooltipsOn && THEME.showToolTip != 0)
homeBtn.SetToolTip(&tthomeImg,&tthomeTxt,15,-30);
GuiText ttpoweroffTxt("Power off the Wii", 22, (GXColor){0, 0, 0, 255}); //TOOLTIP DATA FOR POWER BUTTON
GuiImageData ttpoweroff(tooltip_medium_png);
GuiImage ttpoweroffImg(&ttpoweroff);
GuiImage poweroffBtnImg(&btnpwroff);
GuiImage poweroffBtnImgOver(&btnpwroffOver);
poweroffBtnImg.SetWidescreen(CFG.widescreen);
poweroffBtnImgOver.SetWidescreen(CFG.widescreen);
GuiButton poweroffBtn(btnpwroff.GetWidth(), btnpwroff.GetHeight());
poweroffBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
poweroffBtn.SetPosition(THEME.power_x, THEME.power_y);
poweroffBtn.SetImage(&poweroffBtnImg);
poweroffBtn.SetImageOver(&poweroffBtnImgOver);
poweroffBtn.SetSoundOver(&btnSoundOver);
poweroffBtn.SetSoundClick(&btnClick);
poweroffBtn.SetTrigger(&trigA);
poweroffBtn.SetEffectGrow();
if (Settings.tooltips == TooltipsOn && THEME.showToolTip != 0)
poweroffBtn.SetToolTip(&ttpoweroffImg,&ttpoweroffTxt,-10,-30);
GuiImage sdcardImg(&btnsdcard);
sdcardImg.SetWidescreen(CFG.widescreen);
GuiButton sdcardBtn(btnsdcard.GetWidth(), btnsdcard.GetHeight());
sdcardBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
sdcardBtn.SetPosition(THEME.sdcard_x, THEME.sdcard_y);
sdcardBtn.SetImage(&sdcardImg);
sdcardBtn.SetSoundOver(&btnSoundOver);
sdcardBtn.SetSoundClick(&btnClick);
sdcardBtn.SetTrigger(&trigA);
sdcardBtn.SetEffectGrow();
//Downloading Covers
GuiText ttDownloadTxt("Click to Download Covers", 20, (GXColor){0, 0, 0, 255}); //TOOLTIP DATA FOR DOWNLOAD
GuiImageData ttDownload(tooltip_large_png);
GuiImage ttDownloadImg(&ttDownload);
GuiButton DownloadBtn(160,224);
DownloadBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
DownloadBtn.SetPosition(THEME.cover_x,THEME.cover_y);//(20, 300);
DownloadBtn.SetSoundOver(&btnSoundOver);
if (CFG.godmode == 1){
if (Settings.tooltips == TooltipsOn && THEME.showToolTip != 0){
DownloadBtn.SetToolTip(&ttDownloadImg,&ttDownloadTxt,205,-30);
DownloadBtn.SetTrigger(&trigA);
}
}
#ifdef HW_RVL
int i = 0, level;
char txt[3];
GuiText * batteryTxt[4];
GuiImage * batteryImg[4];
GuiImage * batteryBarImg[4];
GuiButton * batteryBtn[4];
for(i=0; i < 4; i++)
{
if(i == 0)
sprintf(txt, "P%d", i+1);
else
sprintf(txt, "P%d", i+1);
batteryTxt[i] = new GuiText(txt, 22, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 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_TOP);
batteryBtn[i]->SetRumble(false);
batteryBtn[i]->SetAlpha(70);
}
batteryBtn[0]->SetPosition(THEME.battery1_x, THEME.battery1_y);
batteryBtn[1]->SetPosition(THEME.battery2_x, THEME.battery2_y);
batteryBtn[2]->SetPosition(THEME.battery3_x, THEME.battery3_y);
batteryBtn[3]->SetPosition(THEME.battery4_x, THEME.battery4_y);
#endif
GuiGameBrowser gameBrowser(THEME.selection_w, THEME.selection_h, gameList, gameCnt, CFG.theme_path, bg_options_png, startat, offset);
gameBrowser.SetPosition(THEME.selection_x, THEME.selection_y);
gameBrowser.SetAlignment(ALIGN_LEFT, ALIGN_CENTRE);
GuiText clockTime(theTime, 30, (GXColor){138, 138, 138, 255});
clockTime.SetAlignment(THEME.clockAlign, ALIGN_BOTTOM);
clockTime.SetPosition(THEME.clock_x, THEME.clock_y);
HaltGui();
GuiWindow w(screenwidth, screenheight);
if((Settings.hddinfo == HDDInfo && THEME.showHDD == -1) || THEME.showHDD == 1) //force show hdd info
{
w.Append(&usedSpaceTxt);
}
if((Settings.hddinfo == HDDInfo && THEME.showGameCnt == -1) || THEME.showGameCnt == 1) //force show game cnt info
{
w.Append(&gamecntTxt);
}
w.Append(&sdcardBtn);
w.Append(&poweroffBtn);
if (CFG.godmode)
w.Append(&installBtn);
w.Append(&homeBtn);
w.Append(&settingsBtn);
w.Append(&DownloadBtn);
if(Settings.hddinfo == Clock)
{
w.Append(&clockTime);
}
if (THEME.showBattery)
{
#ifdef HW_RVL
w.Append(batteryBtn[0]);
w.Append(batteryBtn[1]);
w.Append(batteryBtn[2]);
w.Append(batteryBtn[3]);
#endif
}
mainWindow->Append(&gameBrowser);
mainWindow->Append(&w);
ResumeGui();
while(menu == MENU_NONE)
{
VIDEO_WaitVSync ();
//CLOCK
if ((Settings.hddinfo == Clock)&&(counter % 2000 == 0)) {
time_t rawtime = time(0);
timeinfo = localtime (&rawtime);
strftime(theTime, sizeof(theTime), "%H:%M", timeinfo);
clockTime.SetText(theTime);
}
counter++;
#ifdef HW_RVL
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;
batteryImg[i]->SetTile(level);
if(level == 0)
batteryBarImg[i]->SetImage(&batteryRed);
else
batteryBarImg[i]->SetImage(&batteryBar);
batteryBtn[i]->SetAlpha(255);
}
else // controller not connected
{
batteryImg[i]->SetTile(0);
batteryImg[i]->SetImage(&battery);
batteryBtn[i]->SetAlpha(70);
}
}
#endif
if(shutdown == 1)
{
Sys_Shutdown();
}
if(poweroffBtn.GetState() == STATE_CLICKED)
{
choice = WindowPrompt ("Shutdown System","Are you sure?","Yes","No");
if(choice == 1)
{
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
Sys_Shutdown();
//exit(0);
} else {
poweroffBtn.ResetState();
gameBrowser.SetFocus(1);
}
}
else if(homeBtn.GetState() == STATE_CLICKED)
{
choice = WiiMenuWindowPrompt ("Exit USB ISO Loader ?","Wii Menu","Back to Loader","Back");
if(choice == 1)
{
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); // Back to System Menu
}
else if (choice == 2)
{
if (*(unsigned int*) 0x80001800) exit(0);
// Channel Version
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
//exit(0); //Back to HBC
} else {
homeBtn.ResetState();
gameBrowser.SetFocus(1);
}
}
else if(installBtn.GetState() == STATE_CLICKED)
{
choice = WindowPrompt ("Install a game?",0,"Yes","No");
if (choice == 1)
{
menu = MENU_INSTALL;
break;
}
else
{
installBtn.ResetState();
gameBrowser.SetFocus(1);
}
}
else if(sdcardBtn.GetState() == STATE_CLICKED)
{
__io_wiisd.shutdown();
__io_wiisd.startup();
break;
}
else if(DownloadBtn.GetState() == STATE_CLICKED)
{
choice = DownloadWindowPrompt(); // ask for download choice
if (choice != 0)
{
char * myIP;
int choice2 = choice;
myIP = NetworkInitPromp(choice2);
networkisinitialized = 1;
if( !myIP )
{
WindowPrompt("Network init error", 0, "ok",0);
netcheck = false;
}
else netcheck = true;
if (netcheck)
{
if (missingFiles != NULL && cntMissFiles > 0)
{
char tempCnt[40];
i = 0;
sprintf(tempCnt,"Missing %i files",cntMissFiles);
choice = WindowPrompt("Download Boxart image?",tempCnt,"Yes","No");
//WindowPrompt("Downloading","Please Wait Downloading Covers",0,0);
if (choice == 1)
{
ret = ProgressDownloadWindow(choice2);
if (ret == 0) {
WindowPrompt("Download finished",0,"OK",0);
} else {
sprintf(tempCnt,"%i files not found on the server!",ret);
WindowPrompt("Download finished",tempCnt,"OK",0);
}
}
}
else
{
WindowPrompt("No file missing!",0,"OK",0);
}
}
}
DownloadBtn.ResetState();
gameBrowser.SetFocus(1);
}//end download
else if(settingsBtn.GetState() == STATE_CLICKED)
{ startat = gameBrowser.GetSelectedOption();
offset = gameBrowser.GetOffset();
menu = MENU_SETTINGS;
break;
}
//Get selected game under cursor
int selectimg, promptnumber;
promptnumber = 0;
char ID[4];
char IDfull[7];
selectimg = gameBrowser.GetSelectedOption();
gameSelected = gameBrowser.GetClickedOption();
if (gameSelected > 0) //if click occured
selectimg = gameSelected;
if ((selectimg >= 0) && (selectimg < (s32) gameCnt))
{
if (selectimg != selectedold)
{
selectedold = selectimg;
struct discHdr *header = &gameList[selectimg];
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]);
w.Remove(&DownloadBtn);
w.Remove(coverImg);
if (GameIDTxt)
{
w.Remove(GameIDTxt);
delete GameIDTxt;
GameIDTxt = NULL;
}
if(GameRegionTxt)
{
w.Remove(GameRegionTxt);
delete GameRegionTxt;
GameRegionTxt = NULL;
}
switch(header->id[3])
{
case 'E':
sprintf(gameregion,"NTSC U");
break;
case 'J':
sprintf(gameregion,"NTSC J");
break;
case 'P':
case 'D':
case 'F':
case 'X':
case 'S':
case 'Y':
sprintf(gameregion," PAL ");
break;
}
//load game cover
if (cover)
{
delete cover;
cover = NULL;
}
snprintf(imgPath, sizeof(imgPath), "%s%s.png", CFG.covers_path, ID);
cover = new GuiImageData(imgPath,0); //load short id
if (!cover->GetImage()) //if could not load the short id image
{
delete cover;
snprintf(imgPath, sizeof(imgPath), "%s%s.png", CFG.covers_path, IDfull);
cover = new GuiImageData(imgPath, 0); //load full id image
if (!cover->GetImage())
{
delete cover;
snprintf(imgPath, sizeof(imgPath), "%snoimage.png", CFG.covers_path);
cover = new GuiImageData(imgPath, nocover_png); //load no image
}
}
if (coverImg)
{
delete coverImg;
coverImg = NULL;
}
coverImg = new GuiImage(cover);
coverImg->SetWidescreen(CFG.widescreen);
DownloadBtn.SetImage(coverImg);
w.Append(&DownloadBtn);
if ((Settings.sinfo == GameID) || (Settings.sinfo == Both)){
GameIDTxt = new GuiText(IDfull, 22, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 255});
GameIDTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
GameIDTxt->SetPosition(THEME.id_x,THEME.id_y);
GameIDTxt->SetEffect(EFFECT_FADE, 20);
w.Append(GameIDTxt);
}
if ((Settings.sinfo == GameRegion) || (Settings.sinfo == Both)){
GameRegionTxt = new GuiText(gameregion, 22, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 255});
GameRegionTxt->SetAlignment(ALIGN_LEFT, ALIGN_TOP);
GameRegionTxt->SetPosition(THEME.region_x, THEME.region_y);
GameRegionTxt->SetEffect(EFFECT_FADE, 20);
w.Append(GameRegionTxt);
}
}
}
if ((gameSelected >= 0) && (gameSelected < (s32)gameCnt))
{
struct discHdr *header = &gameList[gameSelected];
WBFS_GameSize(header->id, &size);
if (strlen(get_title(header)) < (MAX_CHARACTERS + 3)) {
sprintf(text, "%s", get_title(header));
}
else {
strncpy(text, get_title(header), MAX_CHARACTERS);
text[MAX_CHARACTERS] = '\0';
strncat(text, "...", 3);
}
bool returnHere = true;
while (returnHere)
{
returnHere = false;
wiilight(1);
choice = GameWindowPrompt();
header = &gameList[gameSelected]; //reset header
if(choice == 1)
{
wiilight(0);
int ios2 = 0;
switch(iosChoice)
{
case i249:
ios2 = 0;
break;
case i222:
ios2 = 1;
break;
default:
ios2 = 0;
break;
}
if(networkisinitialized == 1 || ios2 == 1 || Settings.cios == ios222) {
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
WDVD_Close();
USBStorage_Deinit();
if(ios2 == 1) {
IOS_ReloadIOS(222);
} else {
IOS_ReloadIOS(249);
}
ret = WBFS_Init(WBFS_DEVICE_USB);
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
ret = Disc_Init();
ret = WBFS_Open();
}
/* Set USB mode */
ret = Disc_SetUSB(header->id, ios2);
if (ret < 0) {
sprintf(text, "Error: %i", ret);
WindowPrompt(
"Failed to set USB:",
text,
"OK",0);
}
else {
/* Open disc */
ret = Disc_Open();
if (ret < 0) {
sprintf(text, "Error: %i", ret);
WindowPrompt(
"Failed to boot:",
text,
"OK",0);
}
else {
menu = MENU_EXIT;
}
}
}
else if (choice == 2)
{
wiilight(0);
if (GameSettings(header) == 1) //if deleted
{
menu = MENU_DISCLIST;
break;
}
returnHere = true;
}
else if (choice == 3) //&& (CFG.godmode == 1))
{
wiilight(0);
//enter new game title
char entered[40];
snprintf(entered, sizeof(entered), "%s", get_title(header));
entered[39] = '\0';
OnScreenKeyboard(entered, 40);
WBFS_RenameGame(header->id, entered);
__Menu_GetEntries();
menu = MENU_DISCLIST;
}
else if(choice == 0)
gameBrowser.SetFocus(1);
}
}
}
HaltGui();
#ifdef HW_RVL
for(i=0; i < 4; i++)
{
delete batteryTxt[i];
delete batteryImg[i];
delete batteryBarImg[i];
delete batteryBtn[i];
}
#endif
mainWindow->Remove(&gameBrowser);
mainWindow->Remove(&w);
ResumeGui();
return menu;
}
/****************************************************************************
* MenuFormat
***************************************************************************/
static int MenuFormat()
{
int menu = MENU_NONE;
char imgPath[100];
OptionList options;
partitionEntry partitions[MAX_PARTITIONS];
u32 cnt, sector_size, selected = 2000;
int choice, ret;
char text[ISFS_MAXPATH];
s32 ret2;
ret2 = Partition_GetEntries(partitions, &sector_size);
//create the partitionlist
for (cnt = 0; cnt < MAX_PARTITIONS; cnt++) {
partitionEntry *entry = &partitions[cnt];
/* Calculate size in gigabytes */
f32 size = entry->size * (sector_size / GB_SIZE);
if (size) {
sprintf(options.name[cnt], "Partition %d:", cnt+1);
sprintf (options.value[cnt],"%.2fGB", size);
} else {
sprintf(options.name[cnt], "Partition %d:", cnt+1);
sprintf (options.value[cnt],"(Can't be formated)");
}
}
options.length = cnt;
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
//btnClick.SetVolume(vol);
//btnSoundOver.SetVolume(vol);
snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff.png", CFG.theme_path);
GuiImageData btnpwroff(imgPath, wiimote_poweroff_png);
snprintf(imgPath, sizeof(imgPath), "%swiimote_poweroff_over.png", CFG.theme_path);
GuiImageData btnpwroffOver(imgPath, wiimote_poweroff_over_png);
snprintf(imgPath, sizeof(imgPath), "%smenu_button.png", CFG.theme_path);
GuiImageData btnhome(imgPath, menu_button_png);
snprintf(imgPath, sizeof(imgPath), "%smenu_button_over.png", CFG.theme_path);
GuiImageData btnhomeOver(imgPath, menu_button_over_png);
GuiImageData battery(battery_png);
GuiImageData batteryRed(battery_red_png);
GuiImageData batteryBar(battery_bar_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiTrigger trigHome;
trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
GuiText titleTxt("Select the Partition", 18, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(10,40);
GuiText titleTxt2("you want to format:", 18, (GXColor){0, 0, 0, 255});
titleTxt2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt2.SetPosition(20,60);
GuiImage poweroffBtnImg(&btnpwroff);
GuiImage poweroffBtnImgOver(&btnpwroffOver);
poweroffBtnImg.SetWidescreen(CFG.widescreen);
poweroffBtnImgOver.SetWidescreen(CFG.widescreen);
GuiButton poweroffBtn(btnpwroff.GetWidth(), btnpwroff.GetHeight());
poweroffBtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
poweroffBtn.SetPosition(THEME.power_x, THEME.power_y);
poweroffBtn.SetImage(&poweroffBtnImg);
poweroffBtn.SetImageOver(&poweroffBtnImgOver);
poweroffBtn.SetSoundOver(&btnSoundOver);
poweroffBtn.SetSoundClick(&btnClick);
poweroffBtn.SetTrigger(&trigA);
poweroffBtn.SetEffectGrow();
GuiImage exitBtnImg(&btnhome);
GuiImage exitBtnImgOver(&btnhomeOver);
exitBtnImg.SetWidescreen(CFG.widescreen);
exitBtnImgOver.SetWidescreen(CFG.widescreen);
GuiButton exitBtn(btnhome.GetWidth(), btnhome.GetHeight());
exitBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
exitBtn.SetPosition(240, 367);
exitBtn.SetImage(&exitBtnImg);
exitBtn.SetImageOver(&exitBtnImgOver);
exitBtn.SetSoundOver(&btnSoundOver);
exitBtn.SetSoundClick(&btnClick);
exitBtn.SetTrigger(&trigA);
exitBtn.SetTrigger(&trigHome);
exitBtn.SetEffectGrow();
#ifdef HW_RVL
int i = 0, level;
char txt[3];
GuiText * batteryTxt[4];
GuiImage * batteryImg[4];
GuiImage * batteryBarImg[4];
GuiButton * batteryBtn[4];
for(i=0; i < 4; i++)
{
if(i == 0)
sprintf(txt, "P%d", i+1);
else
sprintf(txt, "P%d", i+1);
batteryTxt[i] = new GuiText(txt, 22, (GXColor){THEME.info_r, THEME.info_g, THEME.info_b, 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_TOP);
batteryBtn[i]->SetRumble(false);
batteryBtn[i]->SetAlpha(70);
}
batteryBtn[0]->SetPosition(THEME.battery1_x, THEME.battery1_y);
batteryBtn[1]->SetPosition(THEME.battery2_x, THEME.battery2_y);
batteryBtn[2]->SetPosition(THEME.battery3_x, THEME.battery3_y);
batteryBtn[3]->SetPosition(THEME.battery4_x, THEME.battery4_y);
#endif
GuiOptionBrowser optionBrowser(THEME.selection_w, THEME.selection_h, &options, CFG.theme_path, bg_options_png, 1, 0);
optionBrowser.SetPosition(THEME.selection_x, THEME.selection_y);
optionBrowser.SetAlignment(ALIGN_LEFT, ALIGN_CENTRE);
HaltGui();
GuiWindow w(screenwidth, screenheight);
w.Append(&titleTxt);
w.Append(&titleTxt2);
w.Append(&poweroffBtn);
w.Append(&exitBtn);
if (THEME.showBattery)
{
#ifdef HW_RVL
w.Append(batteryBtn[0]);
w.Append(batteryBtn[1]);
w.Append(batteryBtn[2]);
w.Append(batteryBtn[3]);
#endif
}
mainWindow->Append(&w);
mainWindow->Append(&optionBrowser);
ResumeGui();
while(menu == MENU_NONE)
{
VIDEO_WaitVSync ();
#ifdef HW_RVL
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;
batteryImg[i]->SetTile(level);
if(level == 0)
batteryBarImg[i]->SetImage(&batteryRed);
else
batteryBarImg[i]->SetImage(&batteryBar);
batteryBtn[i]->SetAlpha(255);
}
else // controller not connected
{
batteryImg[i]->SetTile(0);
batteryImg[i]->SetImage(&battery);
batteryBtn[i]->SetAlpha(70);
}
}
#endif
selected = optionBrowser.GetClickedOption();
for (cnt = 0; cnt < MAX_PARTITIONS; cnt++) {
if (cnt == selected) {
partitionEntry *entry = &partitions[selected];
if (entry->size) {
sprintf(text, "Partition %d : %.2fGB", selected+1, entry->size * (sector_size / GB_SIZE));
choice = WindowPrompt(
"Do you want to format:",
text,
"Yes",
"No");
if(choice == 1) {
ret = FormatingPartition("Formatting, please wait...", entry);
if (ret < 0) {
WindowPrompt("Error:","Failed formating","Return",0);
menu = MENU_SETTINGS;
} else {
WBFS_Open();
sprintf(text, "%s formated!", text);
WindowPrompt("Success:",text,"OK",0);
menu = MENU_DISCLIST;
}
}
}
}
}
if (shutdown == 1)
Sys_Shutdown();
if(poweroffBtn.GetState() == STATE_CLICKED)
{
choice = WindowPrompt ("Shutdown System","Are you sure?","Yes","No");
if(choice == 1)
{
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
Sys_Shutdown();
}
} else if(exitBtn.GetState() == STATE_CLICKED)
{
choice = WindowPrompt ("Return to Wii Menu","Are you sure?","Yes","No");
if(choice == 1)
{
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
//exit(0); //zum debuggen schneller
}
}
}
HaltGui();
#ifdef HW_RVL
for(i=0; i < 4; i++)
{
delete batteryTxt[i];
delete batteryImg[i];
delete batteryBarImg[i];
delete batteryBtn[i];
}
#endif
mainWindow->Remove(&optionBrowser);
mainWindow->Remove(&w);
ResumeGui();
return menu;
}
/****************************************************************************
* MenuSettings
***************************************************************************/
static int MenuSettings()
{
//__Disc_SetLowMem();
int menu = MENU_NONE;
int ret;
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
GuiSound btnClick(button_click2_pcm, button_click2_pcm_size, SOUND_PCM, vol);
char imgPath[100];
GuiImageData btnOutline(settings_menu_button_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
GuiImageData settingsbg(imgPath, settings_background_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiTrigger trigHome;
trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
GuiTrigger trigB;
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
GuiText titleTxt("Settings", 28, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,40);
GuiImage settingsbackground(&settingsbg);
GuiButton settingsbackgroundbtn(settingsbackground.GetWidth(), settingsbackground.GetHeight());
settingsbackgroundbtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
settingsbackgroundbtn.SetPosition(0, 0);
settingsbackgroundbtn.SetImage(&settingsbackground);
GuiText backBtnTxt("Go Back", 22, (GXColor){0, 0, 0, 255});
backBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage backBtnImg(&btnOutline);
GuiButton backBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
backBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
backBtn.SetPosition(-180, 400);
backBtn.SetLabel(&backBtnTxt);
backBtn.SetImage(&backBtnImg);
backBtn.SetSoundOver(&btnSoundOver);
backBtn.SetSoundClick(&btnClick);
backBtn.SetTrigger(&trigA);
backBtn.SetTrigger(&trigB);
backBtn.SetEffectGrow();
const char * text = "Unlock";
if (CFG.godmode == 1)
text = "Lock";
GuiText lockBtnTxt(text, 22, (GXColor){0, 0, 0, 255});
lockBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage lockBtnImg(&btnOutline);
GuiButton lockBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
lockBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
lockBtn.SetPosition(180, 400);
lockBtn.SetLabel(&lockBtnTxt);
lockBtn.SetImage(&lockBtnImg);
lockBtn.SetSoundOver(&btnSoundOver);
lockBtn.SetSoundClick(&btnClick);
lockBtn.SetTrigger(&trigA);
lockBtn.SetEffectGrow();
GuiImageData logo(credits_button_png);
GuiImage logoImg(&logo);
GuiImageData logoOver(credits_button_over_png);
GuiImage logoImgOver(&logoOver);
btnLogo = new GuiButton(logoImg.GetWidth(), logoImg.GetHeight());
btnLogo->SetAlignment(ALIGN_CENTRE, ALIGN_BOTTOM);
btnLogo->SetPosition(0, -35);
btnLogo->SetImage(&logoImg);
btnLogo->SetImageOver(&logoImgOver);
btnLogo->SetEffectGrow();
btnLogo->SetSoundOver(&btnSoundOver);
btnLogo->SetSoundClick(&btnClick);
btnLogo->SetTrigger(&trigA);
btnLogo->SetUpdateCallback(WindowCredits);
customOptionList options2(9);
GuiCustomOptionBrowser optionBrowser2(396, 280, &options2, CFG.theme_path, "bg_options_settings", bg_options_settings_png, 0);
optionBrowser2.SetPosition(0, 90);
optionBrowser2.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
optionBrowser2.SetCol2Position(150);
GuiWindow w(screenwidth, screenheight);
int pageToDisplay = 1;
while ( pageToDisplay > 0) //set pageToDisplay to 0 to quit
{
menu = MENU_NONE;
if ( pageToDisplay == 1)
{
sprintf(options2.name[0], "Video Mode");
sprintf(options2.name[1], "VIDTV Patch");
sprintf(options2.name[2], "Language");
sprintf(options2.name[3], "Ocarina");
sprintf(options2.name[4], "Display");
sprintf(options2.name[5], "Clock"); //CLOCK
sprintf(options2.name[6], "Rumble"); //RUMBLE
sprintf(options2.name[7], "Volume");
sprintf(options2.name[8], " ");
HaltGui();
w.Append(&settingsbackgroundbtn);
w.Append(&titleTxt);
w.Append(&backBtn);
w.Append(&lockBtn);
w.Append(btnLogo);
mainWindow->Append(&w);
mainWindow->Append(&optionBrowser2);
ResumeGui();
}
else if ( pageToDisplay == 2 )
{
sprintf(options2.name[0], "Tooltips");
sprintf(options2.name[1], "Password");
sprintf(options2.name[2], "Parental Ctrl");
sprintf(options2.name[3], "Standard cIOS");
sprintf(options2.name[4], " ");
sprintf(options2.name[5], " ");
sprintf(options2.name[6], " ");
sprintf(options2.name[7], " ");
sprintf(options2.name[8], " ");
}
while(menu == MENU_NONE)
{
VIDEO_WaitVSync ();
if ( pageToDisplay == 1 )
{
if(Settings.video > 5)
Settings.video = 0;
if(Settings.language > 10)
Settings.language = 0;
if(Settings.ocarina > 1)
Settings.ocarina = 0;
if(Settings.vpatch > 1)
Settings.vpatch = 0;
if(Settings.sinfo > 3)
Settings.sinfo = 0;
if(Settings.hddinfo > 1)
Settings.hddinfo = 0; //CLOCK
if(Settings.rumble > 1)
Settings.rumble = 0; //RUMBLE
if(Settings.volume > 10)
Settings.volume = 0;
if (Settings.video == discdefault) sprintf (options2.value[0],"Disc Default");
else if (Settings.video == systemdefault) sprintf (options2.value[0],"System Default");
else if (Settings.video == patch) sprintf (options2.value[0],"Auto Patch");
else if (Settings.video == pal50) sprintf (options2.value[0],"Force PAL50");
else if (Settings.video == pal60) sprintf (options2.value[0],"Force PAL60");
else if (Settings.video == ntsc) sprintf (options2.value[0],"Force NTSC");
if (Settings.vpatch == on) sprintf (options2.value[1],"On");
else if (Settings.vpatch == off) sprintf (options2.value[1],"Off");
if (Settings.language == ConsoleLangDefault) sprintf (options2.value[2],"Console Default");
else if (Settings.language == jap) sprintf (options2.value[2],"Japanese");
else if (Settings.language == ger) sprintf (options2.value[2],"German");
else if (Settings.language == eng) sprintf (options2.value[2],"English");
else if (Settings.language == fren) sprintf (options2.value[2],"French");
else if (Settings.language == esp) sprintf (options2.value[2],"Spanish");
else if (Settings.language == it) sprintf (options2.value[2],"Italian");
else if (Settings.language == dut) sprintf (options2.value[2],"Dutch");
else if (Settings.language == schin) sprintf (options2.value[2],"S. Chinese");
else if (Settings.language == tchin) sprintf (options2.value[2],"T. Chinese");
else if (Settings.language == kor) sprintf (options2.value[2],"Korean");
if (Settings.ocarina == on) sprintf (options2.value[3],"On");
else if (Settings.ocarina == off) sprintf (options2.value[3],"Off");
if (Settings.sinfo == GameID) sprintf (options2.value[4],"Game ID");
else if (Settings.sinfo == GameRegion) sprintf (options2.value[4],"Game Region");
else if (Settings.sinfo == Both) sprintf (options2.value[4],"Both");
else if (Settings.sinfo == Neither) sprintf (options2.value[4],"Neither");
if (Settings.hddinfo == HDDInfo) sprintf (options2.value[5],"Off");
else if (Settings.hddinfo == Clock) sprintf (options2.value[5],"On");
if (Settings.rumble == RumbleOn) sprintf (options2.value[6],"On");
else if (Settings.rumble == RumbleOff) sprintf (options2.value[6],"Off");
if (Settings.volume == v10) sprintf (options2.value[7],"10");
else if (Settings.volume == v20) sprintf (options2.value[7],"20");
else if (Settings.volume == v30) sprintf (options2.value[7],"30");
else if (Settings.volume == v40) sprintf (options2.value[7],"40");
else if (Settings.volume == v50) sprintf (options2.value[7],"50");
else if (Settings.volume == v60) sprintf (options2.value[7],"60");
else if (Settings.volume == v70) sprintf (options2.value[7],"70");
else if (Settings.volume == v80) sprintf (options2.value[7],"80");
else if (Settings.volume == v90) sprintf (options2.value[7],"90");
else if (Settings.volume == v100) sprintf (options2.value[7],"100");
else if (Settings.volume == v0) sprintf (options2.value[7],"Off");
sprintf(options2.value[8], "Go to page 2");
ret = optionBrowser2.GetClickedOption();
switch (ret)
{
case 0:
Settings.video++;
break;
case 1:
Settings.vpatch++;
break;
case 2:
Settings.language++;
break;
case 3:
Settings.ocarina++;
break;
case 4: // Game Code and Region
Settings.sinfo++;
break;
case 5: //CLOCK
Settings.hddinfo++;
break;
case 6: //Rumble
Settings.rumble++;
break;
case 7:
Settings.volume++;
break;
case 8:
pageToDisplay = 2;
menu = MENU_EXIT;
break;
}
}
if ( pageToDisplay == 2 )
{
if ( Settings.tooltips > 1 )
Settings.tooltips = 0;
if ( Settings.parentalcontrol > 3 )
Settings.parentalcontrol = 0;
if ( Settings.cios > 1 )
Settings.cios = 0;
if (Settings.tooltips == TooltipsOn) sprintf (options2.value[0],"On");
else if (Settings.tooltips == TooltipsOff) sprintf (options2.value[0],"Off");
if ( CFG.godmode != 1) sprintf(options2.value[1], "********");
else if (!strcmp("", Settings.unlockCode)) sprintf(options2.value[1], "<not set>");
else sprintf(options2.value[1], Settings.unlockCode);
if (Settings.parentalcontrol == ParentalControlOff) sprintf (options2.value[2],"Not yet");
else if (Settings.parentalcontrol == ParentalControlLevel1) sprintf (options2.value[2],"not working");
else if (Settings.parentalcontrol == ParentalControlLevel2) sprintf (options2.value[2],"broken");
else if (Settings.parentalcontrol == ParentalControlLevel3) sprintf (options2.value[2],"coming soon");
if (Settings.cios == ios249) sprintf (options2.value[3],"249");
else if (Settings.cios == ios222) sprintf (options2.value[3],"222");
sprintf(options2.value[4], " ");
sprintf(options2.value[5], " ");
sprintf(options2.value[6], " ");
sprintf(options2.value[7], " ");
sprintf(options2.value[8], "Go to page 1");
ret = optionBrowser2.GetClickedOption();
switch (ret)
{
case 0:
Settings.tooltips++;
break;
case 1: // Modify Password
if ( CFG.godmode == 1)
{
char entered[20] = "";
strncpy(entered, Settings.unlockCode, sizeof(entered));
int result = OnScreenKeyboard(entered, 20);
if ( result == 1 )
{
strncpy(Settings.unlockCode, entered, sizeof(Settings.unlockCode));
WindowPrompt("Password Changed","Password has been changed","OK",0);
cfg_save_global();
}
}
else
{
WindowPrompt("Password change","Console should be unlocked to modify it.","OK",0);
}
break;
case 2:
if ( CFG.godmode == 1)
{
Settings.parentalcontrol++;
}
else
{
WindowPrompt("Parental Control","Console should be unlocked to modify it.","OK",0);
}
break;
case 3:
Settings.cios++;
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
pageToDisplay = 1;
menu = MENU_EXIT;
break;
}
}
if(shutdown == 1)
Sys_Shutdown();
if(backBtn.GetState() == STATE_CLICKED)
{
//Add the procedure call to save the global configuration
cfg_save_global();
menu = MENU_DISCLIST;
pageToDisplay = 0;
break;
}
if(lockBtn.GetState() == STATE_CLICKED)
{
if (!strcmp("", Settings.unlockCode))
{
CFG.godmode = !CFG.godmode;
}
else if ( CFG.godmode == 0 )
{
//password check to unlock Install,Delete and Format
char entered[20] = "";
int result = OnScreenKeyboard(entered, 20);
if ( result == 1 )
{
if (!strcmp(entered, Settings.unlockCode)) //if password correct
{
if (CFG.godmode == 0)
{
WindowPrompt("Correct Password","Install, Rename, and Delete are unlocked.","OK",0);
CFG.godmode = 1;
__Menu_GetEntries();
menu = MENU_DISCLIST;
}
}
else
{
WindowPrompt("Wrong Password","USB Loader is protected.","OK",0);
}
}
}
else
{
int choice = WindowPrompt ("Lock Console","Are you sure?","Yes","No");
if(choice == 1)
{
WindowPrompt("Console Locked","USB Loader is now protected.","OK",0);
CFG.godmode = 0;
__Menu_GetEntries();
menu = MENU_DISCLIST;
}
}
if ( CFG.godmode == 1)
{
lockBtnTxt.SetText("Lock");
}
else
{
lockBtnTxt.SetText("Unlock");
}
lockBtn.ResetState();
}
}
}
HaltGui();
delete btnLogo;
btnLogo = NULL;
mainWindow->Remove(&optionBrowser2);
mainWindow->Remove(&w);
ResumeGui();
return menu;
}
/********************************************************************************
*Game specific settings
*********************************************************************************/
int GameSettings(struct discHdr * header)
{
bool exit = false;
int ret;
int retVal = 0;
char gameName[31];
if (strlen(get_title(header)) < (27 + 3)) {
sprintf(gameName, "%s", get_title(header));
}
else {
strncpy(gameName, get_title(header), 27);
gameName[27] = '\0';
strncat(gameName, "...", 3);
}
customOptionList options3(5);
sprintf(options3.name[0], "Video Mode");
sprintf(options3.name[1], "VIDTV Patch");
sprintf(options3.name[2], "Language");
sprintf(options3.name[3], "Ocarina");
sprintf(options3.name[4], "IOS");
GuiSound btnSoundOver(button_over_pcm, button_over_pcm_size, SOUND_PCM, vol);
char imgPath[100];
GuiImageData btnOutline(settings_menu_button_png);
snprintf(imgPath, sizeof(imgPath), "%ssettings_background.png", CFG.theme_path);
GuiImageData settingsbg(imgPath, settings_background_png);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
GuiTrigger trigHome;
trigHome.SetButtonOnlyTrigger(-1, WPAD_BUTTON_HOME | WPAD_CLASSIC_BUTTON_HOME, 0);
GuiTrigger trigB;
trigB.SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
GuiText titleTxt(gameName, 28, (GXColor){0, 0, 0, 255});
titleTxt.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
titleTxt.SetPosition(0,40);
GuiImage settingsbackground(&settingsbg);
GuiButton settingsbackgroundbtn(settingsbackground.GetWidth(), settingsbackground.GetHeight());
settingsbackgroundbtn.SetAlignment(ALIGN_LEFT, ALIGN_TOP);
settingsbackgroundbtn.SetPosition(0, 0);
settingsbackgroundbtn.SetImage(&settingsbackground);
GuiText saveBtnTxt("Save", 22, (GXColor){0, 0, 0, 255});
saveBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage saveBtnImg(&btnOutline);
GuiButton saveBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
saveBtn.SetScale(0.9);
saveBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
saveBtn.SetPosition(-180, 400);
saveBtn.SetLabel(&saveBtnTxt);
saveBtn.SetImage(&saveBtnImg);
saveBtn.SetSoundOver(&btnSoundOver);
saveBtn.SetTrigger(&trigA);
saveBtn.SetEffectGrow();
GuiText cancelBtnTxt("Back", 22, (GXColor){0, 0, 0, 255});
cancelBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage cancelBtnImg(&btnOutline);
GuiButton cancelBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
cancelBtn.SetScale(0.9);
cancelBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
cancelBtn.SetPosition(180, 400);
cancelBtn.SetLabel(&cancelBtnTxt);
cancelBtn.SetImage(&cancelBtnImg);
cancelBtn.SetSoundOver(&btnSoundOver);
cancelBtn.SetTrigger(&trigA);
cancelBtn.SetTrigger(&trigB);
cancelBtn.SetEffectGrow();
GuiText deleteBtnTxt("Uninstall", 22, (GXColor){0, 0, 0, 255});
deleteBtnTxt.SetMaxWidth(btnOutline.GetWidth()-30);
GuiImage deleteBtnImg(&btnOutline);
GuiButton deleteBtn(btnOutline.GetWidth(), btnOutline.GetHeight());
deleteBtn.SetScale(0.9);
deleteBtn.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
deleteBtn.SetPosition(0, 400);
deleteBtn.SetLabel(&deleteBtnTxt);
deleteBtn.SetImage(&deleteBtnImg);
deleteBtn.SetSoundOver(&btnSoundOver);
deleteBtn.SetTrigger(&trigA);
deleteBtn.SetEffectGrow();
GuiCustomOptionBrowser optionBrowser3(396, 280, &options3, CFG.theme_path, "bg_options_settings", bg_options_settings_png, 0);
optionBrowser3.SetPosition(0, 90);
optionBrowser3.SetAlignment(ALIGN_CENTRE, ALIGN_TOP);
optionBrowser3.SetCol2Position(150);
HaltGui();
GuiWindow w(screenwidth, screenheight);
w.Append(&settingsbackgroundbtn);
w.Append(&titleTxt);
w.Append(&deleteBtn);
w.Append(&saveBtn);
w.Append(&cancelBtn);
mainWindow->Append(&w);
mainWindow->Append(&optionBrowser3);
ResumeGui();
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg)
{
videoChoice = game_cfg->video;
languageChoice = game_cfg->language;
ocarinaChoice = game_cfg->ocarina;
viChoice = game_cfg->vipatch;
iosChoice = game_cfg->ios;
}
else
{
videoChoice = Settings.video;
languageChoice = Settings.language;
ocarinaChoice = Settings.ocarina;
viChoice = Settings.vpatch;
if(Settings.cios == ios222) {
iosChoice = i222;
} else {
iosChoice = i249;
}
}
while(!exit)
{
VIDEO_WaitVSync ();
if (videoChoice == discdefault) sprintf (options3.value[0],"Disc Default");
else if (videoChoice == systemdefault) sprintf (options3.value[0],"System Default");
else if (videoChoice == patch) sprintf (options3.value[0],"Auto Patch");
else if (videoChoice == pal50) sprintf (options3.value[0],"Force PAL50");
else if (videoChoice == pal60) sprintf (options3.value[0],"Force PAL60");
else if (videoChoice == ntsc) sprintf (options3.value[0],"Force NTSC");
if (viChoice == on) sprintf (options3.value[1],"ON");
else if (viChoice == off) sprintf (options3.value[1],"OFF");
if (languageChoice == ConsoleLangDefault) sprintf (options3.value[2],"Console Default");
else if (languageChoice == jap) sprintf (options3.value[2],"Japanese");
else if (languageChoice == ger) sprintf (options3.value[2],"German");
else if (languageChoice == eng) sprintf (options3.value[2],"English");
else if (languageChoice == fren) sprintf (options3.value[2],"French");
else if (languageChoice == esp) sprintf (options3.value[2],"Spanish");
else if (languageChoice == it) sprintf (options3.value[2],"Italian");
else if (languageChoice == dut) sprintf (options3.value[2],"Dutch");
else if (languageChoice == schin) sprintf (options3.value[2],"S. Chinese");
else if (languageChoice == tchin) sprintf (options3.value[2],"T. Chinese");
else if (languageChoice == kor) sprintf (options3.value[2],"Korean");
if (ocarinaChoice == on) sprintf (options3.value[3],"ON");
else if (ocarinaChoice == off) sprintf (options3.value[3],"OFF");
if (iosChoice == i249) sprintf (options3.value[4],"249");
else if (iosChoice == i222) sprintf (options3.value[4],"222");
if(shutdown == 1)
Sys_Shutdown();
ret = optionBrowser3.GetClickedOption();
switch (ret)
{
case 0:
videoChoice = (videoChoice + 1) % CFG_VIDEO_COUNT;
break;
case 1:
viChoice = (viChoice + 1) % 2;
break;
case 2:
languageChoice = (languageChoice + 1) % CFG_LANG_COUNT;
break;
case 3:
ocarinaChoice = (ocarinaChoice + 1) % 2;
break;
case 4:
iosChoice = (iosChoice + 1) % 2;
break;
}
if(saveBtn.GetState() == STATE_CLICKED)
{
if (CFG_save_game_opt(header->id))
{
WindowPrompt("Successfully Saved", 0, "OK", 0);
}
else
{
WindowPrompt("Save Failed", 0, "OK", 0);
}
saveBtn.ResetState();
optionBrowser3.SetFocus(1);
}
if (cancelBtn.GetState() == STATE_CLICKED)
{
exit = true;
break;
}
if (deleteBtn.GetState() == STATE_CLICKED)
{
int choice = WindowPrompt(
"Do you really want to delete:",
gameName,
"Yes","Cancel");
if (choice == 1)
{
ret = WBFS_RemoveGame(header->id);
if (ret < 0)
{
WindowPrompt(
"Can't delete:",
gameName,
"OK",0);
}
else {
__Menu_GetEntries();
WindowPrompt(
"Successfully deleted:",
gameName,
"OK",0);
retVal = 1;
}
break;
}
else if (choice == 0)
{
deleteBtn.ResetState();
optionBrowser3.SetFocus(1);
}
}
}
HaltGui();
mainWindow->Remove(&optionBrowser3);
mainWindow->Remove(&w);
ResumeGui();
return retVal;
}
/****************************************************************************
* MenuCheck
***************************************************************************/
static int MenuCheck()
{
int menu = MENU_NONE;
int i = 0;
int choice;
s32 ret2;
OptionList options;
options.length = i;
partitionEntry partitions[MAX_PARTITIONS];
VIDEO_WaitVSync ();
ret2 = WBFS_Init(WBFS_DEVICE_USB);
if (ret2 < 0)
{
fatUnmount("SD");
__io_wiisd.shutdown();
ret2 = DeviceWait("No USB Device:", "Waiting for USB Device 30 secs", 0, 0);
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
__io_wiisd.startup();
fatMountSimple("SD", &__io_wiisd);
}
if (ret2 < 0) {
WindowPrompt ("ERROR:","USB-Device not found!", "ok", 0);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
} else {
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
__io_wiisd.startup();
fatMountSimple("SD", &__io_wiisd);
}
ret2 = Disc_Init();
if (ret2 < 0) {
WindowPrompt ("Error","Could not initialize DIP module!", "ok", 0);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
ret2 = WBFS_Open();
if (ret2 < 0) {
choice = WindowPrompt("No WBFS partition found!",
"You need to format a partition.",
"Format",
"Return");
if(choice == 0)
{
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
} else {
/* Get partition entries */
u32 sector_size;
ret2 = Partition_GetEntries(partitions, &sector_size);
if (ret2 < 0) {
WindowPrompt ("No partitions found!",0, "Restart", 0);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
menu = MENU_FORMAT;
}
}
if(shutdown == 1)
Sys_Shutdown();
//Spieleliste laden
__Menu_GetEntries();
menu = MENU_DISCLIST;
return menu;
}
/****************************************************************************
* MainMenu
***************************************************************************/
int MainMenu(int menu)
{
int currentMenu = menu;
char imgPath[100];
#ifdef HW_RVL
snprintf(imgPath, sizeof(imgPath), "%splayer1_point.png", CFG.theme_path);
pointer[0] = new GuiImageData(imgPath, player1_point_png);
snprintf(imgPath, sizeof(imgPath), "%splayer2_point.png", CFG.theme_path);
pointer[1] = new GuiImageData(imgPath, player2_point_png);
snprintf(imgPath, sizeof(imgPath), "%splayer3_point.png", CFG.theme_path);
pointer[2] = new GuiImageData(imgPath, player3_point_png);
snprintf(imgPath, sizeof(imgPath), "%splayer4_point.png", CFG.theme_path);
pointer[3] = new GuiImageData(imgPath, player4_point_png);
#endif
mainWindow = new GuiWindow(screenwidth, screenheight);
if (CFG.widescreen)
snprintf(imgPath, sizeof(imgPath), "%swbackground.png", CFG.theme_path);
else
snprintf(imgPath, sizeof(imgPath), "%sbackground.png", CFG.theme_path);
background = new GuiImageData(imgPath, CFG.widescreen? wbackground_png : background_png);
bgImg = new GuiImage(background);
mainWindow->Append(bgImg);
GuiTrigger trigA;
trigA.SetSimpleTrigger(-1, WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A, PAD_BUTTON_A);
ResumeGui();
bgMusic = new GuiSound(bg_music_ogg, bg_music_ogg_size, SOUND_OGG, vol);
bgMusic->SetVolume(vol);
bgMusic->SetLoop(1); //loop music
bgMusic->Play(); // startup music
while(currentMenu != MENU_EXIT)
{
bgMusic->SetVolume(vol);
switch (currentMenu)
{
case MENU_CHECK:
currentMenu = MenuCheck();
break;
case MENU_FORMAT:
currentMenu = MenuFormat();
break;
case MENU_INSTALL:
currentMenu = MenuInstall();
break;
case MENU_SETTINGS:
currentMenu = MenuSettings();
break;
case MENU_DISCLIST:
currentMenu = MenuDiscList();
break;
default: // unrecognized menu
currentMenu = MenuCheck();
break;
}
switch (Settings.volume)
{
case v10:
vol = 10;
break;
case v20:
vol = 20;
break;
case v30:
vol = 30;
break;
case v40:
vol = 40;
break;
case v50:
vol = 50;
break;
case v60:
vol = 60;
break;
case v70:
vol = 70;
break;
case v80:
vol = 80;
break;
case v90:
vol = 90;
break;
case v100:
vol = 100;
break;
case v0:
vol = 0;
break;
default:
vol = 80;
break;
}
}
bgMusic->Stop();
delete bgMusic;
delete background;
delete bgImg;
delete mainWindow;
delete pointer[0];
delete pointer[1];
delete pointer[2];
delete pointer[3];
delete cover;
delete coverImg;
mainWindow = NULL;
fatUnmount("SD");
__io_wiisd.shutdown();
ExitApp();
struct discHdr *header = &gameList[gameSelected];
struct Game_CFG* game_cfg = CFG_get_game_opt(header->id);
if (game_cfg)
{
videoChoice = game_cfg->video;
languageChoice = game_cfg->language;
ocarinaChoice = game_cfg->ocarina;
viChoice = game_cfg->vipatch;
iosChoice = game_cfg->ios;
}
else
{
videoChoice = Settings.video;
languageChoice = Settings.language;
ocarinaChoice = Settings.ocarina;
viChoice = Settings.vpatch;
iosChoice = i249;
}
switch(languageChoice)
{
case ConsoleLangDefault:
configbytes[0] = 0xCD;
break;
case jap:
configbytes[0] = 0x00;
break;
case eng:
configbytes[0] = 0x01;
break;
case ger:
configbytes[0] = 0x02;
break;
case fren:
configbytes[0] = 0x03;
break;
case esp:
configbytes[0] = 0x04;
break;
case it:
configbytes[0] = 0x05;
break;
case dut:
configbytes[0] = 0x06;
break;
case schin:
configbytes[0] = 0x07;
break;
case tchin:
configbytes[0] = 0x08;
break;
case kor:
configbytes[0] = 0x09;
break;
//wenn nicht genau klar ist welches
default:
configbytes[0] = 0xCD;
break;
}
u32 videoselected = 0;
switch(videoChoice)
{
case discdefault:
videoselected = 0;
break;
case pal50:
videoselected = 1;
break;
case pal60:
videoselected = 2;
break;
case ntsc:
videoselected = 3;
case systemdefault:
videoselected = 4;
break;
case patch:
videoselected = 5;
break;
default:
videoselected = 3;
break;
}
u32 cheat = 0;
switch(ocarinaChoice)
{
case on:
cheat = 1;
break;
case off:
cheat = 0;
break;
default:
cheat = 1;
break;
}
u8 vipatch = 0;
switch(viChoice)
{
case on:
vipatch = 1;
break;
case off:
vipatch = 0;
break;
default:
vipatch = 0;
break;
}
int ret = 0;
ret = Disc_WiiBoot(videoselected, cheat, vipatch);
if (ret < 0) {
printf(" ERROR: BOOT ERROR! (ret = %d)\n", ret);
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
return 0;
}