1 /* 2 * enigma/enigma.h - global prototypes for Enigma. 3 * 4 * Copyright 2000 Simon Tatham. All rights reserved. 5 * 6 * Enigma is licensed under the MIT licence. See the file LICENCE for 7 * details. 8 * 9 * - we are all amf - 10 */ 11 12 #ifndef ENIGMA_ENIGMA_H 13 #define ENIGMA_ENIGMA_H 14 15 #include <setjmp.h> 16 #include <time.h> 17 #ifdef _WIN32 18 # define WIN32_LEAN_AND_MEAN 19 # include <windows.h> 20 #endif 21 #include "settings.h" 22 23 /* ---------------------------------------------------------------------- 24 * Standard useful macros. 25 */ 26 #ifndef TRUE 27 #define TRUE 1 28 #endif 29 #ifndef FALSE 30 #define FALSE 0 31 #endif 32 #define lenof(array) ( sizeof((array)) / sizeof(*(array)) ) 33 34 /* ---------------------------------------------------------------------- 35 * Data structures. 36 */ 37 38 /* 39 * Per-level flags for the gamestate and level structures. 40 */ 41 #define LEVEL_FLIMSY_BOMBS 0x0001 /* bombs blow when hit by other bombs */ 42 #define LEVEL_REL_PRIORITY 0x0002 /* expose priority is variable */ 43 44 /* 45 * First, a structure describing the state of a game between two 46 * moves. (At intermediate positions within one move, there is more 47 * state than this: moving objects and exposed cells are held in 48 * lists. However, all of that must be cleaned up and finished 49 * before the move ends, so between moves these lists are not 50 * visible.) 51 */ 52 typedef struct { 53 enum { PLAYING, COMPLETED, DIED, BROKEN } status; 54 char *leveldata; 55 char *title; 56 int width, height; 57 int flags; 58 int player_x, player_y; 59 int gold_got, gold_total; 60 int levnum, movenum; 61 char *sequence; 62 int sequence_size; 63 } gamestate; 64 65 /* 66 * A structure describing a level. 67 */ 68 typedef struct { 69 char *title; 70 char *leveldata; 71 int width, height; 72 int flags; 73 } level; 74 75 /* 76 * A structure describing a complete set of levels. 77 */ 78 typedef struct { 79 char *title; 80 char *name; 81 int nlevels; 82 level **levels; 83 } levelset; 84 85 /* 86 * A small structure describing a user's progress. 87 */ 88 typedef struct { 89 int levnum; 90 time_t date; 91 } progress; 92 93 /* ---------------------------------------------------------------------- 94 * Function prototypes. 95 */ 96 97 /* 98 * Memory allocation routines, in memory.c. Create and destroy a 99 * gamestate, a levelset, and a level. 100 * 101 * All of these can be assumed to succeed. They will bomb out with 102 * longjmp if they fail. 103 * 104 * level_new and levelset_new create no initial data buffer within 105 * the structures. These must be set later using level_setsize and 106 * levelset_nlevels. 107 */ 108 gamestate *gamestate_new(int width, int height, int flags); 109 gamestate *gamestate_copy(gamestate *); 110 void gamestate_free(gamestate *); 111 112 level *level_new(void); 113 void level_setsize(level *, int width, int height); 114 void level_free(level *); 115 116 levelset *levelset_new(void); 117 void levelset_nlevels(levelset *, int n); 118 void levelset_free(levelset *); 119 120 void *smalloc(size_t size); 121 void *srealloc(void *q, size_t size); 122 void sfree(void *q); 123 char *dupstr(char *str); 124 125 /* 126 * From engine.c, the make_move() function. Accepts as input a move 127 * ('h', 'j', 'k' or 'l') and a gamestate. Returns a modified 128 * gamestate to reflect the consequences of the move. Also 129 * init_game(), which sets up a gamestate from a level. 130 */ 131 gamestate *make_move (gamestate *, char); 132 gamestate *init_game (level *lev); 133 134 /* 135 * Also from engine.c, a level validator which checks a level 136 * structure to ensure it contains no obvious mistakes. Returns an 137 * error message in `buffer', or NULL. 138 */ 139 char *validate(level *level, char *buffer, int buflen); 140 141 /* 142 * From levelfile.c, the load_levels() function. Given the filename 143 * stem of a level set, will load the level set into memory and 144 * return a levelset structure. 145 */ 146 levelset *levelset_load(char *); 147 148 /* 149 * From savefile.c, routines to load and save a user's progress and 150 * saved positions, plus a routine to load a move sequence for 151 * replay. 152 */ 153 gamestate *savepos_load(levelset *set, char *user, int savenum); 154 void savepos_del(levelset *set, char *user, int savenum); 155 void savepos_save(levelset *set, char *user, int savenum, gamestate *state); 156 progress progress_load(levelset *set, char *user); 157 void progress_save(levelset *set, char *user, progress p); 158 char *sequence_load(char *fname); 159 void sequence_save(char *fname, gamestate *state); 160 161 /* 162 * From misc.c, miscellaneous things. 163 */ 164 void fatal(char *string); 165 int ishdr(char *line, char *header); 166 void get_user(char *buf, int buflen); 167 time_t parse_date(char *buf); 168 void fmt_date(char *buf, time_t); 169 170 /* 171 * From screen.c, screen handling routines. 172 */ 173 void screen_init(void); 174 void screen_finish(void); 175 void screen_level_init(void); 176 void screen_level_finish(void); 177 void screen_level_display(gamestate *s, char *message); 178 int screen_level_getmove(int playing); 179 int screen_movie_getmove(void); 180 void screen_error_box(char *); 181 char *screen_ask_movefile(int saving); 182 int screen_main_menu(levelset *set, gamestate **saves, 183 int maxlev, int startlev); 184 int screen_saveslot_ask(char action, gamestate **saves, int defslot); 185 void screen_completed_game(void); 186 187 /* ---------------------------------------------------------------------- 188 * Global data. 189 */ 190 191 /* 192 * A means of reporting memory allocation errors or other 193 * fatalities. Will return to the main program just before 194 * finalising curses, so that fatal errors don't leave the terminal 195 * in a silly state. Also provided is a char * variable to leave an 196 * error message in before longjmping. 197 */ 198 extern char *fatal_error_string; 199 extern jmp_buf fatal_error_jmp_buf; 200 201 #endif /* ENIGMA_ENIGMA_H */ 202