You are not logged in.
Hey everyone, this is my first time using GRRLIB, so I'm not that familiar with it. I'm currently modding a USB Backup Loader, and I'm getting some weird glitches. Here is an image I took of the problem:
The glitch is caused by me changing the image for a small button to one that stretches across the screen. The glitched area looks like a cross of the image I am trying to display, as well as a background image which no matter what I do I can't get to show up, which is weird that the only place it DOES show up is in the glitch. Here are the two images (Settings and Background):

The settings image changes to a mixture of pink and white when hovered over, even though the hover image is the same as the non-hovering image. If any code is necessary to determine the problem please let me know.
Offline
Sorry for the double post, but I've decided not to replace the image on the button, but instead remove the button. In place I will be placing a simple picture. I added
void draw_other_textures()
{
GRRLIB_DrawImg(0, 350, settings_panel, 0, 1, 1, 0xFFFFFFFF);
GRRLIB_Render();
}to
#include "gfx.h"
#include "settings.h"
#include "localization.h"
extern s_self self;
extern s_pointer pointer;
extern s_settings settings;
extern s_gameSettings gameSetting;
extern s_title* titleList;
extern int COVER_COUNT;
// Language selection config
char glanguages[11][22] =
{{"Console Default"},
{" Japanese"},
{" English"},
{" German"},
{" French"},
{" Spanish"},
{" Italian"},
{" Dutch"},
{" S. Chinese"},
{" T. Chinese"},
{" Korean"}};
//video mode text
char gvidmodes[6][22] =
{{ " Game Default" },
{ " Automatic", },
{ " Force PAL50", },
{ " Force PAL60", },
{ " Force NTSC", },
{ "Console Default"}};
//hook types for ocarina
char ghooks[3][9] =
{{" VI"},
{" Wii Pad"},
{" GC Pad"}};
static char timet[256];
void LoadTextures()
{
pointer_texture = GRRLIB_LoadTexture(generic_point_png);
pointer_shadow_texture = GRRLIB_LoadTexture(pointer_shadow_png);
turn_point_texture = GRRLIB_LoadTexture(turning_point_png);
menu_bg_texture = GRRLIB_LoadTexture(menu_bg_png);
cover_texture = GRRLIB_LoadTexture(no_cover_png);
back_texture = GRRLIB_LoadTexture(back_cover_png);
no_disc_texture = GRRLIB_LoadTexture(no_disc_png);
load_bg_texture = GRRLIB_LoadTexture(bg_options_screen_no_transparency_png);
font_texture = GRRLIB_LoadTexture(BMfont5_png);
font_title = GRRLIB_LoadTexture(font_w14_h20_png);
font_title_small = GRRLIB_LoadTexture(font_w10_h14_png);
battery_bar = GRRLIB_LoadTexture(battery_bar_png);
battery_bar_red = GRRLIB_LoadTexture(battery_bar_red_png);
battery = GRRLIB_LoadTexture(battery_png);
battery_dead = GRRLIB_LoadTexture(battery_dead_png);
ttf_button_black = GRRLIB_LoadTexture(ttf_button_black_png);
ttf_button_white = GRRLIB_LoadTexture(ttf_button_white_png);
settings_panel = GRRLIB_LoadTexture(settings_png);
GRRLIB_InitTileSet(&font_texture, 8, 16, 0);
GRRLIB_InitTileSet(&font_title, 14, 20, 32);
GRRLIB_InitTileSet(&font_title_small, 10, 14, 32);
}
void DrawBufferedCover(int i, float loc, float angle, float falloff)
{
if(i < MAX_BUFFERED_COVERS || i >= 0)
{
if(BUFFER_IsCoverReady(i))
{
pthread_mutex_lock(&buffer_mutex[i]);
if(_texture_data[i].data)
{
GRRLIB_DrawCoverImg(loc*1.2,_texture_data[i],angle,1.0,0xFFFFFFFF, falloff, settings.theme);
}
else
{
GRRLIB_DrawCoverImg(loc*1.2,cover_texture,angle,1.0,0xFFFFFFFF, falloff, settings.theme);
}
pthread_mutex_unlock(&buffer_mutex[i]);
}
else
{
GRRLIB_DrawCoverImg(loc*1.2,cover_texture,angle,1.0,0xFFFFFFFF, falloff, settings.theme);
}
}
else
{
GRRLIB_DrawCoverImg(loc*1.2,cover_texture,angle,1.0,0xFFFFFFFF, falloff, settings.theme);
}
}
void Paint_Progress(float v, char* msg)
{
int i;
int count = (int)(v*10);
if(count > 26)
count = 26;
GRRLIB_2D_Init();
GRRLIB_DrawImg(0, 15, loader_main_texture, 0, 1, 1, 0xFFFFFFFF);
for(i = 0; i < count; i++)
{
GRRLIB_DrawImg(165+12*i, 246, progress_texture, 0, 1, 1, 0xFFFFFFFF);
}
#ifdef DEBUG
if(msg != NULL)
GRRLIB_Printf(140, 270, font_title_small, 0xFFFFFFFF, 1, "%s", msg);
#endif
GRRLIB_Render();
}
void Paint_Progress_Generic(int v, int max, char* msg)
{
float percent = (float)v/(float)max;
int count = percent*26;
if(count > 26)
count = 26;
int i;
GRRLIB_2D_Init();
GRRLIB_DrawImg(0, 15, loader_main_texture, 0, 1, 1, 0xFFFFFFFF);
for(i = 0; i < count; i++)
{
GRRLIB_DrawImg(165+12*i, 246, progress_texture, 0, 1, 1, 0xFFFFFFFF);
}
#ifdef DEBUG
if(msg != NULL)
GRRLIB_Printf(140, 270, font_title_small, 0xFFFFFFFF, 1, "%s", msg);
#endif
GRRLIB_Render();
}
void Init_Buttons()
{
#ifndef LOCALBUTTON_OFF
char labelBuf[15]; //add for Localization
#endif
addButton = Button_Init(add_button_png, add_button_hover_png, 580, 417);
okButton = Button_Init(ok_png, ok_hover_png, 220, 290);
cancelButton = Button_Init(cancel_png, cancel_hover_png, 360, 290);
loadButton = Button_Init(load_png, load_hover_png, 220, 300);
deleteButton = Button_Init(delete_png, delete_hover_png, 220, 400);
resetButton = Button_Init(reset_png, reset_hover_png, 350, 330);
backButton = Button_Init(back_png, back_hover_png, 340, 300);
gbackButton = Button_Init(back_png, back_hover_png, 340, 300);
gsettingsButton = Button_Init(settings_png, settings_hover_png, 30, 420);
cheatonButton = Button_Init(toggle_on_png, toggle_on_png, 215,85);
cheatoffButton = Button_Init(toggle_off_png, toggle_off_png, 215,85);
langupButton = Button_Init(plus_button_png, plus_button_hover_png,456,123);
langdownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,123);
vidupButton = Button_Init(plus_button_png, plus_button_hover_png, 456,150);
viddownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,150);
vidtvonButton = Button_Init(toggle_on_png, toggle_on_png, 350, 175);
vidtvoffButton = Button_Init(toggle_off_png, toggle_off_png, 350, 175);
hookupButton = Button_Init(plus_button_png, plus_button_hover_png, 456,87);
hookdownButton = Button_Init(minus_button_png, minus_button_hover_png, 360,87);
gcheatonButton = Button_Init(toggle_on_png, toggle_on_png, 239,185); //
gcheatoffButton = Button_Init(toggle_off_png, toggle_off_png, 239,185); //
glangupButton = Button_Init(plus_button_png, plus_button_hover_png,480,223);
glangdownButton = Button_Init(minus_button_png, minus_button_hover_png, 324,223);
gvidupButton = Button_Init(plus_button_png, plus_button_hover_png, 480,250);
gviddownButton = Button_Init(minus_button_png, minus_button_hover_png, 324,250);
gvidtvonButton = Button_Init(toggle_on_png, toggle_on_png, 374, 275);
gvidtvoffButton = Button_Init(toggle_off_png, toggle_off_png, 374, 275);
ghookupButton = Button_Init(plus_button_png, plus_button_hover_png, 480,187);
ghookdownButton = Button_Init(minus_button_png, minus_button_hover_png, 384,187);
coverTextOnButton = Button_Init(toggle_on_png, toggle_on_png, 350, 330);
coverTextOffButton = Button_Init(toggle_off_png, toggle_off_png, 350, 330);
graphicsButton = Button_Init(ok_png, ok_hover_png, 350, 215);
yesButton = Button_Init(yes_png, yes_hover_png, 220, 290);
noButton = Button_Init(no_png, no_hover_png, 340, 290);
// settingsButton = Button_Init(settings_png, settings_hover_png, 30, 420);
// settingsButton = Button_Init(settings_png, settings_hover_png, 30, 420);
titlesButton = Button_Init(titles_png, titles_hover_png, 400, 250);
coversButton = Button_Init(covers_png, covers_hover_png, 310, 250);
zoomupButton = Button_Init(plus_button_png, plus_button_hover_png,456,95);
zoomdownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,95);
spacingupButton = Button_Init(plus_button_png, plus_button_hover_png,456,133);
spacingdownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,133);
angleupButton = Button_Init(plus_button_png, plus_button_hover_png,456,171);
angledownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,171);
falloffupButton = Button_Init(plus_button_png, plus_button_hover_png,456,209);
falloffdownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,209);
windowupButton = Button_Init(plus_button_png, plus_button_hover_png,456, 247);
windowdownButton = Button_Init(minus_button_png, minus_button_hover_png, 300,247);
themeWhiteButton = Button_Init(theme_white_png, theme_white_png, 350, 295);
themeBlackButton = Button_Init(theme_black_png, theme_black_png, 350, 295);
quickstartOnButton = Button_Init(toggle_on_png, toggle_on_png, 350, 335);
quickstartOffButton = Button_Init(toggle_off_png, toggle_off_png, 350, 335);
rumbleOnButton = Button_Init(toggle_on_png, toggle_on_png, 350, 375);
rumbleOffButton = Button_Init(toggle_off_png, toggle_off_png, 350, 375);
musicOnButton = Button_Init(toggle_on_png, toggle_on_png, 350, 415);
musicOffButton = Button_Init(toggle_off_png, toggle_off_png, 350, 415);
bookmarkOnButton = Button_Init(star_on_png, star_on_png, 515, 140);
bookmarkOffButton = Button_Init(star_off_png, star_on_png, 515, 140);
homeMenuTopButton = Button_Init(homeTop_png, homeTop_hover_png, 0, 0);
homeMenuBottomButton = Button_Init(homeBottom_png, homeBottom_hover_png, 0, 368);
wiiMenuButton = Button_Init(wiiMenu_png, wiiMenu_hover_png, 34, 180);
loaderButton = Button_Init(loader_png, loader_hover_png, 174, 180);
wiimoteButton = Button_Init(wiimote_png, wiimote_png, 54, 400);
#ifndef LOCALBUTTON_OFF
//add for Localization
sprintf(addButton.label, localStr("B01",""));
sprintf(deleteButton.label, localStr("B02",""));
sprintf(cancelButton.label, localStr("B03",""));
sprintf(yesButton.label, localStr("B04",""));
sprintf(noButton.label, localStr("B05",""));
sprintf(labelBuf, localStr("B06",""));
sprintf(okButton.label, labelBuf);
sprintf(graphicsButton.label, labelBuf);
sprintf(resetButton.label, localStr("B07",""));
//sprintf(downloadButton.label, localStr("B08",""));
sprintf(coversButton.label, localStr("B08",""));
sprintf(titlesButton.label, localStr("B08",""));
sprintf(loadButton.label, localStr("B09",""));
sprintf(labelBuf, localStr("B10",""));
sprintf(backButton.label, labelBuf);
sprintf(gbackButton.label, labelBuf);
//sprintf(labelBuf, "An"); //for testing
sprintf(labelBuf, localStr("B11",""));
sprintf(cheatonButton.label, labelBuf);
sprintf(vidtvonButton.label, labelBuf);
sprintf(gcheatonButton.label, labelBuf);
sprintf(gvidtvonButton.label, labelBuf);
sprintf(coverTextOnButton.label, labelBuf);
sprintf(quickstartOnButton.label, labelBuf);
sprintf(rumbleOnButton.label, labelBuf);
sprintf(musicOnButton.label, labelBuf);
//sprintf(labelBuf, " Aus"); //for testing
sprintf(labelBuf, localStr("B12",""));
sprintf(cheatoffButton.label, labelBuf);
sprintf(vidtvoffButton.label, labelBuf);
sprintf(gcheatoffButton.label, labelBuf);
sprintf(gvidtvoffButton.label, labelBuf);
sprintf(coverTextOffButton.label, labelBuf);
sprintf(quickstartOffButton.label, labelBuf);
sprintf(rumbleOffButton.label, labelBuf);
sprintf(musicOffButton.label, labelBuf);
sprintf(themeWhiteButton.label, localStr("B13",""));
sprintf(themeBlackButton.label, localStr("B14",""));
sprintf(homeMenuTopButton.label, localStr("B15",""));
sprintf(wiiMenuButton.label, localStr("B16",""));
sprintf(loaderButton.label, localStr("B17",""));
#endif
}
void draw_other_textures()
{
GRRLIB_DrawImg(0, 350, settings_panel, 0, 1, 1, 0xFFFFFFFF);
GRRLIB_Render();
}
void GRRLIB_Cover(float pos, int texture_id)
{
if(texture_id >= self.gameCnt)
return;
if(pos == 0)
self.gameSelected = texture_id;
if((self.selected || self.animate_flip > 0) && pos == 0)
return;
//static const float SPACING = 2.8;
float dir = 1;
float loc, scale, angle;
float falloff;
if (pos < 0) {
dir *= -1;
pos *= -1;
}
loc = settings.coverSpacing * dir * (pow(pos + 1, -1) - 1);
falloff = (pos)*2*settings.coverFallOff;
scale = pow(pos + 1, -2);
angle = -1 * dir * change_scale(scale, 0, 1, settings.coverAngle, 0);
DrawBufferedCover(texture_id, loc, angle, falloff);
}
void draw_covers()
{
int i;
for(i = (-1*(COVER_COUNT/2.0)); i < 0; i++)
{
//Some logic to avoid drawing everything
if(abs(self.shift+i) < settings.drawWindow)
GRRLIB_Cover(i+self.shift, i+(COVER_COUNT/2.0));
}
for(i = ((COVER_COUNT/2.0)); i >= 0; i--)
{
// Some logic to avoid drawing everything
if(abs(self.shift+i) < settings.drawWindow)
GRRLIB_Cover(i+self.shift, i+(COVER_COUNT/2.0));
}
}
void draw_game_title(int index, float textSize)
{
if(index != -1)
{
int len = 0;
struct discHdr *header = NULL;
char gameName[36];
char title[MAX_TITLE_LEN];
header = &self.gameList[index];
if(self.usingTitlesTxt){
sprintf(title, "%s", header->title);
getTitle(titleList, (char*)header->id, title);
}
if (self.gameCnt < 1)
{
sprintf(gameName, "%s", "Please add a game...");
len = strlen(gameName);
}
else
{
if(self.usingTitlesTxt)
len = strlen(title);
else
len = strlen(header->title);
// chomp the title to fit
// TODO: Lengthen this for TTF
#ifndef TTF_TEST
if(len <= 35) //the length of the max title is 35 fixed width chars
{
if(self.usingTitlesTxt)
sprintf(gameName, "%s", (title));
else
sprintf(gameName, "%s", (header->title));
}
else
{
if(self.usingTitlesTxt)
strncpy(gameName, title, 32);
else
strncpy(gameName, header->title, 32);
gameName[32] = '\0';
strncat(gameName, "...", 3);
len = 35;
}
#else
if(len <= 45) //the length of the max title is 45 22pt TTF chars
{
if(self.usingTitlesTxt)
sprintf(gameName, "%s", (title));
else
sprintf(gameName, "%s", (header->title));
}
else
{
if(self.usingTitlesTxt)
strncpy(gameName, title, 42);
else
strncpy(gameName, header->title, 42);
gameName[42] = '\0';
strncat(gameName, "...", 3);
len = 45;
}
#endif
}
#ifndef TTF_TEST
len = strlen(gameName);
float offset = (len*7.9); // calc a font scaled offset from title length
if((int)offset > 260)
offset = 260.0; // dont draw on top of the setting button
GRRLIB_Printf(340 - (int)offset, 400, font_title, 0xFFFFFFFF, textSize, "%s", gameName);
#else
if (settings.theme) // black text on white matte
{
CFreeTypeGX_DrawText(ttf22pt, 320, 410, CFreeTypeGX_charToWideChar(ttf22pt, gameName), (GXColor){0xff, 0xff, 0xff, 0xff}, 0x0002);
CFreeTypeGX_DrawText(ttf22pt, 320, 410, CFreeTypeGX_charToWideChar(ttf22pt, gameName), (GXColor){0x00, 0x00, 0x00, 0xcc}, 0x0002);
}
else //white text on black matte
{
CFreeTypeGX_DrawText(ttf22pt, 320, 410, CFreeTypeGX_charToWideChar(ttf22pt, gameName), (GXColor){0x00, 0x00, 0x00, 0xff}, 0x0002);
CFreeTypeGX_DrawText(ttf22pt, 320, 410, CFreeTypeGX_charToWideChar(ttf22pt, gameName), (GXColor){0xff, 0xff, 0xff, 0xdd}, 0x0002);
}
#endif
}
}
int draw_selected_two(bool load, bool hover)
{
/*Animate fliping cover*/
if(self.selected && self.animate_flip < 1.0)
{
self.animate_rotate = 0.0;
self.animate_load = 0.0;
self.animate_load_speed = ANIMATE_SPEED;
self.animate_direction = 1;
self.animate_flip += FLIP_SPEED;
if(self.animate_flip > 1.0)
self.animate_flip = 1.0;
if(self.animate_flip > 0.3 && self.animate_flip < 0.7)
self.animate_flip = 0.7;
}
else if(!self.selected)
{
self.animate_flip -= FLIP_SPEED;
if(self.animate_flip > 0.3 && self.animate_flip < 0.7)
self.animate_flip = 0.3;
if(self.animate_flip < 0)
self.animate_flip = 0;
}
float dir = 1;
float loc, scale, angle;
loc = settings.coverSpacing * dir * (pow(1, -1) - 1);
scale = change_scale(self.animate_flip, 0, 1, 0, 270);
angle = -1 * dir * scale;
if(load)
{
self.animate_rotate+=5;
if(self.animate_rotate == 360) self.animate_rotate = 0;
self.animate_load_speed -= 4;
if(self.animate_count < 0)
{
self.animate_slide_x+=8;
}
else
{
self.animate_count--;
}
if(self.animate_slide_x > 530)
{
return 1;
}
if(self.animate_load < 15)
self.animate_load+=1;
}
else if(hover)
{
if(self.animate_load < 15 )
{
self.animate_load+=1;
}
}
else
{
if(self.animate_load > 0)
self.animate_load--;
}
if(scale >= 250)//-16
{
GRRLIB_DrawImg(64, 110, load_bg_texture, 0, 1, 1, 0xFFFFFFFF);
loadButton.x = 245;
loadButton.y = 316;
backButton.x = 335;
backButton.y = 316;
deleteButton.x = 425;
deleteButton.y = 316;
gsettingsButton.x = 520;
gsettingsButton.y = 312;
Button_Paint(&loadButton);
Button_Paint(&backButton);
//Button_Toggle_Paint(&bookmarkOffButton, &bookmarkOnButton, self.dummy);
if(!settings.parentalLock)
Button_Hover(&deleteButton, pointer.p_x, pointer.p_y);
Button_Hover(&backButton, pointer.p_x, pointer.p_y);
if(!settings.parentalLock)
{
Button_Paint(&gsettingsButton);
Button_Hover(&gsettingsButton, pointer.p_x, pointer.p_y);
}
if(!settings.parentalLock)
Button_Paint(&deleteButton);
#ifndef TEST_MODE
struct discHdr *header = NULL;
header = &self.gameList[self.gameSelected];
char gameName[MAX_TITLE_LEN];
if(self.usingTitlesTxt){
sprintf(gameName, "%s", header->title);
getTitle(titleList, (char*)header->id, gameName);
}
else
sprintf(gameName, "%s", (header->title));
// chomp the title to fit
if(strlen(gameName) >= 20)
{
//strncpy(gameName, header->title, 17);
gameName[17] = '\0';
strncat(gameName, "...", 3);
}
/*
if(strlen(header->title) < 20)
{
sprintf(gameName, "%s", (header->title));
}
else
{
strncpy(gameName, header->title, 17);
gameName[17] = '\0';
strncat(gameName, "...", 3);
}
*/
// Display Title, Last Played, and Size
GRRLIB_Printf(245, 174, font_title, 0xFFFFFFFF, 1, "%s", gameName);
if((strcmp(gameSetting.lastPlayed, "-1"))==0)
GRRLIB_Printf(255, 220, font_title_small, 0xFFFFFFFF, 1, localStr("M032", "Never played before"));
else
GRRLIB_Printf(255, 220, font_title_small, 0xFFFFFFFF, 1, localStr("M033", "Played %s"),gameSetting.lastPlayed);
GRRLIB_Printf(255, 240, font_title_small, 0xFFFFFFFF, 1, localStr("M034", "Size: %.2f GB"), self.gsize);
#else
GRRLIB_Printf(270, 174, font_title, 0xFFFFFFFF, 1, "%s", "Best game");
GRRLIB_Printf(280, 210, font_title_small, 0xFFFFFFFF, 1, "%s", " Game ID: KBGSUX");
GRRLIB_Printf(280, 230, font_title_small, 0xFFFFFFFF, 1, "Size: %.2fGB", self.gsize);
#endif
// DISC IMAGE
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
GRRLIB_DrawImg(86+self.animate_slide_x+self.animate_load,170, current_cover_texture, self.animate_rotate, AR_16_9, AR_16_9, 0xFFFFFFFF);
else
GRRLIB_DrawImg(76+self.animate_slide_x+self.animate_load,170, current_cover_texture, self.animate_rotate, 1, 1, 0xFFFFFFFF);
if(self.gameSelected < MAX_BUFFERED_COVERS || self.gameSelected >= 0)
{
if(BUFFER_IsCoverReady(self.gameSelected))
{
pthread_mutex_lock(&buffer_mutex[self.gameSelected]);
if(_texture_data[self.gameSelected].data)
{
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
GRRLIB_DrawImg(60, 131, _texture_data[self.gameSelected], 0, AR_16_9, 1, 0xFFFFFFFF);
else
GRRLIB_DrawImg(60, 131, _texture_data[self.gameSelected], 0, 1, 1, 0xFFFFFFFF);
}
else
{
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
GRRLIB_DrawImg(60, 131, cover_texture, 0, AR_16_9, 1, 0xFFFFFFFF);
else
GRRLIB_DrawImg(60, 131, cover_texture, 0, 1, 1, 0xFFFFFFFF);
}
pthread_mutex_unlock(&buffer_mutex[self.gameSelected]);
}
else
{ if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
GRRLIB_DrawImg(60, 131, cover_texture, 0, 1, AR_16_9, 0xFFFFFFFF);
else
GRRLIB_DrawImg(60, 131, cover_texture, 0, 1, 1, 0xFFFFFFFF);
}
}
else
{
if(CONF_GetAspectRatio() == CONF_ASPECT_16_9)
GRRLIB_DrawImg(60, 131, cover_texture, 0, AR_16_9, 1, 0xFFFFFFFF);
else
GRRLIB_DrawImg(60, 131, cover_texture, 0, 1, 1, 0xFFFFFFFF);
}
}
else
{
DrawBufferedCover(self.gameSelected, loc, angle, 0 );
}
return 0;
}
void draw_selected()
{
//WindowPrompt("zucca!", "topa", 0, &okButton);
if(self.selected && self.animate_flip < 1.0)
{
self.animate_flip += FLIP_SPEED;
if(self.animate_flip > 1.0)
self.animate_flip = 1.0;
if(self.animate_flip > 0.3 && self.animate_flip < 0.7)
self.animate_flip = 0.7;
}
else if(!self.selected)
{
self.animate_flip -= FLIP_SPEED;
if(self.animate_flip > 0.3 && self.animate_flip < 0.7)
self.animate_flip = 0.3;
if(self.animate_flip < 0)
self.animate_flip = 0;
}
float dir = 1;
float loc, scale, angle;
loc = settings.coverSpacing * dir * (pow(1, -1) - 1);
scale = change_scale(self.animate_flip, 0, 1, 0, 360);
angle = -1 * dir * scale;
if(scale >= 180)
{
//Use back art texture
GRRLIB_DrawCoverImg(loc*1.2,back_texture,angle,1.4,0xFFFFFFFF, 0, settings.theme);
if(scale >= 360)
{
int i ;
int len;
self.animate_rotate++;
if(self.animate_rotate == 360) self.animate_rotate = 0;
GRRLIB_DrawImg(230,100, current_cover_texture, self.animate_rotate, 1, 1, 0xFFFFFFFF);
Button_Paint(&loadButton);
Button_Paint(&backButton);
Button_Paint(&deleteButton);
#ifndef TEST_MODE
struct discHdr *header = NULL;
header = &self.gameList[self.gameSelected];
f32 size = 0.0;
/* Get game size */
WBFS_GameSize(header->id, &size);
char name[MAX_TITLE_LEN];
if(self.usingTitlesTxt){
sprintf(name, "%s", header->title);
getTitle(titleList, (char*)header->id, name);
}
else{
WindowPrompt("zucca!", "eheh", 0, &okButton);
for(i = 0; i < MAX_TITLE_LEN; i++)
name[i] = toupper(header->title[i]);
}
len = strlen(name);
float tsize = .8;
if(len > 20)
tsize = .6;
if(len > 28)
tsize = .4;
if(len > 40)
tsize = .3;
int offset = (len*10);
if(offset > 240)
offset = 240;
GRRLIB_Printf(300 - offset, 10, font_texture, settings.fontColor, tsize, "%s", name);
GRRLIB_Printf(210, 50, font_texture, settings.fontColor, .4, "(%c%c%c%c) (%.2fGB)", header->id[0], header->id[1], header->id[2], header->id[3], size);
#else
GRRLIB_Printf(90, 10, font_texture, settings.fontColor, .8, "%s", "JUSTINS GAME");
GRRLIB_Printf(180, 50, font_texture, settings.fontColor, .5, "%s", "JUSTINS GAME");
#endif
}
}
else
{
DrawBufferedCover(self.gameSelected, loc, angle, 0);
}
}
float change_scale_without_containing(float val, float in_min, float in_max, float out_min, float out_max)
{
float percent = 0;
if (in_min == in_max)
return 0;
percent = (val - in_min) / (in_max - in_min);
return (out_min + percent * (out_max - out_min));
}
float change_scale(float val, float in_min, float in_max, float out_min, float out_max)
{
if(val > in_max)
val = in_max;
if(val < in_min)
val = in_min;
return change_scale_without_containing(val, in_min, in_max, out_min, out_max);
}
int WindowPrompt(char* title, char* txt, struct Button* choice_a, struct Button* choice_b)
{
bool doloop = true;
char* pch;
if(choice_a == 0 && choice_b == 0)
{
doloop = false;
}
else
{
doloop = true;
}
do{
WPAD_ScanPads();
PAD_ScanPads();
GetWiimoteData();
//if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME)
// exit(0);
if((WPAD_ButtonsDown(0) & WPAD_BUTTON_B)|| (PAD_ButtonsDown(0) & PAD_BUTTON_B))
return false;
if((WPAD_ButtonsDown(0) & WPAD_BUTTON_A) || (PAD_ButtonsDown(0) & PAD_BUTTON_A))
{
if(choice_a != 0)
{
if(Button_Select(choice_a, pointer.p_x, pointer.p_y))
return true;
}
if(choice_b != 0)
{
if(Button_Select(choice_b, pointer.p_x, pointer.p_y))
return false;
}
}
// Draw the dialog panel
GRRLIB_DrawImg(50, 80, load_bg_texture, 0, 1, 1.25, 0xFFFFFFFF);
// Draw buttons
if(choice_a != 0 && choice_b != 0){
choice_a->x = 320-5-80;
choice_b->x = 320+5;
#ifndef TTF_TEST
Button_Paint(choice_a);
Button_Paint(choice_b);
#else
GRRLIB_DrawImg(choice_a->x, 290, ttf_button_black, 0, 1, 1, 0xFFFFFFFF);
CFreeTypeGX_DrawText(ttf16pt, (choice_a->x)+40, 310, CFreeTypeGX_charToWideChar(ttf16pt, "OK"), (GXColor){0xff, 0xff, 0xff, 0xff}, 0x0002);
GRRLIB_DrawImg(choice_b->x, 290, ttf_button_black, 0, 1, 1, 0xFFFFFFFF);
CFreeTypeGX_DrawText(ttf16pt, (choice_b->x)+40, 310, CFreeTypeGX_charToWideChar(ttf16pt, "CANCEL"), (GXColor){0xff, 0xff, 0xff, 0xff}, 0x0002);
#endif
}
else{
if(choice_a != 0){
choice_a->x = 320-40;
#ifndef TTF_TEST
Button_Paint(choice_a);
#else
GRRLIB_DrawImg(choice_a->x, 290, ttf_button_black, 0, 1, 1, 0xFFFFFFFF);
CFreeTypeGX_DrawText(ttf16pt, (choice_a->x)+40, 310, CFreeTypeGX_charToWideChar(ttf16pt, "OK"), (GXColor){0xff, 0xff, 0xff, 0xff}, 0x0002);
#endif
}
if(choice_b != 0){
choice_b->x = 320-40;
#ifndef TTF_TEST
Button_Paint(choice_b);
#else
GRRLIB_DrawImg(choice_b->x, 290, ttf_button_black, 0, 1, 1, 0xFFFFFFFF);
CFreeTypeGX_DrawText(ttf16pt, (choice_b->x)+40, 310, CFreeTypeGX_charToWideChar(ttf16pt, "CANCEL"), (GXColor){0xff, 0xff, 0xff, 0xff}, 0x0002);
#endif
}
}
int y = 140;
int sp = 0;
// Draw text
#ifndef TTF_TEST
GRRLIB_Printf(100, 105, font_title, 0xFFFFFFFF, 1, "%s", title);
#else
CFreeTypeGX_DrawText(ttf22pt, 100, 105, CFreeTypeGX_charToWideChar(ttf22pt, title), (GXColor){0x00, 0x00, 0x00, 0xff}, 0x0001);
CFreeTypeGX_DrawText(ttf22pt, 100, 105, CFreeTypeGX_charToWideChar(ttf22pt, title), (GXColor){0xff, 0xff, 0xff, 0xdd}, 0x0001);
#endif
if(txt != NULL)
{
char* msg = malloc(strlen(txt)*sizeof(char));
sprintf(msg, txt);
pch = strtok(msg, "\n");
while (pch != NULL)
{
#ifndef TTF_TEST
GRRLIB_Printf(138, y+sp, font_title_small, settings.fontColor, 1, "%s", pch);
#else
CFreeTypeGX_DrawText(ttf16pt, 135, y+sp, CFreeTypeGX_charToWideChar(ttf16pt, pch), (GXColor){0x00, 0x00, 0x00, 0xff}, 0x0001);
CFreeTypeGX_DrawText(ttf16pt, 135, y+sp, CFreeTypeGX_charToWideChar(ttf16pt, pch), (GXColor){0xff, 0xff, 0xff, 0xdd}, 0x0001);
#endif
pch = strtok(NULL, "\n");
sp+=16;
}
free(msg);
}
// Check for button-pointer intersections, and rumble
if (Button_Hover(choice_a, pointer.p_x, pointer.p_y) ||
Button_Hover(choice_b, pointer.p_x, pointer.p_y))
{
// Should we be rumbling?
if (--self.rumbleAmt > 0)
WPAD_Rumble(0,1); // Turn on Wiimote rumble
else
WPAD_Rumble(0,0); // Kill the rumble
}
else
{ // If no button is being hovered, kill the rumble
WPAD_Rumble(0,0);
self.rumbleAmt = 5;
}
// Draw the default pointer hand
if(doloop)
DrawCursor(0, pointer.p_x, pointer.p_y, pointer.p_ang, 1, 1, 0xFFFFFFFF);
GRRLIB_Render();
}while(doloop);
self.rumbleAmt = 0;
return false;
}
/****************************************************************************
* 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;
//sprintf(prozent, "%s%0.2f%%", "Installing Game...", percent);
sprintf(timet,localStr("M035", "Installing... (%0.2f%%) Time left: %d:%02d:%02d"),percent, h,m,s);
/*Update and Draw Progress Window Here*/
//WindowPrompt(prozent, timet, 0, 0);
Paint_Progress_Generic(done, total, timet);
}
int ProgressWindow(wbfs_t *hdd, char* title, char* msg)
{
//Freeze Buffer thread during install
pthread_mutex_lock(&lock_thread_mutex);
/*TODO Draw Window*/
_title = title;
_msg = msg;
int ret = wbfs_add_disc(hdd, __WBFS_ReadDVD, NULL, ShowProgress, ONLY_GAME_PARTITION, 0);
self.progress = 0.0;
//Resume Buffer Thread
pthread_mutex_unlock(&lock_thread_mutex);
Sleep(1);
return ret;
}
void GetWiimoteData()
{
WPAD_IR(WPAD_CHAN_0, &self.ir); // Let's get our infrared data
WPAD_Orientation(WPAD_CHAN_0, &self.orient);
pointer.p_x = self.ir.sx-160; // This is to adjust to overscan
pointer.p_y = self.ir.sy-220; // Same
pointer.p_ang = self.ir.angle/2; // Set angle/2 to translate correctly
pointer.p_type = 0;
}
void DrawCursor(int type, f32 xpos, f32 ypos, float degrees, float scaleX, f32 scaleY, u32 color )
{
// draw the pointer shadow
GRRLIB_DrawImg(pointer.p_x+4, pointer.p_y+4, pointer_shadow_texture, pointer.p_ang, 1, 1, color);
switch (type)
{
case 0: // default cursor
GRRLIB_DrawImg(pointer.p_x, pointer.p_y, pointer_texture, pointer.p_ang, 1, 1, color);
break;
case 1: // turning hand cursor
GRRLIB_DrawImg(pointer.p_x, pointer.p_y, turn_point_texture, pointer.p_ang, 1, 1, color);
break;
default:
GRRLIB_DrawImg(pointer.p_x, pointer.p_y, pointer_texture, pointer.p_ang, 1, 1, color);
break;
}
}
void game_settings_menu()
{
//get/set per-game settings
struct discHdr *header = NULL;
header = &self.gameList[self.gameSelected];
char titleID[7];
char gameName[MAX_TITLE_LEN];
// chomp the title to fit
if(self.usingTitlesTxt){
sprintf(gameName, "%s", header->title);
getTitle(titleList, (char*)header->id, gameName);
}
else
sprintf(gameName, "%s", (header->title));
if(strlen(header->title) >= 20)
{
//strncpy(gameName, header->title, 17);
gameName[17] = '\0';
strncat(gameName, "...", 3);
}
sprintf(titleID, "%s", header->id);
if(!getGameSettings(titleID, &gameSetting));
{
setGameSettings(titleID, &gameSetting,-1);
getGameSettings(titleID, &gameSetting);
}
// ocarina will be -1 if we never been into game settings before
if(gameSetting.ocarina == -1)
{
gameSetting.ocarina = 0;
gameSetting.hooktype = 0;
gameSetting.language = 0;
gameSetting.video = 0;
gameSetting.vipatch = 0;
}
bool doloop = true;
do{
WPAD_ScanPads();
GetWiimoteData();
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME)
{
setGameSettings(titleID, &gameSetting,-1);
return;
}
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_B)
{
setGameSettings(titleID, &gameSetting,-1);
return;
}
if(WPAD_ButtonsDown(0) & WPAD_BUTTON_A)
{
if(Button_Select(&gbackButton, pointer.p_x, pointer.p_y))
{
setGameSettings(titleID, &gameSetting,-1);
return;
}
else if (Button_Select(&gcheatonButton, pointer.p_x, pointer.p_y) || Button_Select(&gcheatoffButton, pointer.p_x, pointer.p_y))
{
gameSetting.ocarina = (gameSetting.ocarina) ? 0 : 1; // Clicked the Ocarina button, toggle state
}
else if (Button_Select(&gvidtvonButton, pointer.p_x, pointer.p_y) || Button_Select(&gvidtvoffButton, pointer.p_x, pointer.p_y))
{
gameSetting.vipatch = (gameSetting.vipatch) ? 0 : 1; // Clicked the VIPATCH button, toggle state
}
else if (Button_Select(&glangdownButton, pointer.p_x, pointer.p_y))
{ // Clicked on the language buttons
if (gameSetting.language > 0)
{
gameSetting.language --;
}
else
{
gameSetting.language = (CFG_LANG_COUNT - 1);
}
}
else if (Button_Select(&glangupButton, pointer.p_x, pointer.p_y))
{
if (gameSetting.language < (CFG_LANG_COUNT - 1))
{
gameSetting.language ++;
}
else
{
gameSetting.language = 0;
}
}
else if (Button_Select(&ghookdownButton, pointer.p_x, pointer.p_y))
{ // Clicked on the hooktype buttons
if (gameSetting.hooktype > 0)
{
gameSetting.hooktype --;
}
else
{
gameSetting.hooktype = (CFG_HOOK_COUNT - 1);
}
}
else if (Button_Select(&ghookupButton, pointer.p_x, pointer.p_y))
{
if (gameSetting.hooktype < (CFG_HOOK_COUNT - 1))
{
gameSetting.hooktype ++;
}
else
{
gameSetting.hooktype = 0;
}
}
else if (Button_Select(&gviddownButton, pointer.p_x,pointer.p_y))
{
// Clicked on the video down button
if (gameSetting.video > 0)
{
gameSetting.video --;
}
else
{
gameSetting.video = (CFG_VIDEO_COUNT -1);
}
}
else if (Button_Select(&gvidupButton, pointer.p_x,pointer.p_y))
{
// Clicked on the video up button
if (gameSetting.video <(CFG_VIDEO_COUNT -1))
{
gameSetting.video ++;
}
else
{
gameSetting.video = 0;
}
}
}
GRRLIB_FillScreen(0x000000FF);
GRRLIB_DrawImg(64, 110, load_bg_texture, 0, 1, 1, 0xFFFFFFFF);
gbackButton.x = 474;
gbackButton.y = 320;
Button_Paint(&gbackButton);
Button_Paint(&glangupButton);
Button_Paint(&glangdownButton);
Button_Paint(&gvidupButton);
Button_Paint(&gviddownButton);
Button_Paint(&ghookupButton);
Button_Paint(&ghookdownButton);
Button_Toggle_Paint(&gcheatoffButton, &gcheatonButton, gameSetting.ocarina);
Button_Toggle_Paint(&gvidtvoffButton, &gvidtvonButton, gameSetting.vipatch);
Button_Hover(&gbackButton, pointer.p_x, pointer.p_y);
Button_Hover(&glangupButton, pointer.p_x, pointer.p_y);
Button_Hover(&glangdownButton, pointer.p_x, pointer.p_y);
Button_Hover(&gvidupButton, pointer.p_x, pointer.p_y);
Button_Hover(&gviddownButton, pointer.p_x, pointer.p_y);
Button_Hover(&gcheatoffButton, pointer.p_x, pointer.p_y);
Button_Hover(&gcheatonButton, pointer.p_x, pointer.p_y);
Button_Hover(&gvidtvoffButton, pointer.p_x, pointer.p_y);
Button_Hover(&gvidtvonButton, pointer.p_x, pointer.p_y);
Button_Hover(&ghookupButton, pointer.p_x, pointer.p_y);
Button_Hover(&ghookdownButton, pointer.p_x, pointer.p_y);
//BUTTON TEXT
GRRLIB_Printf(89, 145, font_title, settings.fontColor, 1, localStr("M036", "%s settings"), gameName);
GRRLIB_Printf(169, 193, font_texture, settings.fontColor, 1, localStr("M135", "Ocarina:"));
GRRLIB_Printf(334, 193, font_texture, settings.fontColor, 1, localStr("M037", "Hook:"));
GRRLIB_Printf(409, 193, font_texture, 0xFFFFFFFF, 1, "%s",ghooks[gameSetting.hooktype]);
GRRLIB_Printf(169, 228, font_texture, settings.fontColor, 1, localStr("M038", "Language:"));
GRRLIB_Printf(354, 228, font_texture, 0xFFFFFFFF, 1, "%s",glanguages[gameSetting.language]);
GRRLIB_Printf(169, 257, font_texture, settings.fontColor, 1, localStr("M039", "Video mode:"));
GRRLIB_Printf(354, 255, font_texture, 0xFFFFFFFF, 1, "%s",gvidmodes[gameSetting.video]);
GRRLIB_Printf(169, 289, font_texture, settings.fontColor, 1, localStr("M040", "VIDTV patch:"));
// Draw the default pointer hand
if(doloop)
DrawCursor(0, pointer.p_x, pointer.p_y, pointer.p_ang, 1, 1, 0xFFFFFFFF);
// Check for button-pointer intersections, and rumble
if ((Button_Hover(&gbackButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&glangupButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&glangdownButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gvidupButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gviddownButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gcheatoffButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gcheatonButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gvidtvoffButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&gvidtvonButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&ghookupButton, pointer.p_x, pointer.p_y) ||
Button_Hover(&ghookdownButton, pointer.p_x, pointer.p_y)))
{
// Should we be rumbling?
if (--self.rumbleAmt > 0)
{
if(settings.rumble)
WPAD_Rumble(0,1); // Turn on Wiimote rumble
}
else
WPAD_Rumble(0,0); // Kill the rumble
}
else
{ // If no button is being hovered, kill the rumble
WPAD_Rumble(0,0);
self.rumbleAmt = 5;
}
GRRLIB_Render();
}while(doloop);
return;
}
void freeResources(){
free(pointer_texture.data);
free(pointer_shadow_texture.data);
free(cover_texture.data);
free(back_texture.data);
free(empty_texture.data);
free(no_disc_texture.data);
free(current_cover_texture.data);
free(font_texture.data);
free(font_title.data);
free(font_title_small.data);
free(progress_texture.data);
GRRLIB_FillScreen(0x000000FF);
GRRLIB_Render();
GRRLIB_FillScreen(0x000000FF);
GRRLIB_Render();
GRRLIB_FillScreen(0x000000FF);
GRRLIB_Render();
GRRLIB_FillScreen(0x000000FF);
GRRLIB_Render();
GRRLIB_Exit();
}
bool CoverHoverCenter()
{
float fx_min, fx_max, fy_min, fy_max; // these will hold our calculated edge coords at the appropriate zoom level
float cur_zoom = settings.coverZoom; // our current zoom level
float zoom_in = 0.69; // max zoom in value
float zoom_out = -8.0; // max zoom out value
float xmin_zoomin = 172.0; // the follow can be fine tuned... or probably calculated from the texture size... TODO
float xmin_zoomout = 231.0;
float xmax_zoomin = 386.0;
float xmax_zoomout = 329.0;
float ymin_zoomin = 40.0;
float ymin_zoomout = 127.0;
float ymax_zoomin = 360.0;
float ymax_zoomout = 270.0;
fx_min = change_scale(cur_zoom, zoom_out, zoom_in, xmin_zoomout, xmin_zoomin);
fx_max = change_scale(cur_zoom, zoom_out, zoom_in, xmax_zoomout, xmax_zoomin);
fy_min = change_scale(cur_zoom, zoom_out, zoom_in, ymin_zoomout, ymin_zoomin);
fy_max = change_scale(cur_zoom, zoom_out, zoom_in, ymax_zoomout, ymax_zoomin);
#ifdef TEST_MODE
return true;
#endif
if (pointer.p_x > fx_min && pointer.p_x < fx_max && pointer.p_y > fy_min && pointer.p_y < fy_max)
return true;
else
return false;
}
bool CoverHoverLeft()
{
float fx_l_edge, fy_min, fy_max; // these will hold our calculated edge coords at the appropriate zoom level
float cur_zoom = settings.coverZoom; // our current zoom level
float zoom_out = -8.0; // max zoom in value
float zoom_in = 0.69; // max zoom out value
float xedge_zoomin = 130.0; // the follow can be fine tuned... or probably calculated from the texture size... TODO
float xedge_zoomout = 206.0;
float ymin_zoomin = 40.0;
float ymin_zoomout = 127.0;
float ymax_zoomin = 360.0;
float ymax_zoomout = 270.0;
fx_l_edge = change_scale(cur_zoom, zoom_out, zoom_in, xedge_zoomout, xedge_zoomin);
fy_min = change_scale(cur_zoom, zoom_out, zoom_in, ymin_zoomout, ymin_zoomin);
fy_max = change_scale(cur_zoom, zoom_out, zoom_in, ymax_zoomout, ymax_zoomin);
if (pointer.p_x < fx_l_edge && pointer.p_y > fy_min && pointer.p_y < fy_max)
return true;
else
return false;
}
bool CoverHoverRight()
{
float fx_r_edge, fy_min, fy_max; // these will hold our calculated edge coords at the appropriate zoom level
float cur_zoom = settings.coverZoom; // our current zoom level
float zoom_out = -8.0; // max zoom in value
float zoom_in = 0.69; // max zoom out value
float xedge_zoomin = 430.0; // the follow can be fine tuned... or probably calculated from the texture size... TODO
float xedge_zoomout = 350.0;
float ymin_zoomin = 40.0;
float ymin_zoomout = 127.0;
float ymax_zoomin = 360.0;
float ymax_zoomout = 270.0;
fx_r_edge = change_scale(cur_zoom, zoom_out, zoom_in, xedge_zoomout, xedge_zoomin);
fy_min = change_scale(cur_zoom, zoom_out, zoom_in, ymin_zoomout, ymin_zoomin);
fy_max = change_scale(cur_zoom, zoom_out, zoom_in, ymax_zoomout, ymax_zoomin);
if (pointer.p_x > fx_r_edge && pointer.p_y > fy_min && pointer.p_y < fy_max)
return true;
else
return false;
}, but it isn't showing up... Is there a correct place to put it?
Offline