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