Mercurial > hg > early-roguelike
view urogue/save.c @ 291:5b6855d5d089
Fix a portability issue with md_hasclreol().
Some games' implementation of md_hasclreol() poked around in ncurses
internals, which does not work for some ncurses build configuration.
Most games did not actually call md_hasclreol(), so it was removed.
There is a standard terminfo function which can retrieve the value of
the clr_eol capability, so this was used for rogue5.
author | John "Elwin" Edwards |
---|---|
date | Wed, 27 Dec 2017 10:26:06 -0500 |
parents | 1db299e868b8 |
children |
line wrap: on
line source
/* save.c - save and restore routines UltraRogue: The Ultimate Adventure in the Dungeons of Doom Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong All rights reserved. Based on "Advanced Rogue" Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka All rights reserved. Based on "Rogue: Exploring the Dungeons of Doom" Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman All rights reserved. See the file LICENSE.TXT for full copyright and licensing information. */ #define _ALL_SOURCE /* need to remove need for this AIXism */ #include <time.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include "rogue.h" int save_savedir_game(void); int save_game(void) { FILE *savefd; char buf[2 * LINELEN]; char oldfile[2*LINELEN]; if (use_savedir) return save_savedir_game(); /* get file name */ strcpy(oldfile,file_name); do { mpos = 0; if (oldfile[0] != '\0') msg("Save file [%s]: ", file_name); else msg("Save file as: "); mpos = 0; buf[0] = '\0'; if (get_string(buf, cw) == QUIT) { msg(""); return(FALSE); } if ( (buf[0] == 0) && (oldfile[0] != 0) ) strcpy(file_name, oldfile); else if (buf[0] != 0) strcpy(file_name, buf); else { msg(""); return(FALSE); } wclear(hw); wmove(hw, LINES - 1, 0); wrefresh(hw); if ((savefd = fopen(file_name, "w")) == NULL) msg(strerror(errno)); /* fake perror() */ } while (savefd == NULL); /* write out [compressed?] file */ save_file(savefd); return(TRUE); } /* * save_savedir_game() * Simplified save function for when system savefiles are used. */ int save_savedir_game(void) { FILE *savef; char c; mpos = 0; msg("Save game? "); c = readcharw(cw); if (c == 'y' || c == 'Y') { if ((savef = fopen(file_name, "w")) == NULL) { msg(strerror(errno)); return(FALSE); } msg(""); save_file(savef); return(TRUE); } else { msg(""); return(FALSE); } } void auto_save(int sig) { FILE *savef; md_ignore_signals(); if (file_name[0] && (savef = fopen(file_name, "w"))) { save_file(savef); } exit(0); } int restore(char *file) { FILE *infd; char *sp; if (strcmp(file, "-r") == 0) file = file_name; if ((infd = fopen(file, "r")) == NULL) { if (use_savedir && errno == ENOENT) return TRUE; perror(file); return(FALSE); } if ( restore_file(infd) == FALSE ) return(FALSE); /* * we do not close the file so that we will have a hold of the inode * for as long as possible */ if (remove(file) < 0) { printf("Cannot unlink file\n"); return(FALSE); } if ((sp = getenv("OPTIONS")) != NULL) parse_opts(sp); strcpy(file_name, file); clearok(cw, TRUE); touchwin(cw); noecho(); nonl(); while(playing) { do_daemons(BEFORE); do_fuses(BEFORE); command(); /* Command execution */ if (after) do_after_effects(); } fatal(""); return(FALSE); }