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/frotz.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/frotz.cpp')
-rw-r--r-- | engines/glk/frotz/frotz.cpp | 169 |
1 files changed, 165 insertions, 4 deletions
diff --git a/engines/glk/frotz/frotz.cpp b/engines/glk/frotz/frotz.cpp index a6371b6ef3..344aa92b12 100644 --- a/engines/glk/frotz/frotz.cpp +++ b/engines/glk/frotz/frotz.cpp @@ -84,13 +84,174 @@ void Frotz::initialize() { z_restart(); } -Common::Error Frotz::loadGameState(int slot) { - // TODO +Common::Error Frotz::saveGameData(strid_t file) { +#ifdef TODO + 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++; + } + + /* 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; +#endif return Common::kNoError; } -Common::Error Frotz::saveGameState(int slot, const Common::String &desc) { - // TODO +Common::Error Frotz::loadGameData(strid_t file) { +#ifdef TODO + 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; + + } else print_string ("Invalid save file\n"); + } + + 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"); +#endif return Common::kNoError; } |