diff --git a/backends/frotz/dumb_init.c b/backends/frotz/dumb_init.c new file mode 100644 index 0000000000000000000000000000000000000000..32f1e202b4c7ec945755ad27dbb8e1de68c1354e --- /dev/null +++ b/backends/frotz/dumb_init.c @@ -0,0 +1,237 @@ +/* dumb-init.c + * $Id: dumb-init.c,v 1.1.1.1 2002/03/26 22:38:34 feedle Exp $ + * + * Copyright 1997,1998 Alva Petrofsky . + * Any use permitted provided this notice stays intact. + */ + +#include "dumb_frotz.h" + +#define VERSION 1.0 + +f_setup_t f_setup; + +#define INFORMATION "\ +An interpreter for all Infocom and other Z-Machine games.\n\ +Complies with standard 1.0 of Graham Nelson's specification.\n\ +\n\ +Syntax: dfrotz [options] story-file\n\ + -a watch attribute setting \t -Q use old-style save format\n\ + -A watch attribute testing \t -R xxx do runtime setting \\xxx\n\ + -h # screen height \t before starting (can be used repeatedly)\n\ + -i ignore fatal errors \t -s # random number seed value\n\ + -I # interpreter number \t -S # transscript width\n\ + -o watch object movement \t -t set Tandy bit\n\ + -O watch object locating \t -u # slots for multiple undo\n\ + -p plain ASCII output only \t -w # screen width\n\ + -P alter piracy opcode \t -x expand abbreviations g/x/z" + +/* +static char usage[] = "\ +\n\ +FROTZ V2.32 - interpreter for all Infocom games. Complies with standard\n\ +1.0 of Graham Nelson's specification. Written by Stefan Jokisch in 1995-7.\n\ +\n\ +DUMB-FROTZ V2.32R1 - port for all platforms. Somewhat complies with standard\n\ +9899 of ISO's specification. Written by Alembic Petrofsky in 1997-8.\n\ +\n\ +Syntax: frotz [options] story-file [graphics-file]\n\ +\n\ + -a watch attribute setting\n\ + -A watch attribute testing\n\ + -h # screen height\n\ + -i ignore runtime errors\n\ + -I # interpreter number to report to game\n\ + -o watch object movement\n\ + -O watch object locating\n\ + -p alter piracy opcode\n\ + -P transliterate latin1 to plain ASCII\n\ + -R xxx do runtime setting \\xxx before starting\n\ + (this option can be used multiple times)\n\ + -s # random number seed value\n\ + -S # transscript width\n\ + -t set Tandy bit\n\ + -u # slots for multiple undo\n\ + -w # screen width\n\ + -x expand abbreviations g/x/z\n\ +\n\ +While running, enter \"\\help\" to list the runtime escape sequences.\n\ +"; +*/ + + +/* A unix-like getopt, but with the names changed to avoid any problems. */ +static int zoptind = 1; +static int zoptopt = 0; +static char *zoptarg = NULL; +static int zgetopt (int argc, char *argv[], const char *options) +{ + static pos = 1; + const char *p; + if (zoptind >= argc || argv[zoptind][0] != '-' || argv[zoptind][1] == 0) + return EOF; + zoptopt = argv[zoptind][pos++]; + zoptarg = NULL; + if (argv[zoptind][pos] == 0) + { pos = 1; zoptind++; } + p = strchr (options, zoptopt); + if (zoptopt == ':' || p == NULL) { + fputs ("illegal option -- ", stderr); + goto error; + } else if (p[1] == ':') + if (zoptind >= argc) { + fputs ("option requires an argument -- ", stderr); + goto error; + } else { + zoptarg = argv[zoptind]; + if (pos != 1) + zoptarg += pos; + pos = 1; zoptind++; + } + return zoptopt; +error: + fputc (zoptopt, stderr); + fputc ('\n', stderr); + return '?'; +}/* zgetopt */ + +static int user_screen_width = 75; +static int user_screen_height = 100; +static int user_interpreter_number = -1; +static int user_random_seed = -1; +static int user_tandy_bit = 0; +static char *graphics_filename = NULL; +static int plain_ascii = FALSE; + +void os_process_arguments(int argc, char *argv[]) +{ + return; + int c; + + /* Parse the options */ + do { + c = zgetopt(argc, argv, "aAh:iI:oOpPQs:R:S:tu:w:xZ:"); + switch(c) { + case 'a': f_setup.attribute_assignment = 1; break; + case 'A': f_setup.attribute_testing = 1; break; + case 'h': user_screen_height = atoi(zoptarg); break; + case 'i': f_setup.ignore_errors = 1; break; + case 'I': f_setup.interpreter_number = atoi(zoptarg); break; + case 'o': f_setup.object_movement = 1; break; + case 'O': f_setup.object_locating = 1; break; + case 'P': f_setup.piracy = 1; break; + case 'p': plain_ascii = 1; break; + case 'Q': f_setup.save_quetzal = 0; break; + case 'R': dumb_handle_setting(zoptarg, FALSE, TRUE); break; + case 's': user_random_seed = atoi(zoptarg); break; + case 'S': f_setup.script_cols = atoi(zoptarg); break; + case 't': user_tandy_bit = 1; break; + case 'u': f_setup.undo_slots = atoi(zoptarg); break; + case 'w': user_screen_width = atoi(zoptarg); break; + case 'x': f_setup.expand_abbreviations = 1; break; + case 'Z': f_setup.err_report_mode = atoi(zoptarg); + if ((f_setup.err_report_mode < ERR_REPORT_NEVER) || + (f_setup.err_report_mode > ERR_REPORT_FATAL)) + f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE; + break; + } + } while (c != EOF); + + if (((argc - zoptind) != 1) && ((argc - zoptind) != 2)) { + printf("FROTZ V%s\tdumb interface.\n", VERSION); + puts(INFORMATION); + printf("\t-Z # error checking mode (default = %d)\n" + "\t %d = don't report errors %d = report first error\n" + "\t %d = report all errors %d = exit after any error\n\n", + ERR_DEFAULT_REPORT_MODE, ERR_REPORT_NEVER, + ERR_REPORT_ONCE, ERR_REPORT_ALWAYS, ERR_REPORT_FATAL); + exit(1); + } +/* + if (((argc - zoptind) != 1) && ((argc - zoptind) != 2)) { + puts(usage); + exit(1); + } +*/ + story_name = argv[zoptind++]; + if (zoptind < argc) + graphics_filename = argv[zoptind++]; + +} + +void os_init_screen(void) +{ + if (h_version == V3 && user_tandy_bit) + h_config |= CONFIG_TANDY; + + if (h_version >= V5 && f_setup.undo_slots == 0) + h_flags &= ~UNDO_FLAG; + + h_screen_rows = user_screen_height; + h_screen_cols = user_screen_width; + + if (user_interpreter_number > 0) + h_interpreter_number = user_interpreter_number; + else { + /* Use ms-dos for v6 (because that's what most people have the + * graphics files for), but don't use it for v5 (or Beyond Zork + * will try to use funky characters). */ + h_interpreter_number = h_version == 6 ? INTERP_MSDOS : INTERP_DEC_20; + } + h_interpreter_version = 'F'; + + dumb_init_input(); + dumb_init_output(); + dumb_init_pictures(graphics_filename); +} + +int os_random_seed (void) +{ + if (user_random_seed == -1) + /* Use the epoch as seed value */ + return (time(0) & 0x7fff); + else return user_random_seed; +} + +void os_restart_game (int stage) {} + +void os_fatal (const char *s) +{ + fprintf(stderr, "\nFatal error: %s\n", s); +// exit(1); +} + +FILE *os_path_open(const char *name, const char *mode) +{ + FILE *fp; + char buf[FILENAME_MAX + 1]; + char *p; + + /* Let's see if the file is in the currect directory */ + /* or if the user gave us a full path. */ + if ((fp = fopen(name, mode))) { + return fp; + } + /* Sorry, but dumb frotz is too dumb to care about searching paths. */ + return NULL; +} + +void os_init_setup(void) +{ + f_setup.attribute_assignment = 0; + f_setup.attribute_testing = 0; + f_setup.context_lines = 0; + f_setup.object_locating = 0; + f_setup.object_movement = 0; + f_setup.left_margin = 0; + f_setup.right_margin = 0; + f_setup.ignore_errors = 0; + f_setup.piracy = 0; + f_setup.undo_slots = MAX_UNDO_SLOTS; + f_setup.expand_abbreviations = 0; + f_setup.script_cols = 80; + f_setup.save_quetzal = 1; + f_setup.sound = 1; + f_setup.err_report_mode = ERR_DEFAULT_REPORT_MODE; + +}