-scrollable cheat menu

-housekeeping
This commit is contained in:
dborth 2008-08-13 22:44:59 +00:00
parent 30dc47b29d
commit aff0dc6d17
15 changed files with 369 additions and 141 deletions

View File

@ -2,6 +2,7 @@
* Snes9x 1.51
*
* Nintendo Wii/Gamecube Port
*
* Tantric August 2008
*
* cheatmgr.cpp
@ -37,16 +38,19 @@ bool8 NGCLoadCheatFile (int length)
while (offset < length)
{
memcpy (data, savebuffer+offset, 28);
offset += 28;
if(Cheat.num_cheats < MAX_CHEATS)
{
memcpy (data, savebuffer+offset, 28);
offset += 28;
Cheat.c [Cheat.num_cheats].enabled = (data [0] & 4) == 0;
Cheat.c [Cheat.num_cheats].byte = data [1];
Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16);
Cheat.c [Cheat.num_cheats].saved_byte = data [5];
Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0;
memmove (Cheat.c [Cheat.num_cheats].name, &data [8], 20);
Cheat.c [Cheat.num_cheats++].name [20] = 0;
Cheat.c [Cheat.num_cheats].enabled = (data [0] & 4) == 0;
Cheat.c [Cheat.num_cheats].byte = data [1];
Cheat.c [Cheat.num_cheats].address = data [2] | (data [3] << 8) | (data [4] << 16);
Cheat.c [Cheat.num_cheats].saved_byte = data [5];
Cheat.c [Cheat.num_cheats].saved = (data [0] & 8) != 0;
memmove (Cheat.c [Cheat.num_cheats].name, &data [8], 20);
Cheat.c [Cheat.num_cheats++].name [20] = 0;
}
}
return (TRUE);

View File

@ -19,6 +19,7 @@
extern int offset;
extern int selection;
extern FILEENTRIES filelist[MAXFILES];
/** DVD I/O Address base **/
volatile unsigned long *dvd = (volatile unsigned long *) 0xCC006000;
@ -107,9 +108,6 @@ static int IsJoliet = 0;
u64 rootdir = 0;
int rootdirlength = 0;
/** Global file entry table **/
FILEENTRIES filelist[MAXFILES];
/**
* Primary Volume Descriptor
*

View File

@ -10,21 +10,8 @@
#ifndef _NGCDVD_
#define _NGCDVD_
#define MAXJOLIET 255
#define MAXDISPLAY 54
typedef struct
{
u64 offset;
unsigned int length;
char flags;
char filename[MAXJOLIET + 1];
char displayname[MAXDISPLAY + 1];
} FILEENTRIES;
extern u64 rootdir;
extern int rootdirlength;
#define MAXFILES 2000 /** Restrict to 2000 files per dir **/
extern FILEENTRIES filelist[MAXFILES];
int getpvd ();
int ParseDVDdirectory ();

View File

@ -2,6 +2,7 @@
* Snes9x 1.50
*
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007
* Tantric August 2008
@ -21,7 +22,6 @@
#include "unzip.h"
#include "video.h"
#include "menudraw.h"
#include "dvd.h"
#include "filesel.h"
#include "sram.h"
#include "preferences.h"

View File

@ -1,9 +1,11 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Port
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007
* Tantric August 2008
*
* fileop.h
*

View File

