Added Nitfol and Frotz source code.
[projects/chimara/chimara.git] / interpreters / nitfol / main.c
diff --git a/interpreters/nitfol/main.c b/interpreters/nitfol/main.c
new file mode 100644 (file)
index 0000000..ce0ceac
--- /dev/null
@@ -0,0 +1,133 @@
+/*  Nitfol - z-machine interpreter using Glk for output.
+    Copyright (C) 1999  Evin Robertson
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+
+    The author can be reached at nitfol@deja.com
+*/
+#include "nitfol.h"
+
+#include "gi_blorb.h"
+
+
+static void set_zfile(strid_t file)
+{
+  glk_stream_set_position(file, 0, seekmode_End);
+  total_size = glk_stream_get_position(file);
+  glk_stream_set_position(file, 0, seekmode_Start);
+
+  current_zfile = file;
+  zfile_offset = 0;
+
+  if(!load_header(file, total_size, FALSE)) {
+    /* FIMXE: add code to check to see if it's a jzexe product, and perhaps
+       even code to grab it out of disk images */
+    current_zfile = NULL;
+    return;
+  }
+  
+  glk_stream_set_position(file, zfile_offset, seekmode_Start);
+}
+
+
+static strid_t savefile;
+
+int game_use_file(strid_t file)
+{
+  giblorb_map_t *map;
+  giblorb_result_t res;
+  strid_t z;
+  if(wrap_gib_create_map(file, &map) == giblorb_err_None) {
+    if(!current_zfile) {
+      if(wrap_gib_load_resource(map, giblorb_method_FilePos, &res,
+               giblorb_ID_Exec, 0) == giblorb_err_None) {
+       current_zfile = file;
+       zfile_offset = res.data.startpos;
+       total_size = res.length;
+      }
+    }
+    if(!blorb_file)
+      wrap_gib_count_resources(map, giblorb_ID_Pict, &imagecount, NULL, NULL);
+    wrap_gib_destroy_map(map);
+
+    if(!blorb_file) {
+      if(wrap_gib_set_resource_map(file) == giblorb_err_None) {
+       blorb_file = file;
+       return TRUE;
+      }
+    }
+  }
+
+  if((z = quetzal_findgamefile(file)) != 0) {
+    savefile = file;
+    file = z;
+  }
+
+  if(!current_zfile) {
+    set_zfile(file);
+
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+
+void glk_main(void)
+{
+  if(!current_zfile)
+  {
+    winid_t tempwin;
+    tempwin = glk_window_open(0, 0, 100, wintype_TextBuffer, 0);
+       glk_set_window(tempwin);
+       glk_set_style(style_Preformatted);
+       glk_put_string(
+"Usage: nitfol [OPTIONS] gamefile\n"
+" -i, -ignore      Ignore Z-machine strictness errors\n"
+" -f, -fullname    For running under Emacs or DDD\n"
+" -x, -command     Read commands from this file\n"
+" -P, -pirate      Aye, matey\n"
+"     -spell       Perform spelling correction\n"
+"     -expand      Expand one letter abbreviations\n"
+" -s, -symbols     Specify symbol file for game\n"
+" -t, -tandy       Censors some Infocom games\n"
+" -T, -transcript  Write transcript to this file\n"
+" -d, -debug       Enter debugger immediatly\n"
+"     -prompt      Specify debugging prompt\n"
+"     -autoundo    Ensure '@save_undo' is called every turn\n"
+" -S, -stacklimit  Exit when the stack is this deep\n"
+" -a, -alias       Specify an alias\n"
+"     -ralias      Specify an recursive alias\n"
+"     -unalias     Remove an alias\n"
+" -r, -random      Set random seed\n"
+"     -mapsym      Specify mapping glyphs\n"
+"     -mapsize     Specify map size\n"
+"     -maploc      Specify map location\n"
+"     -terpnum     Specify interpreter number\n"
+"     -terpver     Specify interpreter version\n");
+    glk_exit();
+  }
+  z_init(current_zfile);
+  if(savefile) {
+    if(restorequetzal(savefile)) {
+      if(zversion <= 3)
+       mop_take_branch();
+      else
+       mop_store_result(2);
+    }
+  }
+  init_undo();
+  decode();
+}