Advertisement
NightFox

Save Example

Sep 25th, 2011
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.50 KB | None | 0 0
  1. // Includes C
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5.  
  6. // Includes propietarios NDS
  7. #include <nds.h>
  8.  
  9. // Includes NightFox's Lib
  10. #include <nf_lib.h>
  11.  
  12. //Incluye las librerias del juego
  13. #include "includes.h"
  14.  
  15.  
  16.  
  17. // Funcion CheckSavegame();
  18. void CheckSavegame(const char* path) {
  19.  
  20.     // Verifica si es un emulador o el hardware real
  21.     if (CheckFATWrite(path)) {
  22.         // Operaciones en el hardware real
  23.         sprintf(SAVEFILEPATH, path);
  24.         IS_EMULATOR = false;
  25.         CheckSavegameFile();
  26.     } else {
  27.         // Operaciones en el emulador
  28.         IS_EMULATOR = true;
  29.         CheckSavegameSRAM();
  30.     }
  31.  
  32. }
  33.  
  34.  
  35. // Funcion WriteSavegame();
  36. void WriteSavegame(void) {
  37.  
  38.     // Guardalos donde tocan
  39.     if (IS_EMULATOR) {
  40.         if (USE_SRAM && !REG_DSIMODE) WriteSRAM();
  41.     } else {
  42.         WriteSavegameFile();
  43.     }
  44.  
  45. }
  46.  
  47.  
  48.  
  49. // Funcion ReadSavegame();
  50. void ReadSavegame(void) {
  51.  
  52.     // Guardalos donde tocan
  53.     if (IS_EMULATOR) {
  54.         if (USE_SRAM && !REG_DSIMODE) ReadSRAM();
  55.     } else {
  56.         ReadSavegameFile();
  57.     }
  58.  
  59. }
  60.  
  61.  
  62.  
  63.  
  64. // Funcion CheckSavegameFile();
  65. void CheckSavegameFile(void) {
  66.  
  67.     // Variables
  68.     bool filefound = false;     // Existe el fichero
  69.     u16 l = 0;                  // Longitud del path al archivo
  70.     FILE* savefile;             // Puntero de archivo
  71.     u32 checksum = 0;           // Checksum del savedata
  72.  
  73.     // Añade la extension .SAV al archivo de guardado
  74.     l = strlen(SAVEFILEPATH);
  75.     SAVEFILEPATH[(l - 3)] = 's';
  76.     SAVEFILEPATH[(l - 2)] = 'a';
  77.     SAVEFILEPATH[(l - 1)] = 'v';
  78.  
  79.     // Verifica si existe el archivo de guardado
  80.     savefile = fopen(SAVEFILEPATH, "rb");
  81.     if (savefile) {
  82.         filefound = true;
  83.     } else {
  84.         filefound = false;
  85.     }
  86.     fclose(savefile);
  87.  
  88.     // Si el archivo de guardado existe...
  89.     if (filefound) {
  90.         // Lee el archivo
  91.         ReadSavegameFile();
  92.         // Realiza el checksum de los datos cargados
  93.         checksum = SavedataChecksum();
  94.         // Verifica si hay discrepancias
  95.         if (
  96.             (checksum != CHECKSUM[0].value)
  97.             ||
  98.             (CHECKSUM[0].version != SAVEGAMEVERSION)
  99.             ||
  100.             (strcmp(CHECKSUM[0].magic, "MINDMAZE") != 0)
  101.             ) {
  102.             // Si las hay, inicializa los datos del juego
  103.             InitGameData();
  104.             // Graba el archivo
  105.             WriteSavegameFile();
  106.         }
  107.     } else {    // Si no existe, crea los datos de guardado y crealo
  108.         // Inicializa los datos del juego
  109.         InitGameData();
  110.         // Graba el archivo
  111.         WriteSavegameFile();
  112.     }
  113.  
  114. }
  115.  
  116.  
  117.  
  118. // Funcion WriteSavegameFile();
  119. void WriteSavegameFile(void) {
  120.  
  121.     // Variables
  122.     FILE* savefile;             // Puntero de archivo
  123.  
  124.     // Alamacena el CHECKSUM
  125.     CHECKSUM[0].value = SavedataChecksum();
  126.  
  127.     // Crea el Archivo
  128.     savefile = fopen(SAVEFILEPATH, "wb");
  129.  
  130.     // Graba los datos solo en caso de poder escribir el archivo
  131.     if (savefile) {
  132.         fwrite((void*)&CHECKSUM, sizeof(CHECKSUM), 1, savefile);
  133.         fwrite((void*)&GAMEOPTIONS, sizeof(GAMEOPTIONS), 1, savefile);
  134.         fwrite((void*)&SAVEDATA, sizeof(SAVEDATA), 1, savefile);
  135.     }
  136.  
  137.     // Cierra el archivo
  138.     fclose(savefile);
  139.  
  140. }
  141.  
  142.  
  143.  
  144. // Funcion ReadSavegameFile();
  145. void ReadSavegameFile(void) {
  146.  
  147.     // Variables
  148.     FILE* savefile;             // Puntero de archivo
  149.  
  150.     // Abre el Archivo
  151.     savefile = fopen(SAVEFILEPATH, "rb");
  152.  
  153.     // Si el archivo se a abierto con exito
  154.     if (savefile) {
  155.         // Borra el contenido previo
  156.         memset((void*)&CHECKSUM, 0, sizeof(CHECKSUM));
  157.         memset((void*)&GAMEOPTIONS, 0, sizeof(GAMEOPTIONS));
  158.         memset((void*)&SAVEDATA, 0, sizeof(SAVEDATA));
  159.         // Lee los datos
  160.         fread((void*)&CHECKSUM, sizeof(CHECKSUM), 1, savefile);
  161.         fread((void*)&GAMEOPTIONS, sizeof(GAMEOPTIONS), 1, savefile);
  162.         fread((void*)&SAVEDATA, sizeof(SAVEDATA), 1, savefile);
  163.     }
  164.  
  165.     // Cierra el archivo
  166.     fclose(savefile);
  167.  
  168. }
  169.  
  170.  
  171.  
  172. // Funcion CheckSavegameSRAM();
  173. void CheckSavegameSRAM(void) {
  174.  
  175.     // Variables
  176.     u32 checksum = 0;       // Checksum de los datos del juego
  177.  
  178.     // Carga los datos de la SRAM
  179.     if (USE_SRAM && !REG_DSIMODE) ReadSRAM();
  180.  
  181.     // Calcula el Checksum
  182.     checksum = SavedataChecksum();
  183.  
  184.     // Si hay discrepancias
  185.     if (
  186.         (checksum != CHECKSUM[0].value)
  187.         ||
  188.         (CHECKSUM[0].version != SAVEGAMEVERSION)
  189.         ||
  190.         (strcmp(CHECKSUM[0].magic, "MINDMAZE") != 0)
  191.         ) {
  192.         // Inicializa los datos del juego
  193.         InitGameData();
  194.         // Guarda los datos
  195.         if (USE_SRAM && !REG_DSIMODE) WriteSRAM();
  196.     }
  197.  
  198. }
  199.  
  200.  
  201.  
  202. // Funcion WriteSRAM();
  203. void WriteSRAM(void) {
  204.  
  205.     // Variables
  206.     u16 adress = 0;         // Posicion en la SRAM
  207.     u16 i = 0;              // Indice
  208.     bool slot2 = false;     // Propietario actual del SLOT2
  209.  
  210.     // Alamacena el CHECKSUM
  211.     CHECKSUM[0].value = SavedataChecksum();
  212.  
  213.     // Si no lo es, haz al ARM9 propietario del SLOT2 y guarda el propietario actual
  214.     slot2 = (REG_EXMEMCNT & ARM7_OWNS_ROM) == 0;
  215.     sysSetCartOwner(true);
  216.  
  217.     // Copia los datos del bloque CHECKSUM
  218.     for (i = 0; i < sizeof(CHECKSUM); i ++) {
  219.         ((u8*)SRAM)[adress] = ((u8*)CHECKSUM)[i];
  220.         adress ++;
  221.     }
  222.  
  223.     // Copia los datos del bloque GAMEOPTIONS
  224.     for (i = 0; i < sizeof(GAMEOPTIONS); i ++) {
  225.         ((u8*)SRAM)[adress] = ((u8*)GAMEOPTIONS)[i];
  226.         adress ++;
  227.     }
  228.  
  229.     // Copia los datos del bloque SAVEDATA
  230.     for (i = 0; i < sizeof(SAVEDATA); i ++) {
  231.         ((u8*)SRAM)[adress] = ((u8*)SAVEDATA)[i];
  232.         adress ++;
  233.     }
  234.  
  235.     // Devuelve el propietario del SLOT2 al propietario anterior
  236.     sysSetCartOwner(slot2);
  237.  
  238. }
  239.  
  240.  
  241.  
  242. // Funcion WriteSRAM();
  243. void ReadSRAM(void) {
  244.  
  245.     // Variables
  246.     u16 adress = 0;         // Posicion en la SRAM
  247.     u16 i = 0;              // Indice
  248.     bool slot2 = false;     // Propietario actual del SLOT2
  249.  
  250.     // Borra el contenido previo
  251.     memset((void*)&CHECKSUM, 0, sizeof(CHECKSUM));
  252.     memset((void*)&GAMEOPTIONS, 0, sizeof(GAMEOPTIONS));
  253.     memset((void*)&SAVEDATA, 0, sizeof(SAVEDATA));
  254.  
  255.     // Si no lo es, haz al ARM9 propietario del SLOT2 y guarda el propietario actual
  256.     slot2 = (REG_EXMEMCNT & ARM7_OWNS_ROM) == 0;
  257.     sysSetCartOwner(true);
  258.  
  259.     // Copia los datos del bloque CHECKSUM
  260.     for (i = 0; i < sizeof(CHECKSUM); i ++) {
  261.         ((u8*)CHECKSUM)[i] = ((u8*)SRAM)[adress];
  262.         adress ++;
  263.     }
  264.  
  265.     // Copia los datos del bloque GAMEOPTIONS
  266.     for (i = 0; i < sizeof(GAMEOPTIONS); i ++) {
  267.         ((u8*)GAMEOPTIONS)[i] = ((u8*)SRAM)[adress];
  268.         adress ++;
  269.     }
  270.  
  271.     // Copia los datos del bloque SAVEDATA
  272.     for (i = 0; i < sizeof(SAVEDATA); i ++) {
  273.         ((u8*)SAVEDATA)[i] = ((u8*)SRAM)[adress];
  274.         adress ++;
  275.     }
  276.  
  277.     // Devuelve el propietario del SLOT2 al propietario anterior
  278.     sysSetCartOwner(slot2);
  279.  
  280. }
  281.  
  282.  
  283.  
  284. // Verifica si puedes escribir en FAT
  285. bool CheckFATWrite(const char* path) {
  286.  
  287.     // Variables
  288.     bool filefound = false;     // Existe el fichero
  289.     u16 l = 0;                  // Longitud del path al archivo
  290.     FILE* savefile;             // Puntero de archivo
  291.     char testfile[256];         // Nombre de archivo
  292.  
  293.     // Almacena el path
  294.     sprintf(testfile, path);
  295.  
  296.     // Añade la extension .CHK al archivo de verificacion
  297.     l = strlen(testfile);
  298.     testfile[(l - 3)] = 'c';
  299.     testfile[(l - 2)] = 'h';
  300.     testfile[(l - 1)] = 'k';
  301.  
  302.     // Verifica si puedes abrir en el archivo de verificacion
  303.     savefile = fopen(testfile, "rb");
  304.     if (savefile) {
  305.         filefound = true;
  306.     } else {
  307.         filefound = false;
  308.     }
  309.     fclose(savefile);
  310.  
  311.     // Si no puedes, crea uno e intentalo abrir de nuevo
  312.     if (!filefound) {
  313.         savefile = fopen(testfile, "wb");
  314.         fclose(savefile);
  315.         savefile = fopen(testfile, "rb");
  316.         if (savefile) filefound = true;
  317.         fclose(savefile);
  318.     }
  319.  
  320.     return filefound;
  321.  
  322. }
  323.  
  324.  
  325.  
  326. // Funcion SavedataChecksum();
  327. u32 SavedataChecksum(void) {
  328.  
  329.     // Variables
  330.     u16 i = 0;
  331.     u32 checksum = 0;
  332.  
  333.     // Checksum de los datos del bloque GAMEOPTIONS
  334.     for (i = 0; i < sizeof(GAMEOPTIONS); i ++) {
  335.         checksum += ((u8*)GAMEOPTIONS)[i];
  336.     }
  337.  
  338.     // Checksum de los datos del bloque SAVEDATA
  339.     for (i = 0; i < sizeof(SAVEDATA); i ++) {
  340.         checksum += ((u8*)SAVEDATA)[i];
  341.     }
  342.  
  343.     // Variables
  344.     return checksum;
  345.  
  346. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement