[Gamecube/Wii]

---------------
* added message box when inputs config uses disconnected controllers.
* added message box when settings are reseted to default on startup.
* fixed default inputs configuration.
* fixed memory leak in Cheat Menu causing spurious resets.
* added an option to enable/disable automatic cheat activation
* increased max number of cheat codes
* optimized cheat codes requiring RAM patching.
* improved default horizontal scaling to better match output from a real Mega Drive

[Gamecube specific]
---------------
* fixed inverted keys in cheat menu.

[Wii specific]
---------------
* added the possibility for any wiimotes to be used as input device, regardless of the connected expansion controller.
This commit is contained in:
ekeeke31 2010-12-04 17:15:36 +00:00
parent a4cfc2a77a
commit 39920979d2
8 changed files with 581 additions and 303 deletions

View File

@ -21,24 +21,11 @@
*
***************************************************************************/
#include "shared.h"
#include "gui.h"
#include "menu.h"
#include "file_load.h"
void config_save(void)
{
/* open configuration file */
char fname[MAXPATHLEN];
sprintf (fname, "%s/config.ini", DEFAULT_PATH);
FILE *fp = fopen(fname, "wb");
if (fp)
{
/* write file */
fwrite(&config, sizeof(config), 1, fp);
fclose(fp);
}
}
void config_load(void)
static int config_load(void)
{
/* open configuration file */
char fname[MAXPATHLEN];
@ -51,7 +38,7 @@ void config_load(void)
fread(version, 16, 1, fp);
fclose(fp);
if (strncmp(version,CONFIG_VERSION,16))
return;
return 0;
/* read file */
fp = fopen(fname, "rb");
@ -59,8 +46,24 @@ void config_load(void)
{
fread(&config, sizeof(config), 1, fp);
fclose(fp);
return 1;
}
}
return 0;
}
void config_save(void)
{
/* open configuration file */
char fname[MAXPATHLEN];
sprintf (fname, "%s/config.ini", DEFAULT_PATH);
FILE *fp = fopen(fname, "wb");
if (fp)
{
/* write file */
fwrite(&config, sizeof(config), 1, fp);
fclose(fp);
}
}
void config_default(void)
@ -129,6 +132,7 @@ void config_default(void)
/* menu options */
config.autoload = 0;
config.autocheat = 0;
#ifdef HW_RVL
config.s_auto = 1;
#else
@ -152,11 +156,13 @@ void config_default(void)
sprintf (config.lastdir[TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH);
#endif
/* restore from config file */
config_load();
io_init();
/* try to restore settings from config file */
if (!config_load()) GUI_WaitPrompt("Info","Default Settings restored");
/* default menu settings */
/* restore inputs */
input_init();
/* restore menu settings */
menu_configure();
}

View File