@ -2,6 +2,7 @@
* Snes9x 1.50
*
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* svpe June 2007
* crunchy2 May-July 2007
@ -36,11 +37,13 @@ int selection;
char currentdir[MAXPATHLEN];
int maxfiles;
extern int screenheight;
#define PAGESIZE 17
extern unsigned long ARAM_ROMSIZE;
int havedir = 0;
int hasloaded = 0;
// Global file entry table
FILEENTRIES filelist[MAXFILES];
unsigned char savebuffer[SAVEBUFFERSIZE] ATTRIBUTE_ALIGN (32);
/****************************************************************************
@ -195,68 +198,6 @@ void StripExt(char* returnstring, char * inputstring)
*loc_dot = '\0'; // strip file extension
}
/****************************************************************************
* Showfile screen
*
* Display the file selection to the user
****************************************************************************/
static void
ShowFiles ()
{
int i, j;
char text[MAXPATHLEN];
int ypos;
int w;
clearscreen ();
setfontsize (28);
DrawText (-1, 60, (char*)"Choose Game");
setfontsize(18);
ypos = (screenheight - ((PAGESIZE - 1) * 20)) >> 1;
if (screenheight == 480)
ypos += 24;
else
ypos += 10;
j = 0;
for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++)
{
if (filelist[i].flags) // if a dir
{
strcpy (text, "[");
strcat (text, filelist[i].displayname);
strcat (text, "]");
}
else
{
// hide file extension on listing (.7z, .fig, .smc)
StripExt(text, filelist[i].displayname);
}
if (j == (selection - offset))
{
/*** Highlighted text entry ***/
for ( w = 0; w < 20; w++ )
DrawLineFast( 30, 610, ( j * 20 ) + (ypos-16) + w, 0x80, 0x80, 0x80 );
setfontcolour (0x00, 0x00, 0xe0);
DrawText (50, (j * 20) + ypos, text);
setfontcolour (0x00, 0x00, 0x00);
}
else
{
/*** Normal entry ***/
DrawText (50, (j * 20) + ypos, text);
}
j++;
}
showscreen ();
}
/****************************************************************************
* FileSelector
*
@ -282,7 +223,7 @@ FileSelector (int method)
while (haverom == 0)
{
if (redraw)
ShowFiles ();
ShowFiles (filelist, maxfiles, offset, selection);
redraw = 0;
VIDEO_WaitVSync(); // slow things down a bit so we don't overread the pads

View File

@ -1,21 +1,41 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Filesel - borrowed from GPP
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007
* Tantric August 2008
*
* filesel.h
*
* Generic file routines - reading, writing, browsing
****************************************************************************/
#ifndef _NGCFILESEL_
#define _NGCFILESEL_
#define SAVEBUFFERSIZE ((512 * 1024) + 2048 + 64 + 4 + 4)
#define MAXJOLIET 255
#define MAXDISPLAY 54
typedef struct
{
u64 offset;
unsigned int length;
char flags;
char filename[MAXJOLIET + 1];
char displayname[MAXDISPLAY + 1];
} FILEENTRIES;
#define MAXFILES 2000 // Restrict to 2000 files per dir
extern FILEENTRIES filelist[MAXFILES];
void ClearSaveBuffer ();
int OpenROM (int method);
int autoLoadMethod();
int autoSaveMethod();
int FileSortCallback(const void *f1, const void *f2);
void StripExt(char* returnstring, char * inputstring);
#endif

View File

@ -1,16 +1,21 @@
/****************************************************************************
* Snes9x 1.50 - GX 2.0
* Snes9x 1.50
*
* NGC Snapshots Memory File System
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007-July 2007
* Tantric August 2008
*
* freeze.cpp
*
* Snapshots Memory File System
*
* This is a single global memory file controller. Don't even think of opening two
* at the same time !
*
* There's just enough here to do SnapShots - you should add anything else you
* need.
*
* softdev July 2006
* crunchy2 May 2007-July 2007
****************************************************************************/
#include <gccore.h>
#include <stdio.h>

View File

