1 /* vi: set ts=2 shiftwidth=2 expandtab:
2  *
3  * Copyright (C) 2003-2008  Simon Baldwin and Mark J. Tilford
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of version 2 of the GNU General Public License
7  * as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
17  * USA
18  */
19 
20 #include <stdio.h>
21 
22 #ifndef SCARE_H
23 #define SCARE_H
24 
25 #if defined(__cplusplus)
26 extern "C"
27 {
28 #endif
29 
30 /*
31  * Base type definitions.  SCARE integer types need to be at least 32 bits,
32  * so using long here is a good bet for almost all ANSI C implementations for
33  * 32 and 64 bit platforms; maybe also for any 16 bit ones.  For 64 bit
34  * platforms configured for LP64, SCARE integer types will consume more space
35  * in data structures.  Values won't wrap identically to 32 bit ones, but
36  * games shouldn't be relying on wrapping anyway.  One final note -- in several
37  * places, SCARE allocates 32 bytes into which it will sprintf() a long; this
38  * is fine for both standard 32 bit and LP64 64 bit platforms, but is unsafe
39  * should SCARE ever be configured for 128 bit definitions of sc_[u]int.
40  */
41 typedef char sc_char;
42 typedef unsigned char sc_byte;
43 typedef long sc_int;
44 typedef unsigned long sc_uint;
45 typedef int sc_bool;
46 
47 /* Enumerated confirmation types, passed to os_confirm(). */
48 enum
49 { SC_CONF_QUIT = 0,
50   SC_CONF_RESTART, SC_CONF_SAVE, SC_CONF_RESTORE, SC_CONF_VIEW_HINTS
51 };
52 
53 /* HTML-like tag enumerated values, passed to os_print_tag(). */
54 enum
55 { SC_TAG_UNKNOWN = 0, SC_TAG_ITALICS, SC_TAG_ENDITALICS, SC_TAG_BOLD,
56   SC_TAG_ENDBOLD, SC_TAG_UNDERLINE, SC_TAG_ENDUNDERLINE, SC_TAG_COLOR,
57   SC_TAG_ENDCOLOR, SC_TAG_FONT, SC_TAG_ENDFONT, SC_TAG_BGCOLOR, SC_TAG_CENTER,
58   SC_TAG_ENDCENTER, SC_TAG_RIGHT, SC_TAG_ENDRIGHT, SC_TAG_WAIT, SC_TAG_WAITKEY,
59   SC_TAG_CLS,
60 
61   /* British spelling equivalents. */
62   SC_TAG_COLOUR = SC_TAG_COLOR,
63   SC_TAG_ENDCOLOUR = SC_TAG_ENDCOLOR,
64   SC_TAG_BGCOLOUR = SC_TAG_BGCOLOR,
65   SC_TAG_CENTRE = SC_TAG_CENTER,
66   SC_TAG_ENDCENTRE = SC_TAG_ENDCENTER
67 };
68 
69 /* OS interface function prototypes; interpreters must define these. */
70 typedef void *sc_game;
71 extern void os_print_string (const sc_char *string);
72 extern void os_print_tag (sc_int tag, const sc_char *argument);
73 extern void os_play_sound (const sc_char *filepath,
74                            sc_int offset, sc_int length, sc_bool is_looping);
75 extern void os_stop_sound (void);
76 extern void os_show_graphic (const sc_char *filepath,
77                              sc_int offset, sc_int length);
78 extern sc_bool os_read_line (sc_char *buffer, sc_int length);
79 extern sc_bool os_confirm (sc_int type);
80 extern void *os_open_file (sc_bool is_save);
81 extern void os_write_file (void *opaque, const sc_byte *buffer, sc_int length);
82 extern sc_int os_read_file (void *opaque, sc_byte *buffer, sc_int length);
83 extern void os_close_file (void *opaque);
84 extern void os_display_hints (sc_game game);
85 
86 extern void os_print_string_debug (const sc_char *string);
87 extern sc_bool os_read_line_debug (sc_char *buffer, sc_int length);
88 
89 /* Interpreter trace flag bits, passed to sc_set_trace_flags(). */
90 enum
91 { SC_TRACE_PARSE = 1, SC_TRACE_PROPERTIES = 2, SC_TRACE_VARIABLES = 4,
92   SC_TRACE_PARSER = 8, SC_TRACE_LIBRARY = 16, SC_TRACE_EVENTS = 32,
93   SC_TRACE_NPCS = 64, SC_TRACE_OBJECTS = 128, SC_TRACE_TASKS = 256,
94   SC_TRACE_PRINTFILTER = 512,
95 
96   SC_DUMP_TAF = 1024, SC_DUMP_PROPERTIES = 2048, SC_DUMP_VARIABLES = 4096,
97   SC_DUMP_PARSER_TREES = 8192, SC_DUMP_LOCALE_TABLES = 16384
98 };
99 
100 /* Module-wide trace control function prototype. */
101 extern void sc_set_trace_flags (sc_uint trace_flags);
102 
103 /* Interpreter interface function prototypes. */
104 extern sc_game sc_game_from_filename (const sc_char *filename);
105 extern sc_game sc_game_from_stream (FILE *stream);
106 extern sc_game sc_game_from_callback (sc_int (*callback)
107                                       (void *, sc_byte *, sc_int),
108                                       void *opaque);
109 extern void sc_interpret_game (sc_game game);
110 extern void sc_restart_game (sc_game game);
111 extern sc_bool sc_save_game (sc_game game);
112 extern sc_bool sc_load_game (sc_game game);
113 extern sc_bool sc_undo_game_turn (sc_game game);
114 extern void sc_quit_game (sc_game game);
115 extern sc_bool sc_save_game_to_filename (sc_game game, const sc_char *filename);
116 extern void sc_save_game_to_stream (sc_game game, FILE *stream);
117 extern void sc_save_game_to_callback (sc_game game,
118                                       void (*callback)
119                                       (void *, const sc_byte *, sc_int),
120                                       void *opaque);
121 extern sc_bool sc_load_game_from_filename (sc_game game,
122                                            const sc_char *filename);
123 extern sc_bool sc_load_game_from_stream (sc_game game, FILE *stream);
124 extern sc_bool sc_load_game_from_callback (sc_game game,
125                                            sc_int (*callback)
126                                            (void *, sc_byte *, sc_int),
127                                            void *opaque);
128 extern void sc_free_game (sc_game game);
129 extern sc_bool sc_is_game_running (sc_game game);
130 extern const sc_char *sc_get_game_name (sc_game game);
131 extern const sc_char *sc_get_game_author (sc_game game);
132 extern const sc_char *sc_get_game_compile_date (sc_game game);
133 extern sc_int sc_get_game_turns (sc_game game);
134 extern sc_int sc_get_game_score (sc_game game);
135 extern sc_int sc_get_game_max_score (sc_game game);
136 extern const sc_char *sc_get_game_room (sc_game game);
137 extern const sc_char *sc_get_game_status_line (sc_game game);
138 extern const sc_char *sc_get_game_preferred_font (sc_game game);
139 extern sc_bool sc_get_game_bold_room_names (sc_game game);
140 extern sc_bool sc_get_game_verbose (sc_game game);
141 extern sc_bool sc_get_game_notify_score_change (sc_game game);
142 extern sc_bool sc_has_game_completed (sc_game game);
143 extern sc_bool sc_is_game_undo_available (sc_game game);
144 extern void sc_set_game_bold_room_names (sc_game game, sc_bool flag);
145 extern void sc_set_game_verbose (sc_game game, sc_bool flag);
146 extern void sc_set_game_notify_score_change (sc_game game, sc_bool flag);
147 
148 extern sc_bool sc_does_game_use_sounds (sc_game);
149 extern sc_bool sc_does_game_use_graphics (sc_game);
150 
151 typedef void *sc_game_hint;
152 extern sc_game_hint sc_get_first_game_hint (sc_game game);
153 extern sc_game_hint sc_get_next_game_hint (sc_game game, sc_game_hint hint);
154 extern const sc_char *sc_get_game_hint_question (sc_game game,
155                                                  sc_game_hint hint);
156 extern const sc_char *sc_get_game_subtle_hint (sc_game game,
157                                                sc_game_hint hint);
158 extern const sc_char *sc_get_game_unsubtle_hint (sc_game game,
159                                                  sc_game_hint hint);
160 
161 extern void sc_set_game_debugger_enabled (sc_game game, sc_bool flag);
162 extern sc_bool sc_get_game_debugger_enabled (sc_game game);
163 extern sc_bool sc_run_game_debugger_command (sc_game game,
164                                              const sc_char *debug_command);
165 extern void sc_set_portable_random (sc_bool flag);
166 extern void sc_reseed_random_sequence (sc_uint new_seed);
167 
168 /* Locale control and query functions. */
169 extern sc_bool sc_set_locale (const sc_char *name);
170 extern const sc_char *sc_get_locale (void);
171 
172 /* A few possibly useful utilities. */
173 extern sc_int sc_strncasecmp (const sc_char *s1, const sc_char *s2, sc_int n);
174 extern sc_int sc_strcasecmp (const sc_char *s1, const sc_char *s2);
175 extern const sc_char *sc_scare_version (void);
176 extern sc_int sc_scare_emulation (void);
177 
178 #if defined(__cplusplus)
179 }
180 #endif
181 
182 #endif
183