@ -24,7 +24,7 @@
#ifndef _CONFIG_H_
#define _CONFIG_H_
#define CONFIG_VERSION "GENPLUS-GX 1.4.0"
#define CONFIG_VERSION "GENPLUS-GX 1.4.1"
/****************************************************************************
* Config Option
@ -75,9 +75,11 @@ typedef struct
uint32 wpad_keymap[4*3][MAX_KEYS];
#endif
uint8 autoload;
uint8 autocheat;
uint8 s_auto;
uint8 s_default;
uint8 s_device;
uint8 autocheats;
int8 bg_type;
int8 bg_overlay;
int16 screen_w;
@ -95,7 +97,6 @@ t_config config;
extern void config_save(void);
extern void config_load(void);
extern void config_default(void);

View File

@ -34,6 +34,9 @@
#define BG_COLOR_1 {0x49,0x49,0x49,0xff}
#define BG_COLOR_2 {0x66,0x66,0x66,0xff}
#define MAX_CHEATS (250)
#define MAX_DESC_LENGTH (63)
#ifdef HW_RVL
extern const u8 Key_Minus_wii_png[];
extern const u8 Key_Plus_wii_png[];
@ -46,8 +49,8 @@ extern const u8 Key_DPAD_png[];
typedef struct
{
char code[12];
char text[36];
u16 enable;
char text[MAX_DESC_LENGTH];
u8 enable;
u16 data;
u16 old;
u32 address;
@ -59,23 +62,44 @@ static void clear_cheats(void);
static void cheatmenu_cb(void);
static void switch_chars(void);
static int selection = 0;
static int maxcheats = 0;
static int string_offset = 0;
static int selection = 0;
static int offset = 0;
static int type = 0;
static int patchRAM =0;
static int maxcheats = 0;
static int maxRAMcheats = 0;
static CHEATENTRY cheatlist[10];
static CHEATENTRY cheatlist[MAX_CHEATS];
static u8 RAMcheatlist[MAX_CHEATS];
/*****************************************************************************/
/* GUI Buttons data */
/*****************************************************************************/
static butn_data arrow_up_data =
{
{NULL,NULL},
{Button_up_png,Button_up_over_png}
};
static butn_data arrow_down_data =
{
{NULL,NULL},
{Button_down_png,Button_down_over_png}
};
static butn_data button_digit_data =
{
{NULL,NULL},
{Button_digit_png,Button_digit_over_png}
};
/*****************************************************************************/
/* GUI Arrows button */
/*****************************************************************************/
static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32};
static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32};
/*****************************************************************************/
/* GUI helpers */
/*****************************************************************************/
@ -145,7 +169,7 @@ static gui_item items_cheats[30] =
/*****************************************************************************/
static gui_butn buttons_cheats[30] =
{
{NULL, BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{0,0,0,0},15,108,358,26},
{NULL, BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,108,358,26},
{NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,134,358,26},
{NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,160,358,26},
{NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,186,358,26},
@ -189,7 +213,7 @@ static gui_menu menu_cheats =
buttons_cheats,
bg_cheats,
{&action_cancel, &action_select},
{NULL,NULL},
{&arrow_up,&arrow_down},
cheatmenu_cb
};
@ -290,8 +314,8 @@ static u32 decode_cheat(char *string, u32 *address, u32 *data)
static void apply_cheats(void)
{
/* clear RAM patch flag */
patchRAM = 0;
/* clear RAM patches counter */
maxRAMcheats = 0;
int i;
for (i = 0; i < maxcheats; i++)
@ -307,7 +331,7 @@ static void apply_cheats(void)
else if (cheatlist[i].address >= 0xFF0000)
{
/* patch RAM data */
patchRAM = 1;
RAMcheatlist[maxRAMcheats++] = i;
}
}
}
@ -450,7 +474,7 @@ static void cheatmenu_cb(void)
int yoffset = 108;
gui_image bar_over;
gui_image star;
char temp[36];
char temp[MAX_DESC_LENGTH];
/* Initialize textures */
bar_over.texture = gxTextureOpenPNG(Overlay_bar_png,0);
@ -469,7 +493,7 @@ static void cheatmenu_cb(void)
gxDrawRectangle(15, 342, 358, 26, 127, (GXColor)BG_COLOR_2);
/* Draw Cheat list */
for (i=0; i<maxcheats; i++)
for (i=0; ((offset + i) < maxcheats) && (i < 10); i++)
{
if (i == selection)
{
@ -483,24 +507,24 @@ static void cheatmenu_cb(void)
if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE)
{
/* adjust offset so that last characters are visible */
string_offset += FONT_writeCenter(cheatlist[i].text+string_offset,16,40,366,yoffset+21,(GXColor)WHITE);
string_offset += FONT_writeCenter(cheatlist[offset + i].text+string_offset,16,40,366,yoffset+21,(GXColor)WHITE);
}
else
{
/* scroll text (speed = 1/10 frame) */
if ((string_offset/10) >= strlen(cheatlist[i].text))
if ((string_offset/10) >= strlen(cheatlist[offset + i].text))
{
string_offset = 0;
}
if (string_offset)
{
sprintf(temp,"%s ",cheatlist[i].text+string_offset/10);
strncat(temp, cheatlist[i].text, string_offset/10);
sprintf(temp,"%s ",cheatlist[offset + i].text+string_offset/10);
strncat(temp, cheatlist[offset + i].text, string_offset/10);
}
else
{
strcpy(temp, cheatlist[i].text);
strcpy(temp, cheatlist[offset + i].text);
}
if (FONT_writeCenter(temp,16,40,366,yoffset+21,(GXColor)WHITE))
@ -512,23 +536,23 @@ static void cheatmenu_cb(void)
}
else
{
FONT_writeCenter(cheatlist[i].code,18,40,366,yoffset+22,(GXColor)WHITE);
FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE);
}
}
else
{
if (type)
{
FONT_writeCenter(cheatlist[i].text,16,40,366,yoffset+21,(GXColor)WHITE);
FONT_writeCenter(cheatlist[offset + i].text,16,40,366,yoffset+21,(GXColor)WHITE);
}
else
{
FONT_writeCenter(cheatlist[i].code,18,40,366,yoffset+22,(GXColor)WHITE);
FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE);
}
}
/* draw cheat enable mark */
if (cheatlist[i].enable)
if (cheatlist[offset + i].enable)
{
gxDrawTexture(star.texture,20,yoffset+5,16,16,255);
}
@ -537,9 +561,9 @@ static void cheatmenu_cb(void)
}
/* New Entry */
if (maxcheats < 10)
if (i < 10)
{
if (maxcheats == selection)
if (i == selection)
{
/* selection bar */
gxDrawTexture(bar_over.texture,16,yoffset+1,356,24,255);
@ -547,7 +571,7 @@ static void cheatmenu_cb(void)
/* check if new code is being edited */
if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE)
{
FONT_writeCenter(cheatlist[selection].code,18,40,366,yoffset+22,(GXColor)WHITE);
FONT_writeCenter(cheatlist[offset + selection].code,18,40,366,yoffset+22,(GXColor)WHITE);
}
else
{
@ -561,6 +585,7 @@ static void cheatmenu_cb(void)
}
gxTextureClose(&bar_over.texture);
gxTextureClose(&star.texture);
/* Extra helpers */
if (maxcheats && !(menu_cheats.bg_images[6].state & IMAGE_VISIBLE))
@ -578,7 +603,7 @@ static void cheatmenu_cb(void)
gxTextureClose(&key_switch.texture);
/* delete & enable cheats */
if (menu_cheats.selected < maxcheats)
if ((offset + selection) < maxcheats)
{
gui_image key_enable;
gui_image key_delete;
@ -588,14 +613,14 @@ static void cheatmenu_cb(void)
gxDrawTexture(key_delete.texture,152,424,24,24,255);
gxDrawTexture(key_enable.texture,372,424,24,24,255);
FONT_write("Delete\nCheat",16,184,436,640,(GXColor)WHITE);
FONT_write(cheatlist[selection].enable ? "Disable\nCheat":"Enable\nCheat",16,404,436,640,(GXColor)WHITE);
FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,404,436,640,(GXColor)WHITE);
#else
key_enable.texture = gxTextureOpenPNG(Key_L_gcn_png,0);
key_delete.texture = gxTextureOpenPNG(Key_R_gcn_png,0);
key_delete.texture = gxTextureOpenPNG(Key_L_gcn_png,0);
key_enable.texture = gxTextureOpenPNG(Key_R_gcn_png,0);
gxDrawTexture(key_delete.texture,136,426,44,20,255);
gxDrawTexture(key_enable.texture,368,426,44,20,255);
FONT_write("Delete\nCheat",16,188,436,640,(GXColor)WHITE);
FONT_write(cheatlist[selection].enable ? "Disable\nCheat":"Enable\nCheat",16,420,436,640,(GXColor)WHITE);
FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,420,436,640,(GXColor)WHITE);
#endif
gxTextureClose(&key_enable.texture);
gxTextureClose(&key_delete.texture);
@ -613,7 +638,7 @@ static void cheatmenu_cb(void)
void CheatMenu(void)
{
int i, update = 0;
int offset = 0;
int digit_cnt = 0;
int max = 0;
char temp[256];
char *str = NULL;
@ -623,6 +648,9 @@ void CheatMenu(void)
/* clear existing ROM patches */
clear_cheats();
/* reset scrolling */
string_offset = 0;
/* background type */
if (config.bg_type > 0)
{
@ -668,13 +696,35 @@ void CheatMenu(void)
while (update != -1)
{
/* update arrows buttons */
if (offset > 0) m->arrows[0]->state |= BUTTON_VISIBLE;
else m->arrows[0]->state &= ~BUTTON_VISIBLE;
if ((offset + 10) < (maxcheats + 1)) m->arrows[1]->state |= BUTTON_VISIBLE;
else m->arrows[1]->state &= ~BUTTON_VISIBLE;
/* draw menu */
GUI_DrawMenu(m);
/* restore cheats offset */
if (!(menu_cheats.bg_images[6].state & IMAGE_VISIBLE))
{
m->offset = offset;
m->max_items = maxcheats + 1;
m->max_buttons = 10;
}
/* update menu */
update = GUI_UpdateMenu(m);
/* update selection */
/* save offset then restore default */
if (!(menu_cheats.bg_images[6].state & IMAGE_VISIBLE))
{
offset = m->offset;
m->offset = 0;
m->max_items = m->max_buttons = 30;
}
/* update selected cheat */
if ((m->selected < 10) && (selection != m->selected))
{
selection = m->selected;
@ -697,17 +747,17 @@ void CheatMenu(void)
case 8:
case 9: /* Edit cheat */
{
if (type && (selection != maxcheats))
if (type && ((selection + offset) != maxcheats))
{
/* cheat description */
str = cheatlist[selection].text;
str = cheatlist[offset + selection].text;
strcpy(temp, str);
max = 34;
offset = strlen(str);
if (offset <= max)
max = MAX_DESC_LENGTH - 2;
digit_cnt = strlen(str);
if (digit_cnt <= max)
{
str[offset] = '*';
str[offset+1] = 0;
str[digit_cnt] = '*';
str[digit_cnt+1] = 0;
}
/* init specific characters */
@ -719,13 +769,13 @@ void CheatMenu(void)
else
{
/* cheat code */
str = cheatlist[selection].code;
str = cheatlist[offset + selection].code;
strcpy(temp, str);
if (selection == maxcheats)
if ((offset + selection) == maxcheats)
{
/* initialize code */
max = 0;
offset = 0;
digit_cnt = 0;
str[0] = '*';
str[1] = 0;
}
@ -742,7 +792,7 @@ void CheatMenu(void)
/* AR code */
max = 10;
}
offset = max + 1;
digit_cnt = max + 1;
}
/* init specific characters */
@ -761,6 +811,10 @@ void CheatMenu(void)
/* disable left buttons */
for (i=0; i<10; i++) m->buttons[i].state &= ~BUTTON_ACTIVE;
/* disable arrow buttons */
m->arrows[0]->state &= ~BUTTON_ACTIVE;
m->arrows[1]->state &= ~BUTTON_ACTIVE;
/* slide in right window */
GUI_DrawMenuFX(m,20,0);
@ -777,20 +831,20 @@ void CheatMenu(void)
case 26: /* Backspace */
{
if (offset > 0)
if (digit_cnt > 0)
{
/* delete last character */
str[offset--] = 0;
str[digit_cnt--] = 0;
/* code separator is being deleted */
if ((str[offset] == ':') || (str[offset] == '-'))
if ((str[digit_cnt] == ':') || (str[digit_cnt] == '-'))
{
/* reset detected code type */
max = 0;
}
/* edit mark */
str[offset] = '*';
str[digit_cnt] = '*';
/* update scroll value if necessary */
if (string_offset > 0) string_offset--;
@ -800,17 +854,17 @@ void CheatMenu(void)
case 27:
{
if (type && (selection != maxcheats))
if (type && ((offset + selection) != maxcheats))
{
/* SPACE character */
if (offset <= max)
if (digit_cnt <= max)
{
str[offset++] = ' ';
str[offset] = 0;
if (offset <= max)
str[digit_cnt++] = ' ';
str[digit_cnt] = 0;
if (digit_cnt <= max)
{
str[offset] = '*';
str[offset+1] = 0;
str[digit_cnt] = '*';
str[digit_cnt+1] = 0;
}
}
}
@ -819,23 +873,23 @@ void CheatMenu(void)
/* Separator character (only if code type has not yet been determined) */
if (max == 0)
{
if (offset == 4)
if (digit_cnt == 4)
{
/* GG code */
max = 8;
str[4] = '-';
str[5] = '*';
str[6] = 0;
offset++;
digit_cnt++;
}
else if (offset == 6)
else if (digit_cnt == 6)
{
/* AR code */
max = 10;
str[6] = ':';
str[7] = '*';
str[8] = 0;
offset++;
digit_cnt++;
}
}
}
@ -853,31 +907,31 @@ void CheatMenu(void)
case 29: /* Validate entry */
{
/* check if entry is valid */
if (type && (selection != maxcheats))
if (type && ((offset + selection) != maxcheats))
{
str[offset] = 0;
str[digit_cnt] = 0;
update = -1;
}
else if (max && (offset > max))
else if (max && (digit_cnt > max))
{
address = data = 0;
if (decode_cheat(cheatlist[selection].code, &address, &data))
if (decode_cheat(cheatlist[offset + selection].code, &address, &data))
{
/* update cheat address & data values */
cheatlist[selection].address = address;
cheatlist[selection].data = data;
cheatlist[offset + selection].address = address;
cheatlist[offset + selection].data = data;
/* new cheat ? */
if (selection == maxcheats)
if ((offset + selection) == maxcheats)
{
/* increase cheat count */
maxcheats++;
/* enable cheat by default */
cheatlist[selection].enable = 1;
cheatlist[offset + selection].enable = 1;
/* no description by default */
strcpy(cheatlist[selection].text,"No Description");
strcpy(cheatlist[offset + selection].text,"No Description");
}
/* return to cheat selection */
@ -894,17 +948,17 @@ void CheatMenu(void)
default: /* Add Character */
{
/* force code separator if none has been set yet */
if ((max == 0) && (offset == 6)) break;
if ((max == 0) && (digit_cnt == 6)) break;
/* add character */
if ((offset <= max) || (max == 0))
if ((digit_cnt <= max) || (max == 0))
{
str[offset++] = m->items[m->selected].text[0];
str[offset] = 0;
if ((offset <= max) || (max == 0))
str[digit_cnt++] = m->items[m->selected].text[0];
str[digit_cnt] = 0;
if ((digit_cnt <= max) || (max == 0))
{
str[offset] = '*';
str[offset+1] = 0;
str[digit_cnt] = '*';
str[digit_cnt+1] = 0;
}
if (string_offset > 0) string_offset ++;
}
@ -933,13 +987,13 @@ void CheatMenu(void)
string_offset = 0;
}
if (selection < maxcheats)
if ((offset + selection) < maxcheats)
{
/* Special inputs */
if (m_input.keys & PAD_TRIGGER_L)
{
/* sort cheat list */
for (i = selection + 1; i < maxcheats; i++)
for (i = offset + selection + 1; i < maxcheats; i++)
{
strcpy(cheatlist[i-1].text,cheatlist[i].text);
strcpy(cheatlist[i-1].code,cheatlist[i].code);
@ -956,10 +1010,10 @@ void CheatMenu(void)
cheatlist[maxcheats-1].enable = 0;
/* disable last button */
if (maxcheats < 10)
if ((maxcheats - offset) < 10)
{
m->buttons[maxcheats].state &= ~BUTTON_ACTIVE;
m->buttons[maxcheats - 1].shift[1] = 0;
m->buttons[maxcheats - offset].state &= ~BUTTON_ACTIVE;
m->buttons[maxcheats - offset - 1].shift[1] = 0;
}
/* decrease cheat count */
@ -971,7 +1025,7 @@ void CheatMenu(void)
else if (m_input.keys & PAD_TRIGGER_R)
{
/* cheat ON/OFF */
cheatlist[selection].enable ^= 1;
cheatlist[offset + selection].enable ^= 1;
}
}
}
@ -990,22 +1044,29 @@ void CheatMenu(void)
/* hide right window */
m->bg_images[6].state &= ~IMAGE_VISIBLE;
/* enable left buttons */
for (i=0; i<maxcheats; i++)
/* update left buttons */
for (i=0; i<10; i++)
{
m->buttons[i].state |= BUTTON_ACTIVE;
m->buttons[i].shift[1] = 1;
if ((offset + i) < maxcheats)
{
m->buttons[i].state |= BUTTON_ACTIVE;
m->buttons[i].shift[1] = 1;
}
else if ((offset + i) == maxcheats)
{
m->buttons[i].state |= BUTTON_ACTIVE;
m->buttons[i].shift[1] = 0;
}
else
{
m->buttons[i].state &= ~BUTTON_ACTIVE;
m->buttons[i].shift[1] = 0;
}
}
if (maxcheats < 10)
{
m->buttons[maxcheats].state |= BUTTON_ACTIVE;
m->buttons[maxcheats].shift[1] = 0;
}
else
{
m->buttons[9].shift[1] = 0;
}
/* enable arrow buttons */
m->arrows[0]->state |= BUTTON_ACTIVE;
m->arrows[1]->state |= BUTTON_ACTIVE;
/* restore helper */
strcpy(action_cancel.comment,"Back");
@ -1075,7 +1136,7 @@ void CheatLoad(void)
char temp[256];
/* reset cheat count */
selection = maxcheats = 0;
maxcheats = 0;
/* make cheat filename */
sprintf(temp, "%s/cheats/%s.pat", DEFAULT_PATH, rom_filename);
@ -1088,7 +1149,7 @@ void CheatLoad(void)
memset(temp, 0, 256);
/* read cheats from file (one line per cheat) */
while (fgets(temp, 256, f) && (maxcheats < 10) && (cnt < 10))
while (fgets(temp, 256, f) && (maxcheats < MAX_CHEATS) && (cnt < MAX_CHEATS))
{
/* remove CR & EOL chars */
if ((temp[strlen(temp) - 2] == 0x0d) || (temp[strlen(temp) - 2] == 0x0a)) temp[strlen(temp) - 2] = 0;
@ -1113,18 +1174,18 @@ void CheatLoad(void)
while ((temp[len] == 0x20) || (temp[len] == 0x09)) len++;
/* copy cheat description */
strncpy(cheatlist[maxcheats].text, &temp[len], 35);
cheatlist[maxcheats].text[35] = 0;
strncpy(cheatlist[maxcheats].text, &temp[len], MAX_DESC_LENGTH - 1);
cheatlist[maxcheats].text[MAX_DESC_LENGTH - 1] = 0;
/* increment cheat count */
maxcheats++;
}
else if (!strncmp(temp,"ON",2))
else if (!strcmp(temp,"ON") && config.autocheat)
{
/* enable flag */
cheatlist[cnt++].enable = 1;
}
else if (!strncmp(temp,"OFF",3))
else if (!strcmp(temp,"OFF") && config.autocheat)
{
/* disable flag */
cheatlist[cnt++].enable = 0;
@ -1142,20 +1203,27 @@ void CheatLoad(void)
apply_cheats();
/* adjust menu buttons */
for (cnt=0; cnt<maxcheats; cnt++)
for (cnt=0; cnt<10; cnt++)
{
menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE;
menu_cheats.buttons[cnt].shift[1] = 1;
}
if (maxcheats < 10)
{
menu_cheats.buttons[maxcheats].state |= BUTTON_ACTIVE;
menu_cheats.buttons[maxcheats].shift[1] = 0;
}
else
{
menu_cheats.buttons[9].shift[1] = 0;
if (cnt < maxcheats)
{
menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE;
menu_cheats.buttons[cnt].shift[1] = 1;
}
else if (cnt == maxcheats)
{
menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE;
menu_cheats.buttons[cnt].shift[1] = 0;
}
else
{
menu_cheats.buttons[cnt].shift[1] = 0;
menu_cheats.buttons[cnt].state &= ~BUTTON_ACTIVE;
}
}
/* reset menu */
selection = offset = 0;
}
/****************************************************************************
@ -1166,24 +1234,23 @@ void CheatLoad(void)
****************************************************************************/
void CheatUpdate(void)
{
if (patchRAM)
int index, cnt = maxRAMcheats;
while (cnt)
{
int i;
for (i = 0; i < maxcheats; i++)
/* get cheat index */
index = RAMcheatlist[--cnt];
/* apply RAM patch */
if (cheatlist[index].data & 0xFF00)
{
if (cheatlist[i].enable && (cheatlist[i].address >= 0xFF0000))
{
if (cheatlist[i].data & 0xFF00)
{
/* word patch */
*(u16 *)(work_ram + (cheatlist[i].address & 0xFFFE)) = cheatlist[i].data;
}
else
{
/* byte patch */
work_ram[cheatlist[i].address & 0xFFFF] = cheatlist[i].data;
}
}
/* word patch */
*(u16 *)(work_ram + (cheatlist[index].address & 0xFFFE)) = cheatlist[index].data;
}
else
{
/* byte patch */
work_ram[cheatlist[index].address & 0xFFFF] = cheatlist[index].data;
}
}
}

View File

@ -743,7 +743,7 @@ int GUI_UpdateMenu(gui_menu *menu)
if (selected >= max_buttons)
{
selected = max_buttons - 1;
if ((menu->offset + selected < (max_items - 1)))
if ((menu->offset + selected) < (max_items - 1))
menu->offset ++;
}
}
@ -763,7 +763,7 @@ int GUI_UpdateMenu(gui_menu *menu)
if (selected >= max_buttons)
{
selected = max_buttons - 1;
if ((menu->offset + selected < (max_items - 1)))
if ((menu->offset + selected) < (max_items - 1))
menu->offset ++;
}
}
@ -826,24 +826,6 @@ int GUI_UpdateMenu(gui_menu *menu)
}
}
/* update arrows buttons status (items list) */
button = menu->arrows[0];
if (button)
{
if (menu->offset > 0)
button->state |= BUTTON_VISIBLE;
else
button->state &= ~BUTTON_VISIBLE;
}
button = menu->arrows[1];
if (button)
{
if ((menu->offset + max_buttons) < max_items)
button->state |= BUTTON_VISIBLE;
else
button->state &= ~BUTTON_VISIBLE;
}
if (ret > 0)
{
if (selected < max_buttons)
@ -871,6 +853,23 @@ int GUI_RunMenu(gui_menu *menu)
{
GUI_DrawMenu(menu);
update = GUI_UpdateMenu(menu);
/* update arrows buttons status (items list) */
if (menu->arrows[0])
{
if (menu->offset > 0)
menu->arrows[0]->state |= BUTTON_VISIBLE;
else
menu->arrows[0]->state &= ~BUTTON_VISIBLE;
}
if (menu->arrows[1])
{
if ((menu->offset + menu->max_buttons) < menu->max_items)
menu->arrows[1]->state |= BUTTON_VISIBLE;
else
menu->arrows[1]->state &= ~BUTTON_VISIBLE;
}
}
if (update == 2)
@ -1739,7 +1738,14 @@ static void *MsgBox_Thread(gui_message *message_box)
while (message_box->refresh)
{
/* draw parent menu */
GUI_DrawMenu(message_box->parent);
if (message_box->parent)
{
GUI_DrawMenu(message_box->parent);
}
else
{
gxClearScreen(bg_color);
}
/* draw window */
gxDrawTexture(message_box->window,166,160,message_box->window->width,message_box->window->height,230);
@ -1810,17 +1816,27 @@ void GUI_MsgBoxOpen(char *title, char *msg, bool throbber)
int ypos = 248;
/* disable helper comments */
if (message_box.parent->helpers[0])
message_box.parent->helpers[0]->data = 0;
if (message_box.parent->helpers[1])
message_box.parent->helpers[1]->data = 0;
if (message_box.parent)
{
if (message_box.parent->helpers[0])
message_box.parent->helpers[0]->data = 0;
if (message_box.parent->helpers[1])
message_box.parent->helpers[1]->data = 0;
}
/* slide in */
int yoffset = ywindow + message_box.window->height;
while (yoffset > 0)
{
/* draw parent menu */
GUI_DrawMenu(message_box.parent);
if (message_box.parent)
{
GUI_DrawMenu(message_box.parent);
}
else
{
gxClearScreen(bg_color);
}
/* draw window */
gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230);
@ -1866,7 +1882,14 @@ void GUI_MsgBoxClose(void)
while (yoffset < (ywindow + message_box.window->height))
{
/* draw parent menu */
GUI_DrawMenu(message_box.parent);
if (message_box.parent)
{
GUI_DrawMenu(message_box.parent);
}
else
{
gxClearScreen(bg_color);
}
/* draw window */
gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230);
@ -1887,14 +1910,22 @@ void GUI_MsgBoxClose(void)
yoffset += 60;
}
/* restore helper comment */
if (message_box.parent->helpers[0])
message_box.parent->helpers[0]->data = Key_B_png;
if (message_box.parent->helpers[1])
message_box.parent->helpers[1]->data = Key_A_png;
if (message_box.parent)
{
/* restore helper comment */
if (message_box.parent->helpers[0])
message_box.parent->helpers[0]->data = Key_B_png;
if (message_box.parent->helpers[1])
message_box.parent->helpers[1]->data = Key_A_png;
/* final position */
GUI_DrawMenu(message_box.parent);
}
else
{
gxClearScreen(bg_color);
}
/* final position */
GUI_DrawMenu(message_box.parent);
gxSetScreen();
/* clear all textures */

View File

@ -303,11 +303,11 @@ static gui_item items_load[4] =
/* Option menu */
static gui_item items_options[5] =
{
{NULL,Option_system_png,"","System settings", 114,142,80,92},
{NULL,Option_video_png ,"","Video settings", 288,150,64,84},
{NULL,Option_sound_png ,"","Audio settings", 464,154,44,80},
{NULL,Option_ctrl_png ,"","Input settings", 192,286,88,92},
{NULL,Option_menu_png ,"","Menu settings", 370,286,60,92}
{NULL,Option_system_png,"","System settings", 114,142,80,92},
{NULL,Option_video_png ,"","Video settings", 288,150,64,84},
{NULL,Option_sound_png ,"","Audio settings", 464,154,44,80},
{NULL,Option_ctrl_png ,"","Controllers settings", 192,286,88,92},
{NULL,Option_menu_png ,"","Menu settings", 370,286,60,92}
};
/* Audio options */
@ -361,16 +361,17 @@ static gui_item items_video[8] =
};
/* Menu options */
static gui_item items_prefs[8] =
static gui_item items_prefs[9] =
{
{NULL,NULL,"Load ROM Auto: OFF","Enable/Disable automatic ROM loading on startup", 56,132,276,48},
{NULL,NULL,"Auto Saves: OFF", "Enable/Disable automatic saves", 56,132,276,48},
{NULL,NULL,"Saves Device: FAT", "Configure default device for saves", 56,132,276,48},
{NULL,NULL,"SFX Volume: 100", "Adjust sound effects volume", 56,132,276,48},
{NULL,NULL,"BGM Volume: 100", "Adjust background music volume", 56,132,276,48},
{NULL,NULL,"BG Color: DEFAULT", "Select background color", 56,132,276,48},
{NULL,NULL,"BG Overlay: ON", "Enable/disable background overlay", 56,132,276,48},
{NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48},
{NULL,NULL,"Auto ROM Load: OFF","Enable/Disable automatic ROM loading on startup", 56,132,276,48},
{NULL,NULL,"Auto Cheats: OFF", "Enable/Disable automatic cheats activation", 56,132,276,48},
{NULL,NULL,"Auto Saves: OFF", "Enable/Disable automatic saves", 56,132,276,48},
{NULL,NULL,"Saves Device: FAT", "Configure default device for saves", 56,132,276,48},
{NULL,NULL,"SFX Volume: 100", "Adjust sound effects volume", 56,132,276,48},
{NULL,NULL,"BGM Volume: 100", "Adjust background music volume", 56,132,276,48},
{NULL,NULL,"BG Color: DEFAULT", "Select background color", 56,132,276,48},
{NULL,NULL,"BG Overlay: ON", "Enable/disable background overlay", 56,132,276,48},
{NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48},
};
/* Save Manager */
@ -587,7 +588,7 @@ static gui_menu menu_prefs =
{
"Menu Settings",
0,0,
8,4,6,0,
9,4,6,0,
items_prefs,
buttons_list,
bg_list,
@ -634,20 +635,21 @@ static void prefmenu ()
gui_menu *m = &menu_prefs;
gui_item *items = m->items;
sprintf (items[0].text, "Load ROM Auto: %s", config.autoload ? "ON":"OFF");
if (config.s_auto == 3) sprintf (items[1].text, "Auto Saves: ALL");
else if (config.s_auto == 2) sprintf (items[1].text, "Auto Saves: STATE ONLY");
else if (config.s_auto == 1) sprintf (items[1].text, "Auto Saves: SRAM ONLY");
else sprintf (items[1].text, "Auto Saves: NONE");
if (config.s_device == 1) sprintf (items[2].text, "Saves Device: MCARD A");
else if (config.s_device == 2) sprintf (items[2].text, "Saves Device: MCARD B");
else sprintf (items[2].text, "Saves Device: FAT");
sprintf (items[3].text, "SFX Volume: %1.1f", config.sfx_volume);
sprintf (items[4].text, "BGM Volume: %1.1f", config.bgm_volume);
if (config.bg_type) sprintf (items[5].text, "BG Type: COLOR %d", config.bg_type - 1);
else sprintf (items[5].text, "BG Type: DEFAULT");
sprintf (items[6].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
sprintf (items[7].text, "Screen Width: %d", config.screen_w);
sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF");
sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF");
if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL");
else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY");
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
else sprintf (items[2].text, "Auto Saves: NONE");
if (config.s_device == 1) sprintf (items[3].text, "Saves Device: MCARD A");
else if (config.s_device == 2) sprintf (items[3].text, "Saves Device: MCARD B");
else sprintf (items[3].text, "Saves Device: FAT");
sprintf (items[4].text, "SFX Volume: %1.1f", config.sfx_volume);
sprintf (items[5].text, "BGM Volume: %1.1f", config.bgm_volume);
if (config.bg_type) sprintf (items[6].text, "BG Type: COLOR %d", config.bg_type - 1);
else sprintf (items[6].text, "BG Type: DEFAULT");
sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
sprintf (items[8].text, "Screen Width: %d", config.screen_w);
GUI_InitMenu(m);
GUI_SlideMenuTitle(m,strlen("Menu "));
@ -658,57 +660,62 @@ static void prefmenu ()
switch (ret)
{
case 0: /* Auto load last ROM file */
case 0: /* Auto load last ROM file on startup */
config.autoload ^= 1;
sprintf (items[ret].text, "Load ROM Auto: %s", config.autoload ? "ON":"OFF");
sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF");
break;
case 1: /*** Auto load/save STATE & SRAM files ***/
case 1: /* Cheats automatic activation */
config.autocheat ^= 1;
sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF");
break;
case 2: /*** Auto load/save STATE & SRAM files ***/
config.s_auto = (config.s_auto + 1) % 4;
if (config.s_auto == 3) sprintf (items[ret].text, "Auto Saves: ALL");
else if (config.s_auto == 2) sprintf (items[ret].text, "Auto Saves: STATE ONLY");
else if (config.s_auto == 1) sprintf (items[ret].text, "Auto Saves: SRAM ONLY");
else sprintf (items[ret].text, "Auto Saves: NONE");
if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL");
else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY");
else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY");
else sprintf (items[2].text, "Auto Saves: NONE");
break;
case 2: /*** Default saves device ***/
case 3: /*** Default saves device ***/
config.s_device = (config.s_device + 1) % 3;
if (config.s_device == 1) sprintf (items[ret].text, "Saves Device: MCARD A");
else if (config.s_device == 2) sprintf (items[ret].text, "Saves Device: MCARD B");
else sprintf (items[ret].text, "Saves Device: FAT");
if (config.s_device == 1) sprintf (items[3].text, "Saves Device: MCARD A");
else if (config.s_device == 2) sprintf (items[3].text, "Saves Device: MCARD B");
else sprintf (items[3].text, "Saves Device: FAT");
break;
case 3: /*** Sound effects volume ***/
case 4: /*** Sound effects volume ***/
GUI_OptionBox(m,0,"SFX Volume",(void *)&config.sfx_volume,10.0,0.0,100.0,0);
sprintf (items[ret].text, "SFX Volume: %1.1f", config.sfx_volume);
sprintf (items[4].text, "SFX Volume: %1.1f", config.sfx_volume);
break;
case 4: /*** Background music volume ***/
case 5: /*** Background music volume ***/
GUI_OptionBox(m,update_bgm,"BGM Volume",(void *)&config.bgm_volume,10.0,0.0,100.0,0);
sprintf (items[ret].text, "BGM Volume: %1.1f", config.bgm_volume);
sprintf (items[5].text, "BGM Volume: %1.1f", config.bgm_volume);
break;
case 5: /*** Background type ***/
case 6: /*** Background type ***/
if (ret < 0) config.bg_type --;
else config.bg_type++;
if (config.bg_type < 0) config.bg_type = BG_COLOR_MAX;
else if (config.bg_type > BG_COLOR_MAX) config.bg_type = 0;
if (config.bg_type) sprintf (items[5].text, "BG Type: COLOR %d", config.bg_type - 1);
else sprintf (items[5].text, "BG Type: DEFAULT");
if (config.bg_type) sprintf (items[6].text, "BG Type: COLOR %d", config.bg_type - 1);
else sprintf (items[6].text, "BG Type: DEFAULT");
GUI_DeleteMenu(m);
menu_configure();
GUI_InitMenu(m);
break;
case 6: /*** Background overlay ***/
case 7: /*** Background overlay ***/
config.bg_overlay ^= 1;
sprintf (items[6].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF");
menu_configure();
break;
case 7: /*** Screen Width ***/
case 8: /*** Screen Width ***/
GUI_OptionBox(m,update_screen_w,"Screen Width",(void *)&config.screen_w,2,640,VI_MAX_WIDTH_NTSC,1);
sprintf (items[7].text, "Screen Width: %d", config.screen_w);
sprintf (items[8].text, "Screen Width: %d", config.screen_w);
break;
case -1:
@ -827,7 +834,6 @@ static void soundmenu ()
ret = 255;
if (cart.romsize)
{
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
@ -858,20 +864,17 @@ static void soundmenu ()
if (cart.romsize)
{
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
/* save YM2612 context */
memcpy(temp, YM2612GetContextPtr(), YM2612GetContextSize());
}
/* reinitialize audio timings */
audio_init(snd.sample_rate,snd.frame_rate);
sound_init();
/* reinitialize audio timings */
audio_init(snd.sample_rate,snd.frame_rate);
sound_init();
/* restore YM2612 context */
if (temp)
{
/* restore YM2612 context */
YM2612Restore(temp);
free(temp);
}
@ -889,21 +892,18 @@ static void soundmenu ()
if (cart.romsize)
{
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
/* save YM2612 context */
memcpy(temp, YM2612GetContextPtr(), YM2612GetContextSize());
}
/* reinitialize audio timings */
audio_init(snd.sample_rate,snd.frame_rate);
sound_init();
/* reinitialize audio timings */
audio_init(snd.sample_rate,snd.frame_rate);
sound_init();
/* restore YM2612 context */
if (temp)
{
//YM2612Restore(temp);
/* restore YM2612 context */
YM2612Restore(temp);
free(temp);
}
}
@ -1081,17 +1081,15 @@ static void systemmenu ()
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
memcpy(temp, YM2612GetContextPtr(), YM2612GetContextSize());
}
/* reinitialize all timings */
framerate = vdp_pal ? 50.0 : ((config.tv_mode == 1) ? 60.0 : ((config.render || interlaced) ? 59.94 : (1000000.0/16715.0)));
audio_init(snd.sample_rate, framerate);
system_init();
/* restore SRAM */
if (config.s_auto & 1)
slot_autoload(0,config.s_device);
/* restore YM2612 context */
if (temp)
{
@ -1099,13 +1097,18 @@ static void systemmenu ()
free(temp);
}
/* reinitialize HVC tables */
vctab = vdp_pal ? ((reg[1] & 8) ? vc_pal_240 : vc_pal_224) : vc_ntsc_224;
hctab = (reg[12] & 1) ? cycle2hc40 : cycle2hc32;
/* restore SRAM */
if (config.s_auto & 1)
{
slot_autoload(0,config.s_device);
}
/* reinitialize overscan area */
bitmap.viewport.x = (config.overscan & 2) ? ((reg[12] & 1) ? 16 : 12) : 0;
bitmap.viewport.y = (config.overscan & 1) ? (((reg[1] & 8) ? 0 : 8) + (vdp_pal ? 24 : 0)) : 0;
/* reinitialize VC max value */
vc_max = 0xEA + 24*vdp_pal;
if (reg[1] & 8)
{
vc_max += (28 - 20*vdp_pal);
}
}
break;
@ -1126,10 +1129,15 @@ static void systemmenu ()
sprintf (items[3].text, "System TMSS: %s", (config.tmss & 1) ? "ON":"OFF");
if (cart.romsize)
{
/* restart emulation */
system_init();
system_reset();
/* restore SRAM */
if (config.s_auto & 1)
{
slot_autoload(0,config.s_device);
}
}
break;
@ -1148,8 +1156,11 @@ static void systemmenu ()
if (cart.romsize)
{
/* restart emulation */
system_init();
system_reset();
/* restore SRAM */
if (config.s_auto & 1)
{
slot_autoload(0,config.s_device);
@ -1310,7 +1321,9 @@ static void videomenu ()
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
memcpy(temp, YM2612GetContextPtr(), YM2612GetContextSize());
}
/* reinitialize audio timings */
framerate = (config.tv_mode == 1) ? 60.0 : ((config.render || interlaced) ? 59.94 : (1000000.0/16715.0));
@ -1343,7 +1356,9 @@ static void videomenu ()
/* save YM2612 context */
temp = memalign(32,YM2612GetContextSize());
if (temp)
{
memcpy(temp, YM2612GetContextPtr(), YM2612GetContextSize());
}
/* reinitialize audio timings */
framerate = (config.tv_mode == 1) ? 60.0 : ((config.render || interlaced) ? 59.94 : (1000000.0/16715.0));
@ -1950,7 +1965,8 @@ static void ctrlmenu(void)
/* remove duplicate assigned inputs */
for (i=0; i<MAX_INPUTS; i++)
{
if ((i!=player) && (config.input[i].device == config.input[player].device) && (config.input[i].port == config.input[player].port))
if ((i!=player) && (config.input[i].port == config.input[player].port) &&
((config.input[i].device == config.input[player].device) || ((config.input[i].device * config.input[player].device) == 2)))
{
config.input[i].device = -1;
config.input[i].port = i%4;
@ -2057,7 +2073,7 @@ static void ctrlmenu(void)
/* no input device */
if (config.input[player].device < 0)
{
/* try gamecube controllers */
/* always try gamecube controllers first */
config.input[player].device = 0;
config.input[player].port = 0;
}
@ -2070,17 +2086,19 @@ static void ctrlmenu(void)
/* autodetect connected gamecube controllers */
if (config.input[player].device == 0)
{
/* find first connected controller */
exp = 0;
while ((config.input[player].port<4) && !exp)
while ((config.input[player].port < 4) && !exp)
{
exp = PAD_ScanPads() & (1<<config.input[player].port);
if (!exp) config.input[player].port ++;
}
/* no more gamecube controller */
if (config.input[player].port >= 4)
{
#ifdef HW_RVL
/* no gamecube controller found, try wiimote */
/* test wiimote */
config.input[player].port = 0;
config.input[player].device = 1;
#else
@ -2095,56 +2113,60 @@ static void ctrlmenu(void)
/* autodetect connected wiimotes (without nunchuk) */
if (config.input[player].device == 1)
{
exp = 4;
if (config.input[player].port<4)
/* test current port */
exp = 255;
if (config.input[player].port < 4)
{
WPAD_Probe(config.input[player].port,&exp);
if (exp == WPAD_EXP_NUNCHUK) exp = 4;
}
while ((config.input[player].port<4) && (exp == 4))
/* find first connected controller */
while ((config.input[player].port < 4) && (exp == 255))
{
/* try next port */
config.input[player].port ++;
if (config.input[player].port<4)
if (config.input[player].port < 4)
{
exp = 4;
exp = 255;
WPAD_Probe(config.input[player].port,&exp);
if (exp == WPAD_EXP_NUNCHUK) exp = 4;
}
}
/* no more wiimote */
if (config.input[player].port >= 4)
{
/* no wiimote (without nunchuk) found, try wiimote+nunchuks */
/* test wiimote+nunchuk */
config.input[player].port = 0;
config.input[player].device = 2;
}
}
/* autodetect connected wiimote+nunchuks */
/* autodetect connected wiimote+nunchuk */
if (config.input[player].device == 2)
{
exp = 4;
if (config.input[player].port<4)
/* test current port */
exp = 255;
if (config.input[player].port < 4)
{
WPAD_Probe(config.input[player].port,&exp);
}
while ((config.input[player].port<4) && (exp != WPAD_EXP_NUNCHUK))
/* find first connected controller */
while ((config.input[player].port < 4) && (exp != WPAD_EXP_NUNCHUK))
{
/* try next port */
config.input[player].port ++;
if (config.input[player].port<4)
if (config.input[player].port < 4)
{
exp = 4;
exp = 255;
WPAD_Probe(config.input[player].port,&exp);
}
}
/* no more wiimote+nunchuk */
if (config.input[player].port >= 4)
{
/* no wiimote+nunchuk found, try classic controllers */
/* test classic controllers */
config.input[player].port = 0;
config.input[player].device = 3;
}
@ -2153,19 +2175,21 @@ static void ctrlmenu(void)
/* autodetect connected classic controllers */
if (config.input[player].device == 3)
{
exp = 4;
if (config.input[player].port<4)
/* test current port */
exp = 255;
if (config.input[player].port < 4)
{
WPAD_Probe(config.input[player].port,&exp);
}
/* find first connected controller */
while ((config.input[player].port<4) && (exp != WPAD_EXP_CLASSIC))
{
/* try next port */
config.input[player].port ++;
if (config.input[player].port<4)
if (config.input[player].port < 4)
{
exp = 4;
exp = 255;
WPAD_Probe(config.input[player].port,&exp);
}
}
@ -2289,7 +2313,8 @@ static void ctrlmenu(void)
/* remove duplicate assigned inputs before leaving */
for (i=0; i<MAX_INPUTS; i++)
{
if ((i!=player) && (config.input[i].device == config.input[player].device) && (config.input[i].port == config.input[player].port))
if ((i!=player) && (config.input[i].port == config.input[player].port) &&
((config.input[i].device == config.input[player].device) || ((config.input[i].device * config.input[player].device) == 2)))
{
config.input[i].device = -1;
config.input[i].port = i%4;
@ -3091,21 +3116,36 @@ void menu_execute(void)
{
/*** Load Game Menu ***/
case 0:
GUI_DrawMenuFX(m,30,1);
GUI_DeleteMenu(m);
quit = loadgamemenu();
if (quit)
if (loadgamemenu())
{
/* check current controller configuration */
if (!gx_input_FindDevices())
{
GUI_InitMenu(m);
GUI_DrawMenuFX(m,30,0);
GUI_WaitPrompt("Error","Invalid Controllers Settings");
break;
}
/* exit to game */
gxClearScreen((GXColor)BLACK);
gxSetScreen();
quit = 1;
break;
}
GUI_InitMenu(m);
GUI_DrawMenuFX(m,30,0);
break;
/*** Options Menu */
case 1:
GUI_DrawMenuFX(m,30,1);
GUI_DeleteMenu(m);
optionmenu();
@ -3113,38 +3153,73 @@ void menu_execute(void)
GUI_DrawMenuFX(m,30,0);
break;
/*** Exit Menu ***/
case 2:
exitmenu();
break;
/*** Save Manager ***/
case 3:
GUI_DrawMenuFX(m,30,1);
GUI_DeleteMenu(m);
quit = savemenu();
if (quit) break;
if (savemenu())
{
/* check current controller configuration */
if (!gx_input_FindDevices())
{
GUI_InitMenu(m);
GUI_DrawMenuFX(m,30,0);
GUI_WaitPrompt("Error","Invalid Controllers Settings");
break;
}
/* exit to game */
quit = 1;
break;
}
GUI_InitMenu(m);
GUI_DrawMenuFX(m,30,0);
break;
/*** Virtual system hard reset ***/
case 4:
/* check current controller configuration */
if (!gx_input_FindDevices())
{
GUI_WaitPrompt("Error","Invalid Controllers Settings");
break;
}
/* reinitialize emulation */
GUI_DrawMenuFX(m,10,1);
GUI_DeleteMenu(m);
gxClearScreen((GXColor)BLACK);
gxSetScreen();
system_init();
system_reset();
/* restore SRAM */
if (config.s_auto & 1)
{
slot_autoload(0,config.s_device);
}
/* exit to game */
quit = 1;
break;
/*** Cheats menu ***/
case 5:
GUI_DrawMenuFX(m,30,1);
GUI_DeleteMenu(m);
CheatMenu();
@ -3152,8 +3227,10 @@ void menu_execute(void)
GUI_DrawMenuFX(m,30,0);
break;
/*** Action Replay switch ***/
case 6:
status = (areplay_get_status() + 1) % (AR_SWITCH_TRAINER + 1);
areplay_set_status(status);
status = areplay_get_status();
@ -3164,38 +3241,48 @@ void menu_execute(void)
GUI_InitMenu(m);
break;
/*** Return to Game ***/
case 7:
case -1:
if (cart.romsize)
{
/* check current controller configuration */
if (!gx_input_FindDevices())
{
GUI_WaitPrompt("Error","Invalid Controllers Settings");
break;
}
/* exit to game */
GUI_DrawMenuFX(m,10,1);
GUI_DeleteMenu(m);
quit = 1;
}
break;
/*** Game Capture ***/
case 8:
sprintf(filename,"%s/snaps/%s.png", DEFAULT_PATH, rom_filename);
gxSaveScreenshot(filename);
break;
/*** ROM information screen ***/
case 9:
showrominfo();
break;
}
}
/*** Remove any still held buttons ***/
while (PAD_ButtonsHeld(0))
PAD_ScanPads();
while (PAD_ButtonsHeld(0)) PAD_ScanPads();
#ifdef HW_RVL
while (WPAD_ButtonsHeld(0))
WPAD_ScanPads();
/* free wiimote pointer data */
while (WPAD_ButtonsHeld(0)) WPAD_ScanPads();
gxTextureClose(&w_pointer);
#endif
}

View File

@ -27,5 +27,6 @@
extern void menu_execute(void);
extern void menu_configure(void);
#endif

View File

@ -697,6 +697,77 @@ void gx_input_Init(void)
VIDEO_Flush();
}
int gx_input_FindDevices(void)
{
int i;
#ifdef HW_RVL
u32 wpad;
#endif
u32 pad = PAD_ScanPads();
int found = 0;
int player = 0;
for (i=0; i<MAX_DEVICES; i++)
{
/* check emulated peripheral */
if (input.dev[i] != NO_DEVICE)
{
/* test input device */
switch (config.input[player].device)
{
case 0: /* Gamecube Controller */
{
if (!(pad & (1 << config.input[player].port)))
{
return 0;
}
found++;
break;
}
#ifdef HW_RVL
case 1: /* Wiimote */
{
wpad = 255;
WPAD_Probe(config.input[player].port, &wpad);
if (wpad == 255)
{
return 0;
}
found++;
break;
}
case 2: /* Expansion Controller */
case 3:
{
wpad = 255;
WPAD_Probe(config.input[player].port, &wpad);
if (wpad != (config.input[player].device - 1))
{
return 0;
}
found++;
break;
}
#endif
default:
{
break;
}
}
/* next configured player */
player ++;
}
}
/* return number of connected devices */
return found;
}
void gx_input_SetDefault(void)
{
int i,j;
@ -766,18 +837,30 @@ void gx_input_SetDefault(void)
/* try to autodetect connected controller */
exp = 255;
WPAD_Probe(i, &exp);
if (exp <= WPAD_EXP_CLASSIC)
if (exp == WPAD_EXP_CLASSIC)
{
/* set expansion controller (or wiimote if no expansion) as default */
config.input[i].device = exp + 1;
/* use Classic Controller */
config.input[i].device = 3;
config.input[i].port = i;
}
else if (exp == WPAD_EXP_NUNCHUK)
{
/* use Wiimote + Nunchuk */
config.input[i].device = 2;
config.input[i].port = i;
}
else if (exp <= EXP_MOTION_PLUS)
{
/* use Wiimote by default */
config.input[i].device = 1;
config.input[i].port = i;
}
else
{
/* look for unassigned wiimotes */
/* look for unused Wiimotes */
for (j=0; j<i; j++)
{
/* classic controller is already assigned, which means wiimote is not used */
/* Classic Controller is assigned, which means Wiimote is free to use */
if (config.input[j].device == (WPAD_EXP_CLASSIC + 1))
{
/* assign wiimote */
@ -804,6 +887,7 @@ void gx_input_SetDefault(void)
{
config.input[j].device = 0;
config.input[j].port = i;
j = MAX_INPUTS;
}
}
}

View File

@ -44,6 +44,7 @@ typedef struct
extern void gx_input_Init(void);
extern int gx_input_FindDevices(void);
extern void gx_input_SetDefault(void);
extern void gx_input_Config(u8 num, u8 type, u8 max_keys);
extern void gx_input_UpdateEmu(void);