@ -1,7 +1,15 @@
/****************************************************************************
* Snes9x 1.50 - GX 2.0
* Snes9x 1.50
*
* NGC Snapshots Memory File System
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007-July 2007
* Tantric August 2008
*
* freeze.h
*
* Snapshots Memory File System
*
* This is a single global memory file controller. Don't even think of opening two
* at the same time !

View File

@ -1,10 +1,15 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Menu
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May-June 2007
* Tantric August 2008
*
* menu.cpp
*
* Menu flow routines
****************************************************************************/
#include <gccore.h>
#include <ogcsys.h>
@ -293,6 +298,9 @@ PreferencesMenu ()
****************************************************************************/
static int cheatmenuCount = 0;
static char cheatmenu[MAX_CHEATS][50];
static char cheatmenuvalue[MAX_CHEATS][50];
#define PADCAL 40
void CheatMenu()
{
@ -300,10 +308,26 @@ void CheatMenu()
int oldmenu = menu;
menu = 0;
int selection = 0;
int offset = 0;
u32 p, wp, ph, wh;
signed char a, c;
int redraw = 1;
int selectit = 0;
float mag, mag2;
u16 ang, ang2;
int scroll_delay = 0;
bool move_selection = 0;
#define SCROLL_INITIAL_DELAY 15
#define SCROLL_LOOP_DELAY 2
if(Cheat.num_cheats > 0)
{
cheatmenuCount = Cheat.num_cheats + 1;
for(uint16 i=0; i < Cheat.num_cheats; i++)
sprintf (cheatmenu[i], "%s", Cheat.c[i].name);
sprintf (cheatmenu[cheatmenuCount-1], "Back to Game Menu");
while(ret != cheatmenuCount-1)
@ -314,17 +338,133 @@ void CheatMenu()
S9xDisableCheat(ret);
else
S9xEnableCheat(ret);
ret = -1;
}
for(uint16 i=0; i < Cheat.num_cheats; i++)
sprintf (cheatmenu[i], "%s %s", Cheat.c[i].name, Cheat.c[i].enabled == true ? " ON" : "OFF");
sprintf (cheatmenuvalue[i], "%s", Cheat.c[i].enabled == true ? "ON" : "OFF");
ret = RunMenu (cheatmenu, cheatmenuCount, (char*)"Cheats", 16);
if (redraw)
ShowCheats (cheatmenu, cheatmenuvalue, cheatmenuCount, offset, selection);
redraw = 0;
VIDEO_WaitVSync(); // slow things down a bit so we don't overread the pads
p = PAD_ButtonsDown (0);
ph = PAD_ButtonsHeld (0);
#ifdef HW_RVL
wp = WPAD_ButtonsDown (0);
wh = WPAD_ButtonsHeld (0);
wpad_get_analogues(0, &mag, &ang, &mag2, &ang2); // get joystick info from wii expansions
#else
wp = 0;
wh = 0;
ang = 0;
ang2 = 0;
mag = 0;
mag2 = 0;
#endif
a = PAD_StickY (0);
c = PAD_SubStickX (0);
/*** Check for exit combo ***/
if ( (c < -70) || (wp & WPAD_BUTTON_HOME) || (wp & WPAD_CLASSIC_BUTTON_HOME) )
break;
/*** Check buttons, perform actions ***/
if ( (p & PAD_BUTTON_A) || selectit || (wp & (WPAD_BUTTON_A | WPAD_CLASSIC_BUTTON_A)) )
{
if ( selectit )
selectit = 0;
redraw = 1;
ret = selection;
} // End of A
if ( ((p | ph) & PAD_BUTTON_DOWN) || ((wp | wh) & (WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN)) || (a < -PADCAL) || (mag>JOY_THRESHOLD && (ang>130 && ang<230)) )
{
if ( (p & PAD_BUTTON_DOWN) || (wp & (WPAD_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_DOWN)) ) { /*** Button just pressed ***/
scroll_delay = SCROLL_INITIAL_DELAY; // reset scroll delay.
move_selection = 1; //continue (move selection)
}
else if (scroll_delay == 0) { /*** Button is held ***/
scroll_delay = SCROLL_LOOP_DELAY;
move_selection = 1; //continue (move selection)
} else {
scroll_delay--; // wait
}
if (move_selection)
{
selection++;
if (selection == cheatmenuCount)
selection = offset = 0;
if ((selection - offset) >= PAGESIZE)
offset += PAGESIZE;
redraw = 1;
move_selection = 0;
}
} // End of down
if ( ((p | ph) & PAD_BUTTON_UP) || ((wp | wh) & (WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP)) || (a > PADCAL) || (mag>JOY_THRESHOLD && (ang>300 || ang<50)) )
{
if ( (p & PAD_BUTTON_UP) || (wp & (WPAD_BUTTON_UP | WPAD_CLASSIC_BUTTON_UP)) ) { /*** Button just pressed***/
scroll_delay = SCROLL_INITIAL_DELAY; // reset scroll delay.
move_selection = 1; //continue (move selection)
}
else if (scroll_delay == 0) { /*** Button is held ***/
scroll_delay = SCROLL_LOOP_DELAY;
move_selection = 1; //continue (move selection)
} else {
scroll_delay--; // wait
}
if (move_selection)
{
selection--;
if (selection < 0) {
selection = cheatmenuCount - 1;
offset = selection - PAGESIZE + 1;
}
if (selection < offset)
offset -= PAGESIZE;
if (offset < 0)
offset = 0;
redraw = 1;
move_selection = 0;
}
} // End of Up
if ( (p & PAD_BUTTON_LEFT) || (wp & (WPAD_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_LEFT)) )
{
/*** Go back a page ***/
selection -= PAGESIZE;
if (selection < 0)
{
selection = cheatmenuCount - 1;
offset = selection - PAGESIZE + 1;
}
if (selection < offset)
offset -= PAGESIZE;
if (offset < 0)
offset = 0;
redraw = 1;
}
if ( (p & PAD_BUTTON_RIGHT) || (wp & (WPAD_BUTTON_RIGHT | WPAD_CLASSIC_BUTTON_RIGHT)) )
{
/*** Go forward a page ***/
selection += PAGESIZE;
if (selection > cheatmenuCount - 1)
selection = offset = 0;
if ((selection - offset) >= PAGESIZE)
offset += PAGESIZE;
redraw = 1;
}
}
}
else
{
WaitPrompt((char*)"Cheat file not found!");
WaitPrompt((char*)"No cheats found!");
}
menu = oldmenu;
}

