s32 save_game_config_file() { u8 game_config_filename[512]; u32 i; change_ext(gamepak_filename, game_config_filename, ".cfg"); file_open(game_config_file, game_config_filename, write); if(file_check_valid(game_config_file)) { u32 file_options[14]; file_options[0] = current_frameskip_type; file_options[1] = frameskip_value; file_options[2] = random_skip; file_options[3] = clock_speed; for(i = 0; i < 10; i++) { file_options[4 + i] = cheats[i].cheat_active; } file_write_array(game_config_file, file_options); file_close(game_config_file); return 0; } return -1; }
s32 load_game_config_file() { u8 game_config_filename[512]; u32 file_loaded = 0; u32 i; change_ext(gamepak_filename, game_config_filename, ".cfg"); file_open(game_config_file, game_config_filename, read); if(file_check_valid(game_config_file)) { u32 file_size = file_length(game_config_filename, game_config_file); // Sanity check: File size must be the right size if(file_size == 56) { u32 file_options[file_size / 4]; file_read_array(game_config_file, file_options); current_frameskip_type = file_options[0] % 3; frameskip_value = file_options[1]; random_skip = file_options[2] & 1; clock_speed = global_cycles_per_instruction = file_options[3]; if(frameskip_value < 0) frameskip_value = 0; if(frameskip_value > 99) frameskip_value = 99; file_close(game_config_file); file_loaded = 1; } } if(file_loaded) return 0; current_frameskip_type = auto_frameskip; frameskip_value = 0; random_skip = 0; clock_speed = 4; for(i = 0; i < 10; i++) { cheats[i].cheat_active = 0; } return -1; }
void get_savestate_snapshot(u8 *savestate_filename) { u16 snapshot_buffer[240 * 160]; u8 savestate_timestamp_string[80]; file_open(savestate_file, savestate_filename, read); if(file_check_valid(savestate_file)) { u8 weekday_strings[7][11] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; time_t savestate_time_flat; struct tm *current_time; file_read_array(savestate_file, snapshot_buffer); file_read_variable(savestate_file, savestate_time_flat); file_close(savestate_file); current_time = localtime(&savestate_time_flat); sprintf(savestate_timestamp_string, "%s %02d/%02d/%04d %02d:%02d:%02d ", weekday_strings[current_time->tm_wday], current_time->tm_mon + 1, current_time->tm_mday, current_time->tm_year + 1900, current_time->tm_hour, current_time->tm_min, current_time->tm_sec); savestate_timestamp_string[40] = 0; print_string(savestate_timestamp_string, COLOR_HELP_TEXT, COLOR_BG, 10, 40); } else { memset(snapshot_buffer, 0, 240 * 160 * 2); print_string_ext("No savestate exists for this slot.", 0xFFFF, 0x0000, 15, 75, snapshot_buffer, 240, 0); print_string("---------- --/--/---- --:--:-- ", COLOR_HELP_TEXT, COLOR_BG, 10, 40); } #ifndef GP2X_BUILD blit_to_screen(snapshot_buffer, 240, 160, 230, 40); #endif }
s32 save_config_file() { u8 config_path[512]; #if (defined(PSP_BUILD) || defined(ARM_ARCH)) && !defined(_WIN32_WCE) sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME); #else sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME); #endif file_open(config_file, config_path, write); save_game_config_file(); if(file_check_valid(config_file)) { u32 file_options[23]; u32 i; file_options[0] = screen_scale; file_options[1] = screen_filter; file_options[2] = global_enable_audio; file_options[3] = audio_buffer_size_number; file_options[4] = update_backup_flag; file_options[5] = global_enable_analog; file_options[6] = analog_sensitivity_level; #ifndef PC_BUILD for(i = 0; i < 16; i++) { file_options[7 + i] = gamepad_config_map[i]; } #endif file_write_array(config_file, file_options); file_close(config_file); return 0; } return -1; }
s32 load_config_file() { u8 config_path[512]; #if defined(PSP_BUILD) || defined(ZAURUS) sprintf(config_path, "%s/%s", main_path, GPSP_CONFIG_FILENAME); #else sprintf(config_path, "%s\\%s", main_path, GPSP_CONFIG_FILENAME); #endif file_open(config_file, config_path, read); if(file_check_valid(config_file)) { u32 file_size = file_length(config_path, config_file); // Sanity check: File size must be the right size if(file_size == 92) { u32 file_options[file_size / 4]; u32 i; s32 menu_button = -1; file_read_array(config_file, file_options); screen_scale = file_options[0] % 3; // 2 screen_filter = file_options[1] % 2; global_enable_audio = file_options[2] % 2; #if defined(ZAURUS) || defined(DINGUX_ON_WIN32) audio_buffer_size_number = file_options[3] % 4; #else audio_buffer_size_number = file_options[3] % 11; #endif update_backup_flag = file_options[4] % 2; global_enable_analog = file_options[5] % 2; analog_sensitivity_level = file_options[6] % 8; #ifdef PSP_BUILD scePowerSetClockFrequency(clock_speed, clock_speed, clock_speed / 2); #endif // Sanity check: Make sure there's a MENU or FRAMESKIP // key, if not assign to triangle for(i = 0; i < 16; i++) { gamepad_config_map[i] = file_options[7 + i] % (BUTTON_ID_NONE + 1); if(gamepad_config_map[i] == BUTTON_ID_MENU) { menu_button = i; } } if(menu_button == -1) { gamepad_config_map[0] = BUTTON_ID_MENU; } file_close(config_file); } return 0; } return -1; }
u32 load_file_zip(char *filename) { struct SZIPFileHeader data; char tmp[1024]; s32 retval = -1; u8 *buffer = NULL; u8 *cbuffer; char *ext; int ret; file_open(fd, filename, read); if(!file_check_valid(fd)) return -1; while (1) { ret = file_read(fd, &data, sizeof(data)); if (ret != sizeof(data)) break; // It checks for the following: 0x50 0x4B 0x03 0x04 (PK..) if( data.Sig[0] != 0x50 || data.Sig[1] != 0x4B || data.Sig[2] != 0x03 || data.Sig[3] != 0x04 ) { break; } ret = file_read(fd, tmp, data.FilenameLength); if (ret != data.FilenameLength) break; tmp[data.FilenameLength] = 0; // end string if(data.ExtraFieldLength) file_seek(fd, data.ExtraFieldLength, SEEK_CUR); if(data.GeneralBitFlag & 0x0008) { file_read(fd, &data.DataDescriptor, sizeof(struct SZIPFileDataDescriptor)); } ext = strrchr(tmp, '.') + 1; // file is too big if(data.DataDescriptor.UncompressedSize > gamepak_ram_buffer_size) goto skip; if(!strcasecmp(ext, "bin") || !strcasecmp(ext, "gba")) { buffer = gamepak_rom; // ok, found switch(data.CompressionMethod) { case 0: retval = data.DataDescriptor.UncompressedSize; file_read(fd, buffer, retval); goto outcode; case 8: { z_stream stream; s32 err; cbuffer = (u8 *)malloc(ZIP_BUFFER_SIZE); stream.next_in = (Bytef*)cbuffer; stream.avail_in = (u32)ZIP_BUFFER_SIZE; stream.next_out = (Bytef*)buffer; // EDIT: Now uses proper conversion of data types for retval. retval = (u32)data.DataDescriptor.UncompressedSize; stream.avail_out = data.DataDescriptor.UncompressedSize; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit2(&stream, -MAX_WBITS); file_read(fd, cbuffer, ZIP_BUFFER_SIZE); if(err == Z_OK) { while(err != Z_STREAM_END) { err = inflate(&stream, Z_SYNC_FLUSH); if(err == Z_BUF_ERROR) { stream.avail_in = ZIP_BUFFER_SIZE; stream.next_in = (Bytef*)cbuffer; file_read(fd, cbuffer, ZIP_BUFFER_SIZE); } } err = Z_OK; inflateEnd(&stream); } free(cbuffer); goto outcode; } } } skip: file_seek(fd, data.DataDescriptor.CompressedSize, SEEK_CUR); } outcode: file_close(fd); return retval; }