@@ -56,7 +56,7 @@ Mix_Chunk *menusound_move = NULL;
5656Mix_Chunk *menusound_ok = NULL ;
5757
5858// Default config values
59- int showfps = 0 , ghosting = 1 , biosenabled = 0 , colorfilter = 0 , gameiscgb = 0 , buttonlayout = 0 , stereosound = 1 , prefercgb = 0 , ffwhotkey = 1 ;
59+ int showfps = 0 , ghosting = 1 , biosenabled = 0 , colorfilter = 0 , gameiscgb = 0 , buttonlayout = 0 , stereosound = 1 , prefercgb = 1 , ffwhotkey = 1 , stateautoload = 0 , stateautosave = 0 ;
6060uint32_t menupalblack = 0x000000 , menupaldark = 0x505450 , menupallight = 0xA8A8A8 , menupalwhite = 0xF8FCF8 ;
6161int filtervalue[12 ] = {135 , 20 , 0 , 25 , 0 , 125 , 20 , 25 , 0 , 20 , 105 , 30 };
6262std::string selectedscaler= " No Scaling" , dmgbordername = " DEFAULT" , gbcbordername = " DEFAULT" , palname = " DEFAULT" , filtername = " NONE" , currgamename = " default" ;
@@ -441,6 +441,60 @@ int textanim_reset(){
441441 return 0 ;
442442}
443443
444+ void stateload_dms (int saveslot) {
445+ gambatte_p->selectState_NoOsd (saveslot);
446+ char overlaytext[20 ];
447+ if (gambatte_p->loadState_NoOsd ()){
448+ can_reset = 1 ;// allow user to reset or save state once a savestate is loaded
449+ sprintf (overlaytext, " State %d loaded" , gambatte_p->currentState ());
450+ printOverlay (overlaytext);// print overlay text
451+ } else {
452+ sprintf (overlaytext, " State %d empty" , gambatte_p->currentState ());
453+ printOverlay (overlaytext);// print overlay text
454+ }
455+ }
456+
457+ void statesave_dms (int saveslot) {
458+ gambatte_p->selectState_NoOsd (saveslot);
459+ if (can_reset == 1 ){// boot logo already ended, can save state safely
460+ if (gameiscgb == 0 ){ // set palette to greyscale
461+ Uint32 value;
462+ for (int i = 0 ; i < 3 ; ++i) {
463+ for (int k = 0 ; k < 4 ; ++k) {
464+ if (k == 0 )
465+ value = 0xF8FCF8 ;
466+ if (k == 1 )
467+ value = 0xA8A8A8 ;
468+ if (k == 2 )
469+ value = 0x505450 ;
470+ if (k == 3 )
471+ value = 0x000000 ;
472+ gambatte_p->setDmgPaletteColor (i, k, value);
473+ }
474+ }
475+ } else { // disable color filter
476+ gambatte_p->setColorFilter (0 , filtervalue);
477+ }
478+ // run the emulator for 1 frame, so the screen buffer is updated without color palettes
479+ std::size_t fakesamples = 35112 ;
480+ Array<Uint32> const fakeBuf (35112 + 2064 );
481+ gambatte_p->runFor (blitter_p->inBuf ().pixels , blitter_p->inBuf ().pitch , fakeBuf, fakesamples);
482+ // save state. the snapshot will now be in greyscale
483+ gambatte_p->saveState_NoOsd (blitter_p->inBuf ().pixels , blitter_p->inBuf ().pitch );
484+ if (gameiscgb == 0 ){
485+ loadPalette (palname); // restore palette
486+ } else {
487+ loadFilter (filtername); // restore color filter
488+ }
489+
490+ char overlaytext[14 ];
491+ sprintf (overlaytext, " State %d saved" , gambatte_p->currentState ());
492+ printOverlay (overlaytext);// print overlay text
493+ } else if (can_reset == 0 ){// boot logo is still running, can't save state
494+ printOverlay (" Unable to save" );// print overlay text
495+ }
496+ }
497+
444498int menu_main (menu_t *menu) {
445499 SDL_Event event;
446500 int dirty, loop, i;
@@ -2208,6 +2262,8 @@ void saveConfig(int pergame){
22082262 " DMGBORDERNAME %s\n "
22092263 " GBCBORDERNAME %s\n "
22102264 " PREFERCGB %d\n "
2265+ " STATEAUTOLOAD %d\n "
2266+ " STATEAUTOSAVE %d\n "
22112267 " BIOSENABLED %d\n "
22122268 " GHOSTING %d\n "
22132269 " BUTTONLAYOUT %d\n "
@@ -2220,6 +2276,8 @@ void saveConfig(int pergame){
22202276 dmgbordername.c_str (),
22212277 gbcbordername.c_str (),
22222278 prefercgb,
2279+ stateautoload,
2280+ stateautosave,
22232281 biosenabled,
22242282 ghosting,
22252283 buttonlayout,
@@ -2324,6 +2382,12 @@ void loadConfig(){
23242382 } else if (!strcmp (line, " PREFERCGB" )) {
23252383 sscanf (arg, " %d" , &value);
23262384 prefercgb = value;
2385+ } else if (!strcmp (line, " STATEAUTOLOAD" )) {
2386+ sscanf (arg, " %d" , &value);
2387+ stateautoload = value;
2388+ } else if (!strcmp (line, " STATEAUTOSAVE" )) {
2389+ sscanf (arg, " %d" , &value);
2390+ stateautosave = value;
23272391 } else if (!strcmp (line, " BIOSENABLED" )) {
23282392 sscanf (arg, " %d" , &value);
23292393 biosenabled = value;
0 commit comments