View File

@ -1,7 +1,7 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Menu
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
****************************************************************************/

View File

@ -1,21 +1,22 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Screen Font Driver
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 June 2007
* Tantric August 2008
*
* menudraw.cpp
*
* Menu drawing routines
*
* Uses libfreetype 2.2.1 compiled for GC with TTF support only.
* TTF only reduces the library by some 900k bytes!
*
* Visit - http://www.freetype.org !
*
* **WARNING***
*
* ONLY USE GUARANTEED PATENT FREE FONTS.
* THOSE IN YOUR WINDOWS\FONTS DIRECTORY ARE COPYRIGHT
* AND MAY NOT BE DISTRIBUTED!
*
* softdev July 2006
* crunchy2 June 2007
****************************************************************************/
#include <gccore.h>
#include <ogcsys.h>
@ -33,6 +34,8 @@
#include "video.h"
#include "menudraw.h"
#include "snes9xGX.h"
#include "filesel.h"
#include "dvd.h"
#include "aram.h"
#include "images/gfx_bg.h"
@ -627,6 +630,116 @@ RunMenu (char items[][50], int maxitems, char *title, int fontsize, int x)
}
/****************************************************************************
* Showfile screen
*
* Display the file selection to the user
****************************************************************************/
void
ShowFiles (FILEENTRIES filelist[], int maxfiles, int offset, int selection)
{
int i, j;
char text[MAXPATHLEN];
int ypos;
int w;
clearscreen ();
setfontsize (28);
DrawText (-1, 60, (char*)"Choose Game");
setfontsize(18);
ypos = (screenheight - ((PAGESIZE - 1) * 20)) >> 1;
if (screenheight == 480)
ypos += 24;
else
ypos += 10;
j = 0;
for (i = offset; i < (offset + PAGESIZE) && (i < maxfiles); i++)
{
if (filelist[i].flags) // if a dir
{
strcpy (text, "[");
strcat (text, filelist[i].displayname);
strcat (text, "]");
}
else
{
// hide file extension on listing (.7z, .fig, .smc)
StripExt(text, filelist[i].displayname);
}
if (j == (selection - offset))
{
/*** Highlighted text entry ***/
for ( w = 0; w < 20; w++ )
DrawLineFast( 30, 610, ( j * 20 ) + (ypos-16) + w, 0x80, 0x80, 0x80 );
setfontcolour (0x00, 0x00, 0xe0);
DrawText (50, (j * 20) + ypos, text);
setfontcolour (0x00, 0x00, 0x00);
}
else
{
/*** Normal entry ***/
DrawText (50, (j * 20) + ypos, text);
}
j++;
}
showscreen ();
}
/****************************************************************************
* Cheats screen
*
* Displays a scrollable list of cheats to the user
****************************************************************************/
void
ShowCheats (char items[][50], char itemvalues[][50], int maxitems, int offset, int selection)
{
int i, j = 0;
int ypos;
int w;
clearscreen ();
setfontsize (28);
DrawText (-1, 60, (char*)"Cheats");
setfontsize(18);
ypos = (screenheight - ((PAGESIZE - 1) * 20)) >> 1;
if (screenheight == 480)
ypos += 24;
else
ypos += 10;
for (i = offset; i < (offset + PAGESIZE) && (i < maxitems); i++)
{
if (i == selection)
{
/*** Highlighted text entry ***/
for ( w = 0; w < 20; w++ )
DrawLineFast( 30, 610, ( j * 20 ) + (ypos-16) + w, 0x80, 0x80, 0x80 );
DrawText (150, (j * 20) + ypos, items[i]);
DrawText (400, (j * 20) + ypos, itemvalues[i]);
}
else
{
/*** Normal entry ***/
DrawText (150, (j * 20) + ypos, items[i]);
DrawText (400, (j * 20) + ypos, itemvalues[i]);
}
j++;
}
showscreen ();
}
/****************************************************************************
* ROM Information Screen

View File

@ -1,24 +1,29 @@
/****************************************************************************
* Snes9x 1.50
*
* Nintendo Gamecube Screen Font Driver
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 June 2007
* Tantric August 2008
*
* menudraw.h
*
* Menu drawing routines
*
* Uses libfreetype 2.2.1 compiled for GC with TTF support only.
* TTF only reduces the library by some 900kbytes!
*
* Visit - http://www.freetype.org !
* TTF only reduces the library by some 900k bytes!
*
* **WARNING***
*
* ONLY USE GUARANTEED PATENT FREE FONTS.
* THOSE IN YOUR WINDOWS\FONTS DIRECTORY ARE COPYRIGHT
* AND MAY NOT BE DISTRIBUTED!
*
* softdev July 2006
* crunchy2 June 2007
****************************************************************************/
#ifndef _TTFFONTS_
#define _TTFFONTS_
#ifndef _NGCMENUDRAW_
#define _NGCMENUDRAW_
#include "filesel.h"
#define PAGESIZE 17 // max item listing on a screen
int FT_Init ();
void setfontsize (int pixelsize);
@ -30,6 +35,9 @@ void RomInfo ();
void WaitButtonA ();
int RunMenu (char items[][50], int maxitems, char *title, int fontsize = 20, int x = -1);
void DrawMenu (char items[][50], char *title, int maxitems, int selected, int fontsize = 20, int x = -1);
void ShowCheats (char items[][50], char itemvalues[][50], int maxitems, int offset, int selection);
void ShowFiles (FILEENTRIES filelist[], int maxfiles, int offset, int selection);
void WaitPrompt (char *msg);
int WaitPromptChoice (char *msg, char* bmsg, char* amsg);
void ShowAction (char *msg);

