projects
/
open-adventure.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add optional auto-save/restore feature using -a <filename> option
[open-adventure.git]
/
main.c
diff --git
a/main.c
b/main.c
index 1bdc64c3fbbc3b733283c9504f62efe207c9704f..c53660081b3fa5abfc8444c03ce244cb7e76113c 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-18,6
+18,18
@@
#define DIM(a) (sizeof(a)/sizeof(a[0]))
#define DIM(a) (sizeof(a)/sizeof(a[0]))
+#if defined ADVENT_AUTOSAVE
+static FILE* autosave_fp;
+void autosave(void)
+{
+ if (autosave_fp != NULL) {
+ rewind(autosave_fp);
+ savefile(autosave_fp, /* version (auto): */0);
+ fflush(autosave_fp);
+ }
+}
+#endif
+
// LCOV_EXCL_START
// exclude from coverage analysis because it requires interactivity to test
static void sig_handler(int signo)
// LCOV_EXCL_START
// exclude from coverage analysis because it requires interactivity to test
static void sig_handler(int signo)
@@
-26,6
+38,11
@@
static void sig_handler(int signo)
if (settings.logfp != NULL)
fflush(settings.logfp);
}
if (settings.logfp != NULL)
fflush(settings.logfp);
}
+
+#if defined ADVENT_AUTOSAVE
+ if (signo == SIGHUP || signo == SIGTERM)
+ autosave();
+#endif
exit(EXIT_FAILURE);
}
// LCOV_EXCL_STOP
exit(EXIT_FAILURE);
}
// LCOV_EXCL_STOP
@@
-50,7
+67,12
@@
int main(int argc, char *argv[])
/* Options. */
/* Options. */
-#ifndef ADVENT_NOSAVE
+#if defined ADVENT_AUTOSAVE
+ const char* opts = "l:oa:";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [-a filename] [script...]\n";
+ FILE *rfp = NULL;
+ const char* autosave_filename = NULL;
+#elif !defined ADVENT_NOSAVE
const char* opts = "l:or:";
const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [script...]\n";
FILE *rfp = NULL;
const char* opts = "l:or:";
const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [script...]\n";
FILE *rfp = NULL;
@@
-72,7
+94,14
@@
int main(int argc, char *argv[])
settings.oldstyle = true;
settings.prompt = false;
break;
settings.oldstyle = true;
settings.prompt = false;
break;
-#ifndef ADVENT_NOSAVE
+#ifdef ADVENT_AUTOSAVE
+ case 'a':
+ rfp = fopen(optarg, READ_MODE);
+ autosave_filename = optarg;
+ signal(SIGHUP, sig_handler);
+ signal(SIGTERM, sig_handler);
+ break;
+#elif !defined ADVENT_NOSAVE
case 'r':
rfp = fopen(optarg, "r");
if (rfp == NULL)
case 'r':
rfp = fopen(optarg, "r");
if (rfp == NULL)
@@
-88,7
+117,10
@@
int main(int argc, char *argv[])
" -l create a log file of your game named as specified'\n");
fprintf(stderr,
" -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n");
" -l create a log file of your game named as specified'\n");
fprintf(stderr,
" -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n");
-#ifndef ADVENT_NOSAVE
+#if defined ADVENT_AUTOSAVE
+ fprintf(stderr,
+ " -a automatic save/restore from specified saved game file\n");
+#elif !defined ADVENT_NOSAVE
fprintf(stderr,
" -r restore from specified saved game file\n");
#endif
fprintf(stderr,
" -r restore from specified saved game file\n");
#endif
@@
-105,14
+137,26
@@
int main(int argc, char *argv[])
/* Initialize game variables */
int seedval = initialise();
/* Initialize game variables */
int seedval = initialise();
-#if
ndef
ADVENT_NOSAVE
+#if
!defined
ADVENT_NOSAVE
if (!rfp) {
game.novice = yes_or_no(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)
game.limit = NOVICELIMIT;
} else {
restore(rfp);
if (!rfp) {
game.novice = yes_or_no(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)
game.limit = NOVICELIMIT;
} else {
restore(rfp);
+#if defined ADVENT_AUTOSAVE
+ score(scoregame);
+#endif
}
}
+#if defined ADVENT_AUTOSAVE
+ if (autosave_filename != NULL) {
+ if ((autosave_fp = fopen(autosave_filename, WRITE_MODE)) == NULL) {
+ perror(autosave_filename);
+ return EXIT_FAILURE;
+ }
+ autosave();
+ }
+#endif
#else
game.novice = yes_or_no(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)
#else
game.novice = yes_or_no(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)