diff options
author | Paul Gilbert | 2018-11-17 16:52:47 -0800 |
---|---|---|
committer | Paul Gilbert | 2018-12-08 19:05:59 -0800 |
commit | b05a16a0ad0dcc2881aeda81e0d1a84a752eccab (patch) | |
tree | e7f0468357c5c3248591bd334b1a4d42a999b550 /engines/glk/frotz/processor_streams.cpp | |
parent | 326f69136eb4fee72391a8175ad722a317f84ca6 (diff) | |
download | scummvm-rg350-b05a16a0ad0dcc2881aeda81e0d1a84a752eccab.tar.gz scummvm-rg350-b05a16a0ad0dcc2881aeda81e0d1a84a752eccab.tar.bz2 scummvm-rg350-b05a16a0ad0dcc2881aeda81e0d1a84a752eccab.zip |
GLK: Centralizing more of the savegame code in GlkEngine
Diffstat (limited to 'engines/glk/frotz/processor_streams.cpp')
-rw-r--r-- | engines/glk/frotz/processor_streams.cpp | 211 |
1 files changed, 19 insertions, 192 deletions
diff --git a/engines/glk/frotz/processor_streams.cpp b/engines/glk/frotz/processor_streams.cpp index 091165ed7c..cbef38aaa6 100644 --- a/engines/glk/frotz/processor_streams.cpp +++ b/engines/glk/frotz/processor_streams.cpp @@ -545,227 +545,54 @@ void Processor::z_restart() { } void Processor::z_save() { -#ifdef TODO bool success = false; if (zargc != 0) { // Open auxilary file frefid_t ref = glk_fileref_create_by_prompt(fileusage_Data | fileusage_BinaryMode, filemode_Write, 0); - if (ref == nullptr) - goto finished; + if (ref != nullptr) { + // Write data + strid_t f = glk_stream_open_file(ref, filemode_Write); - // Write data - strid_t f = glk_stream_open_file(ref, filemode_Write); + glk_put_buffer_stream(f, (const char *)zmp + zargs[0], zargs[1]); - glk_put_buffer_stream(f, (const char *)zmp + zargs[0], zargs[1]); - - glk_stream_close(f); - - } else { - long pc; - zword addr; - zword nsp, nfp; - int skip; - int i; - - /* Open game file */ - - if ((gfp = frotzopenprompt (FILE_SAVE)) == nullptr) - goto finished; - - if (_save_quetzal) { - success = save_quetzal (gfp, story_fp, blorb_ofs); - } else { - /* Write game file */ - - fputc ((int) hi (h_release), gfp); - fputc ((int) lo (h_release), gfp); - fputc ((int) hi (h_checksum), gfp); - fputc ((int) lo (h_checksum), gfp); - - GET_PC (pc) - - fputc ((int) (pc >> 16) & 0xff, gfp); - fputc ((int) (pc >> 8) & 0xff, gfp); - fputc ((int) (pc) & 0xff, gfp); - - nsp = (int) (_sp - _stack); - nfp = (int) (_fp - _stack); - - fputc ((int) hi (nsp), gfp); - fputc ((int) lo (nsp), gfp); - fputc ((int) hi (nfp), gfp); - fputc ((int) lo (nfp), gfp); - - for (i = nsp; i < STACK_SIZE; i++) { - fputc ((int) hi (_stack[i]), gfp); - fputc ((int) lo (_stack[i]), gfp); - } - - fseek (story_fp, blorb_ofs, SEEK_SET); - - for (addr = 0, skip = 0; addr < h_dynamic_size; addr++) - if (zmp[addr] != fgetc (story_fp) || skip == 255 || addr + 1 == h_dynamic_size) { - fputc (skip, gfp); - fputc (zmp[addr], gfp); - skip = 0; - } else skip++; + glk_stream_close(f); + success = true; } - - /* Close game file and check for errors */ - - if (fclose (gfp) == EOF || ferror (story_fp)) { - print_string ("Error writing save file\n"); - goto finished; - } - - /* Success */ - - success = 1; - + } else { + success = saveGame().getCode() == Common::kNoError; } -finished: - if (h_version <= V3) branch (success); else store (success); -#endif } void Processor::z_restore() { -#ifdef TODO - FILE *gfp; - - zword success = 0; + bool success = false; if (zargc != 0) { + frefid_t ref = glk_fileref_create_by_prompt(fileusage_Data | fileusage_BinaryMode, + filemode_Read, 0); + if (ref != nullptr) { + // Write data + strid_t f = glk_stream_open_file(ref, filemode_Read); - /* Get the file name */ - - /* Open auxilary file */ - - if ((gfp = frotzopenprompt(FILE_LOAD_AUX)) == nullptr) - goto finished; - - /* Load auxilary file */ - - success = fread (zmp + zargs[0], 1, zargs[1], gfp); - - /* Close auxilary file */ - - fclose (gfp); - - } else { - - long pc; - zword release; - zword addr; - int i; - - /* Open game file */ - - if ((gfp = frotzopenprompt(FILE_RESTORE)) == nullptr) - goto finished; - - if (_save_quetzal) { - success = restore_quetzal (gfp, story_fp, blorb_ofs); - - } else { - /* Load game file */ - - release = (unsigned) fgetc (gfp) << 8; - release |= fgetc (gfp); - - () fgetc (gfp); - () fgetc (gfp); - - /* Check the release number */ - - if (release == h_release) { - - pc = (long) fgetc (gfp) << 16; - pc |= (unsigned) fgetc (gfp) << 8; - pc |= fgetc (gfp); - - SET_PC (pc); - - _sp = _stack + (fgetc (gfp) << 8); - _sp += fgetc (gfp); - _fp = _stack + (fgetc (gfp) << 8); - _fp += fgetc (gfp); - - for (i = (int) (_sp - _stack); i < STACK_SIZE; i++) { - _stack[i] = (unsigned) fgetc (gfp) << 8; - _stack[i] |= fgetc (gfp); - } - - fseek (story_fp, blorb_ofs, SEEK_SET); - - for (addr = 0; addr < h_dynamic_size; addr++) { - int skip = fgetc (gfp); - for (i = 0; i < skip; i++) - zmp[addr++] = fgetc (story_fp); - zmp[addr] = fgetc (gfp); - () fgetc (story_fp); - } - - /* Check for errors */ - - if (ferror (gfp) || ferror (story_fp) || addr != h_dynamic_size) - success = -1; - else - - /* Success */ - - success = 2; + glk_get_buffer_stream(f, (char *)zmp + zargs[0], zargs[1]); - } else print_string ("Invalid save file\n"); + glk_stream_close(f); + success = true; } - - if ((short) success >= 0) { - - /* Close game file */ - - fclose (gfp); - - if ((short) success > 0) { - zbyte old_screen_rows; - zbyte old_screen_cols; - - /* In V3, reset the upper window. */ - if (h_version == V3) - split_window (0); - - LOW_BYTE (H_SCREEN_ROWS, old_screen_rows); - LOW_BYTE (H_SCREEN_COLS, old_screen_cols); - - /* Reload cached header fields. */ - restart_header (); - - /* - * Since QUETZAL files may be saved on many different machines, - * the screen sizes may vary a lot. Erasing the status window - * seems to cover up most of the resulting badness. - */ - if (h_version > V3 && h_version != V6 - && (h_screen_rows != old_screen_rows - || h_screen_cols != old_screen_cols)) - erase_window (1); - } - } else - os_fatal ("Error reading save file"); + } else { + success = loadGame().getCode() == Common::kNoError; } -finished: - if (h_version <= V3) branch (success); else store (success); -#endif } void Processor::z_verify() { |