View File

@ -2,6 +2,7 @@
* Snes9x 1.50
*
* Nintendo Wii/Gamecube Port
*
* softdev July 2006
* crunchy2 May 2007
* Tantric August 2008
@ -24,7 +25,6 @@
#include "unzip.h"
#include "video.h"
#include "menudraw.h"
#include "dvd.h"
#include "filesel.h"
#include "smbop.h"
#include "Snes9xGx.h"
@ -234,7 +234,7 @@ LoadSMBFile (char *filename, int length)
{
//return UnZipBuffer(rbuffer, 0, 2, NULL);
// UNZIP currently crashes - FIX ME
WaitPrompt((char*) "Zipped files are currently not supported!");
WaitPrompt((char*) "Zipped files are currently not supported over SMB!");
return -1;
}
}
@ -287,8 +287,10 @@ SaveBufferToSMB (char *filepath, int datasize, bool8 silent)
}
/****************************************************************************
* Load savebuffer from SMB file
* Load up a buffer from SMB file
****************************************************************************/
// no buffer is specified - so use savebuffer
int
LoadBufferFromSMB (char *filepath, bool8 silent)
{

View File

@ -85,7 +85,7 @@ UnZipBuffer (unsigned char *outbuffer, u64 inoffset, short where, FILE* filehand
int res;
int bufferoffset = 0;
int have = 0;
char readbuffer[2048];
char readbuffer[ZIPCHUNK];
char msg[128];
/*** Read Zip Header ***/
@ -93,15 +93,15 @@ UnZipBuffer (unsigned char *outbuffer, u64 inoffset, short where, FILE* filehand
{
case 0: // SD Card
fseek(filehandle, 0, SEEK_SET);
fread (readbuffer, 1, 2048, filehandle);
fread (readbuffer, 1, ZIPCHUNK, filehandle);
break;
case 1: // DVD
dvd_read (readbuffer, 2048, inoffset);
dvd_read (readbuffer, ZIPCHUNK, inoffset);
break;
case 2: // From buffer
memcpy(readbuffer, outbuffer, 2048);
memcpy(readbuffer, outbuffer, ZIPCHUNK);
break;
}
@ -148,16 +148,16 @@ UnZipBuffer (unsigned char *outbuffer, u64 inoffset, short where, FILE* filehand
if (res == Z_MEM_ERROR)
{
inflateEnd (&zs);
return 0;
inflateEnd (&zs);
return 0;
}
have = ZIPCHUNK - zs.avail_out;
if (have)
{
/*** Copy to normal block buffer ***/
memcpy (&outbuffer[bufferoffset], &out, have);
bufferoffset += have;
/*** Copy to normal block buffer ***/
memcpy (&outbuffer[bufferoffset], &out, have);
bufferoffset += have;
}
}
while (zs.avail_out == 0);
@ -169,17 +169,17 @@ UnZipBuffer (unsigned char *outbuffer, u64 inoffset, short where, FILE* filehand
switch (where)
{
case 0: // SD Card
fread (readbuffer, 1, 2048, filehandle);
fread (readbuffer, 1, ZIPCHUNK, filehandle);
break;
case 1: // DVD
inoffset += 2048;
dvd_read (readbuffer, 2048, inoffset);
inoffset += ZIPCHUNK;
dvd_read (readbuffer, ZIPCHUNK, inoffset);
break;
case 2: // From buffer
inoffset += 2048;
memcpy(readbuffer, outbuffer+inoffset, 2048);
inoffset += ZIPCHUNK;
memcpy(readbuffer, outbuffer+inoffset, ZIPCHUNK);
break;
}
}