1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "glk/adrift/scare.h"
24 #include "glk/jumps.h"
25 
26 namespace Glk {
27 namespace Adrift {
28 
29 #ifndef ADRIFT_PROTOTYPES_H
30 #define ADRIFT_PROTOTYPES_H
31 
32 /* Runtime version and emulated version, for %version% variable and so on. */
33 #ifndef SCARE_VERSION
34 # define SCARE_VERSION "1.3.10"
35 #endif
36 #ifndef SCARE_PATCH_LEVEL
37 # define SCARE_PATCH_LEVEL ""
38 #endif
39 #ifndef SCARE_EMULATION
40 # define SCARE_EMULATION 4046
41 #endif
42 
43 /* True and false, unless already defined. */
44 #ifndef FALSE
45 # define FALSE 0
46 #endif
47 #ifndef TRUE
48 # define TRUE (!FALSE)
49 #endif
50 
51 /* Vartype typedef, supports relaxed typing. */
52 typedef union {
53 	sc_int integer;
54 	sc_bool boolean;
55 	const sc_char *string;
56 	sc_char *mutable_string;
57 	void *voidp;
58 } sc_vartype_t;
59 
60 /* Standard reader and writer callback function typedefs. */
61 typedef sc_int(*sc_read_callbackref_t)(void *, sc_byte *, sc_int);
62 typedef void (*sc_write_callbackref_t)(void *, const sc_byte *, sc_int);
63 
64 /*
65  * Small utility and wrapper functions.  For printf wrappers, try to apply
66  * gcc printf argument checking; this code is cautious about applying the
67  * checks.
68  */
69 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
70 extern void sc_trace(const sc_char *format, ...)
71 __attribute__((__format__(__printf__, 1, 2)));
72 extern void sc_error(const sc_char *format, ...)
73 __attribute__((__format__(__printf__, 1, 2)));
74 extern void sc_fatal(const sc_char *format, ...)
75 __attribute__((__format__(__printf__, 1, 2)));
76 #else
77 extern void sc_trace(const sc_char *format, ...);
78 extern void sc_error(const sc_char *format, ...);
79 extern void sc_fatal(const sc_char *format, ...);
80 #endif
81 extern void *sc_malloc(size_t size);
82 extern void *sc_realloc(void *pointer, size_t size);
83 extern void sc_free(void *pointer);
84 extern void sc_set_congruential_random(void);
85 extern void sc_set_platform_random(void);
86 extern sc_bool sc_is_congruential_random(void);
87 extern void sc_seed_random(sc_uint new_seed);
88 extern sc_int sc_rand(void);
89 extern sc_int sc_randomint(sc_int low, sc_int high);
90 extern sc_bool sc_strempty(const sc_char *string);
91 extern sc_char *sc_trim_string(sc_char *string);
92 extern sc_char *sc_normalize_string(sc_char *string);
93 extern sc_bool sc_compare_word(const sc_char *string,
94 							   const sc_char *Word, sc_int length);
95 extern sc_uint sc_hash(const sc_char *string);
96 
97 /* TAF file reader/decompressor enumerations, opaque typedef and functions. */
98 enum {
99 	TAF_VERSION_NONE = 0,
100 	TAF_VERSION_SAVE = 999,
101 	TAF_VERSION_500 = 500,
102 	TAF_VERSION_400 = 400,
103 	TAF_VERSION_390 = 390,
104 	TAF_VERSION_380 = 380
105 };
106 
107 typedef struct sc_taf_s *sc_tafref_t;
108 extern void taf_destroy(sc_tafref_t taf);
109 extern sc_tafref_t taf_create(sc_read_callbackref_t callback, void *opaque);
110 extern sc_tafref_t taf_create_tas(sc_read_callbackref_t callback,
111 								  void *opaque);
112 extern void taf_first_line(sc_tafref_t taf);
113 extern const sc_char *taf_next_line(sc_tafref_t taf);
114 extern sc_bool taf_more_lines(sc_tafref_t taf);
115 extern sc_int taf_get_game_data_length(sc_tafref_t taf);
116 extern sc_int taf_get_version(sc_tafref_t taf);
117 extern sc_bool taf_debug_is_taf_string(sc_tafref_t taf, const void *addr);
118 extern void taf_debug_dump(sc_tafref_t taf);
119 
120 /* Properties store enumerations, opaque typedef, and functions. */
121 enum {
122 	PROP_KEY_STRING = 's',
123 	PROP_KEY_INTEGER = 'i'
124 };
125 enum {
126 	PROP_INTEGER = 'I',
127 	PROP_BOOLEAN = 'B',
128 	PROP_STRING = 'S'
129 };
130 
131 typedef struct sc_prop_set_s *sc_prop_setref_t;
132 extern sc_prop_setref_t prop_create(const sc_tafref_t taf);
133 extern void prop_destroy(sc_prop_setref_t bundle);
134 extern void prop_put(sc_prop_setref_t bundle,
135 					 const sc_char *format, sc_vartype_t vt_value,
136 					 const sc_vartype_t vt_key[]);
137 extern sc_bool prop_get(sc_prop_setref_t bundle,
138 						const sc_char *format, sc_vartype_t *vt_value,
139 						const sc_vartype_t vt_key[]);
140 extern void prop_solidify(sc_prop_setref_t bundle);
141 extern sc_int prop_get_integer(sc_prop_setref_t bundle,
142 							   const sc_char *format,
143 							   const sc_vartype_t vt_key[]);
144 extern sc_bool prop_get_boolean(sc_prop_setref_t bundle,
145 								const sc_char *format,
146 								const sc_vartype_t vt_key[]);
147 extern const sc_char *prop_get_string(sc_prop_setref_t bundle,
148 									  const sc_char *format,
149 									  const sc_vartype_t vt_key[]);
150 extern sc_int prop_get_child_count(sc_prop_setref_t bundle,
151 								   const sc_char *format,
152 								   const sc_vartype_t vt_key[]);
153 extern void prop_adopt(sc_prop_setref_t bundle, void *addr);
154 extern void prop_debug_trace(sc_bool flag);
155 extern void prop_debug_dump(sc_prop_setref_t bundle);
156 
157 /* Game parser enumeration and functions. */
158 enum {
159 	ROOMLIST_NO_ROOMS = 0,
160 	ROOMLIST_ONE_ROOM = 1,
161 	ROOMLIST_SOME_ROOMS = 2,
162 	ROOMLIST_ALL_ROOMS = 3,
163 	ROOMLIST_NPC_PART = 4
164 };
165 
166 extern sc_bool parse_game(sc_tafref_t taf, sc_prop_setref_t bundle);
167 extern void parse_debug_trace(sc_bool flag);
168 
169 /* Game state structure for modules that use it. */
170 typedef struct sc_game_s *sc_gameref_t;
171 
172 /* Hint type definition, a thinly disguised pointer to task entry. */
173 typedef struct sc_taskstate_s *sc_hintref_t;
174 
175 /* Variables set enumerations, opaque typedef, and functions. */
176 enum {
177 	TAFVAR_NUMERIC = 0,
178 	TAFVAR_STRING = 1
179 };
180 enum {
181 	VAR_INTEGER = 'I',
182 	VAR_STRING = 'S'
183 };
184 
185 typedef struct sc_var_set_s *sc_var_setref_t;
186 extern void var_put(sc_var_setref_t vars,
187 					const sc_char *name, sc_int _type, sc_vartype_t vt_value);
188 extern sc_bool var_get(sc_var_setref_t vars,
189 					   const sc_char *name, sc_int *_type,
190 					   sc_vartype_t *vt_rvalue);
191 extern void var_put_integer(sc_var_setref_t vars,
192 							const sc_char *name, sc_int value);
193 extern sc_int var_get_integer(sc_var_setref_t vars, const sc_char *name);
194 extern void var_put_string(sc_var_setref_t vars,
195 						   const sc_char *name, const sc_char *string);
196 extern const sc_char *var_get_string(sc_var_setref_t vars,
197 									 const sc_char *name);
198 extern sc_var_setref_t var_create(sc_prop_setref_t bundle);
199 extern void var_destroy(sc_var_setref_t vars);
200 extern void var_register_game(sc_var_setref_t vars, sc_gameref_t game);
201 extern void var_set_ref_character(sc_var_setref_t vars, sc_int character);
202 extern void var_set_ref_object(sc_var_setref_t vars, sc_int object);
203 extern void var_set_ref_number(sc_var_setref_t vars, sc_int number);
204 extern void var_set_ref_text(sc_var_setref_t vars, const sc_char *text);
205 extern sc_int var_get_ref_character(sc_var_setref_t vars);
206 extern sc_int var_get_ref_object(sc_var_setref_t vars);
207 extern sc_int var_get_ref_number(sc_var_setref_t vars);
208 extern const sc_char *var_get_ref_text(sc_var_setref_t vars);
209 extern sc_uint var_get_elapsed_seconds(sc_var_setref_t vars);
210 extern void var_set_elapsed_seconds(sc_var_setref_t vars, sc_uint seconds);
211 extern void var_debug_trace(sc_bool flag);
212 extern void var_debug_dump(sc_var_setref_t vars);
213 
214 /* Expression evaluation functions. */
215 extern sc_bool expr_eval_numeric_expression(const sc_char *expression,
216 		sc_var_setref_t vars,
217 		sc_int *rvalue);
218 extern sc_bool expr_eval_string_expression(const sc_char *expression,
219 		sc_var_setref_t vars,
220 		sc_char **rvalue);
221 
222 /* Print filtering opaque typedef and functions. */
223 typedef struct sc_filter_s *sc_filterref_t;
224 extern sc_filterref_t pf_create(void);
225 extern void pf_destroy(sc_filterref_t filter);
226 extern void pf_buffer_string(sc_filterref_t filter,
227 							 const sc_char *string);
228 extern void pf_buffer_character(sc_filterref_t filter,
229 								sc_char character);
230 extern void pf_prepend_string(sc_filterref_t filter,
231 							  const sc_char *string);
232 extern void pf_new_sentence(sc_filterref_t filter);
233 extern void pf_mute(sc_filterref_t filter);
234 extern void pf_clear_mute(sc_filterref_t filter);
235 extern void pf_buffer_tag(sc_filterref_t filter, sc_int tag);
236 extern void pf_strip_tags(sc_char *string);
237 extern void pf_strip_tags_for_hints(sc_char *string);
238 extern sc_char *pf_filter(const sc_char *string,
239 						  sc_var_setref_t vars, sc_prop_setref_t bundle);
240 extern sc_char *pf_filter_for_info(const sc_char *string,
241 								   sc_var_setref_t vars);
242 extern void pf_flush(sc_filterref_t filter,
243 					 sc_var_setref_t vars, sc_prop_setref_t bundle);
244 extern void pf_checkpoint(sc_filterref_t filter,
245 						  sc_var_setref_t vars, sc_prop_setref_t bundle);
246 extern const sc_char *pf_get_buffer(sc_filterref_t filter);
247 extern sc_char *pf_transfer_buffer(sc_filterref_t filter);
248 extern void pf_empty(sc_filterref_t filter);
249 extern sc_char *pf_escape(const sc_char *string);
250 extern sc_char *pf_filter_input(const sc_char *string,
251 								sc_prop_setref_t bundle);
252 extern void pf_debug_trace(sc_bool flag);
253 
254 /* Game memo opaque typedef and functions. */
255 typedef struct sc_memo_set_s *sc_memo_setref_t;
256 extern sc_memo_setref_t memo_create(void);
257 extern void memo_destroy(sc_memo_setref_t memento);
258 extern void memo_save_game(sc_memo_setref_t memento, sc_gameref_t game);
259 extern sc_bool memo_load_game(sc_memo_setref_t memento, sc_gameref_t game);
260 extern sc_bool memo_is_load_available(sc_memo_setref_t memento);
261 extern void memo_clear_games(sc_memo_setref_t memento);
262 extern void memo_save_command(sc_memo_setref_t memento,
263 							  const sc_char *command, sc_int timestamp,
264 							  sc_int turns);
265 extern void memo_unsave_command(sc_memo_setref_t memento);
266 extern sc_int memo_get_command_count(sc_memo_setref_t memento);
267 extern void memo_first_command(sc_memo_setref_t memento);
268 extern void memo_next_command(sc_memo_setref_t memento,
269 							  const sc_char **command, sc_int *sequence,
270 							  sc_int *timestamp, sc_int *turns);
271 extern sc_bool memo_more_commands(sc_memo_setref_t memento);
272 extern const sc_char *memo_find_command(sc_memo_setref_t memento,
273 										sc_int sequence);
274 extern void memo_clear_commands(sc_memo_setref_t memento);
275 
276 /* Game state functions. */
277 extern sc_gameref_t gs_create(sc_var_setref_t vars, sc_prop_setref_t bundle,
278 							  sc_filterref_t filter);
279 extern sc_bool gs_is_game_valid(sc_gameref_t game);
280 extern void gs_copy(sc_gameref_t to, sc_gameref_t from);
281 extern void gs_destroy(sc_gameref_t game);
282 
283 /* Game state accessors and mutators. */
284 extern void gs_move_player_to_room(sc_gameref_t game, sc_int Room);
285 extern sc_bool gs_player_in_room(sc_gameref_t game, sc_int room);
286 extern sc_var_setref_t gs_get_vars(sc_gameref_t gs);
287 extern sc_prop_setref_t gs_get_bundle(sc_gameref_t gs);
288 extern sc_filterref_t gs_get_filter(sc_gameref_t gs);
289 extern sc_memo_setref_t gs_get_memento(sc_gameref_t gs);
290 extern void gs_set_playerroom(sc_gameref_t gs, sc_int room);
291 extern void gs_set_playerposition(sc_gameref_t gs, sc_int position);
292 extern void gs_set_playerparent(sc_gameref_t gs, sc_int parent);
293 extern sc_int gs_playerroom(sc_gameref_t gs);
294 extern sc_int gs_playerposition(sc_gameref_t gs);
295 extern sc_int gs_playerparent(sc_gameref_t gs);
296 extern sc_int gs_event_count(sc_gameref_t gs);
297 extern void gs_set_event_state(sc_gameref_t gs, sc_int event, sc_int state);
298 extern void gs_set_event_time(sc_gameref_t gs, sc_int event, sc_int etime);
299 extern sc_int gs_event_state(sc_gameref_t gs, sc_int event);
300 extern sc_int gs_event_time(sc_gameref_t gs, sc_int event);
301 extern void gs_decrement_event_time(sc_gameref_t gs, sc_int event);
302 extern sc_int gs_room_count(sc_gameref_t gs);
303 extern void gs_set_room_seen(sc_gameref_t gs, sc_int Room, sc_bool seen);
304 extern sc_bool gs_room_seen(sc_gameref_t gs, sc_int Room);
305 extern sc_int gs_task_count(sc_gameref_t gs);
306 extern void gs_set_task_done(sc_gameref_t gs, sc_int task, sc_bool done);
307 extern void gs_set_task_scored(sc_gameref_t gs, sc_int task, sc_bool scored);
308 extern sc_bool gs_task_done(sc_gameref_t gs, sc_int task);
309 extern sc_bool gs_task_scored(sc_gameref_t gs, sc_int task);
310 extern sc_int gs_object_count(sc_gameref_t gs);
311 extern void gs_set_object_openness(sc_gameref_t gs,
312 								   sc_int object, sc_int openness);
313 extern void gs_set_object_state(sc_gameref_t gs, sc_int object, sc_int state);
314 extern void gs_set_object_seen(sc_gameref_t gs, sc_int object, sc_bool seen);
315 extern void gs_set_object_unmoved(sc_gameref_t gs,
316 								  sc_int object, sc_bool unmoved);
317 extern void gs_set_object_static_unmoved(sc_gameref_t gs,
318 		sc_int _object, sc_bool unmoved);
319 extern sc_int gs_object_openness(sc_gameref_t gs, sc_int object);
320 extern sc_int gs_object_state(sc_gameref_t gs, sc_int _object);
321 extern sc_bool gs_object_seen(sc_gameref_t gs, sc_int _object);
322 extern sc_bool gs_object_unmoved(sc_gameref_t gs, sc_int _object);
323 extern sc_bool gs_object_static_unmoved(sc_gameref_t gs, sc_int _object);
324 extern sc_int gs_object_position(sc_gameref_t gs, sc_int _object);
325 extern sc_int gs_object_parent(sc_gameref_t gs, sc_int _object);
326 extern void gs_object_move_onto(sc_gameref_t gs, sc_int _object, sc_int onto);
327 extern void gs_object_move_into(sc_gameref_t gs, sc_int _object, sc_int into);
328 extern void gs_object_make_hidden(sc_gameref_t gs, sc_int _object);
329 extern void gs_object_player_get(sc_gameref_t gs, sc_int _object);
330 extern void gs_object_npc_get(sc_gameref_t gs, sc_int object, sc_int npc);
331 extern void gs_object_player_wear(sc_gameref_t gs, sc_int object);
332 extern void gs_object_npc_wear(sc_gameref_t gs, sc_int object, sc_int npc);
333 extern void gs_object_to_room(sc_gameref_t gs, sc_int _object, sc_int room);
334 extern sc_int gs_npc_count(sc_gameref_t gs);
335 extern void gs_set_npc_location(sc_gameref_t gs, sc_int npc, sc_int _location);
336 extern sc_int gs_npc_location(sc_gameref_t gs, sc_int npc);
337 extern void gs_set_npc_position(sc_gameref_t gs, sc_int npc, sc_int position);
338 extern sc_int gs_npc_position(sc_gameref_t gs, sc_int npc);
339 extern void gs_set_npc_parent(sc_gameref_t gs, sc_int npc, sc_int parent);
340 extern sc_int gs_npc_parent(sc_gameref_t gs, sc_int npc);
341 extern void gs_set_npc_seen(sc_gameref_t gs, sc_int npc, sc_bool seen);
342 extern sc_bool gs_npc_seen(sc_gameref_t gs, sc_int npc);
343 extern sc_int gs_npc_walkstep_count(sc_gameref_t gs, sc_int npc);
344 extern void gs_set_npc_walkstep(sc_gameref_t gs, sc_int npc,
345 								sc_int walk, sc_int walkstep);
346 extern sc_int gs_npc_walkstep(sc_gameref_t gs, sc_int npc, sc_int walk);
347 extern void gs_decrement_npc_walkstep(sc_gameref_t gs,
348 									  sc_int npc, sc_int walkstep);
349 extern void gs_clear_npc_references(sc_gameref_t gs);
350 extern void gs_clear_object_references(sc_gameref_t gs);
351 extern void gs_set_multiple_references(sc_gameref_t gs);
352 extern void gs_clear_multiple_references(sc_gameref_t gs);
353 
354 /* Pattern matching functions. */
355 extern sc_bool uip_match(const sc_char *pattern,
356 						 const sc_char *string, sc_gameref_t game);
357 extern sc_char *uip_replace_pronouns(sc_gameref_t game, const sc_char *string);
358 extern void uip_assign_pronouns(sc_gameref_t game, const sc_char *string);
359 extern void uip_debug_trace(sc_bool flag);
360 
361 /* Library perspective enumeration and functions. */
362 enum {
363 	LIB_FIRST_PERSON = 0,
364 	LIB_SECOND_PERSON = 1,
365 	LIB_THIRD_PERSON = 2
366 };
367 
368 extern void lib_warn_battle_system(void);
369 extern sc_int lib_random_roomgroup_member(sc_gameref_t game, sc_int roomgroup);
370 extern const sc_char *lib_get_room_name(sc_gameref_t game, sc_int Room);
371 extern void lib_print_room_name(sc_gameref_t game, sc_int Room);
372 extern void lib_print_room_description(sc_gameref_t game, sc_int Room);
373 extern sc_bool lib_cmd_go_north(sc_gameref_t game);
374 extern sc_bool lib_cmd_go_east(sc_gameref_t game);
375 extern sc_bool lib_cmd_go_south(sc_gameref_t game);
376 extern sc_bool lib_cmd_go_west(sc_gameref_t game);
377 extern sc_bool lib_cmd_go_up(sc_gameref_t game);
378 extern sc_bool lib_cmd_go_down(sc_gameref_t game);
379 extern sc_bool lib_cmd_go_in(sc_gameref_t game);
380 extern sc_bool lib_cmd_go_out(sc_gameref_t game);
381 extern sc_bool lib_cmd_go_northeast(sc_gameref_t game);
382 extern sc_bool lib_cmd_go_southeast(sc_gameref_t game);
383 extern sc_bool lib_cmd_go_northwest(sc_gameref_t game);
384 extern sc_bool lib_cmd_go_southwest(sc_gameref_t game);
385 extern sc_bool lib_cmd_go_room(sc_gameref_t game);
386 extern sc_bool lib_cmd_verbose(sc_gameref_t game);
387 extern sc_bool lib_cmd_brief(sc_gameref_t game);
388 extern sc_bool lib_cmd_notify_on_off(sc_gameref_t game);
389 extern sc_bool lib_cmd_notify(sc_gameref_t game);
390 extern sc_bool lib_cmd_time(sc_gameref_t game);
391 extern sc_bool lib_cmd_date(sc_gameref_t game);
392 extern sc_bool lib_cmd_quit(sc_gameref_t game);
393 extern sc_bool lib_cmd_restart(sc_gameref_t game);
394 extern sc_bool lib_cmd_undo(sc_gameref_t game);
395 extern sc_bool lib_cmd_history(sc_gameref_t game);
396 extern sc_bool lib_cmd_history_number(sc_gameref_t game);
397 extern sc_bool lib_cmd_again(sc_gameref_t game);
398 extern sc_bool lib_cmd_redo_number(sc_gameref_t game);
399 extern sc_bool lib_cmd_redo_text(sc_gameref_t game);
400 extern sc_bool lib_cmd_redo_last(sc_gameref_t game);
401 extern sc_bool lib_cmd_hints(sc_gameref_t game);
402 extern sc_bool lib_cmd_help(sc_gameref_t game);
403 extern sc_bool lib_cmd_license(sc_gameref_t game);
404 extern sc_bool lib_cmd_information(sc_gameref_t game);
405 extern sc_bool lib_cmd_clear(sc_gameref_t game);
406 extern sc_bool lib_cmd_statusline(sc_gameref_t game);
407 extern sc_bool lib_cmd_version(sc_gameref_t game);
408 extern sc_bool lib_cmd_look(sc_gameref_t game);
409 extern sc_bool lib_cmd_print_room_exits(sc_gameref_t game);
410 extern sc_bool lib_cmd_wait(sc_gameref_t game);
411 extern sc_bool lib_cmd_wait_number(sc_gameref_t game);
412 extern sc_bool lib_cmd_examine_self(sc_gameref_t game);
413 extern sc_bool lib_cmd_examine_npc(sc_gameref_t game);
414 extern sc_bool lib_cmd_examine_object(sc_gameref_t game);
415 extern sc_bool lib_cmd_count(sc_gameref_t game);
416 extern sc_bool lib_cmd_take_all(sc_gameref_t game);
417 extern sc_bool lib_cmd_take_except_multiple(sc_gameref_t game);
418 extern sc_bool lib_cmd_take_multiple(sc_gameref_t game);
419 extern sc_bool lib_cmd_take_all_from(sc_gameref_t game);
420 extern sc_bool lib_cmd_take_from_except_multiple(sc_gameref_t game);
421 extern sc_bool lib_cmd_take_from_multiple(sc_gameref_t game);
422 extern sc_bool lib_cmd_take_all_from_npc(sc_gameref_t game);
423 extern sc_bool lib_cmd_take_from_npc_except_multiple(sc_gameref_t game);
424 extern sc_bool lib_cmd_take_from_npc_multiple(sc_gameref_t game);
425 extern sc_bool lib_cmd_take_npc(sc_gameref_t game);
426 extern sc_bool lib_cmd_drop_all(sc_gameref_t game);
427 extern sc_bool lib_cmd_drop_except_multiple(sc_gameref_t game);
428 extern sc_bool lib_cmd_drop_multiple(sc_gameref_t game);
429 extern sc_bool lib_cmd_wear_all(sc_gameref_t game);
430 extern sc_bool lib_cmd_wear_except_multiple(sc_gameref_t game);
431 extern sc_bool lib_cmd_wear_multiple(sc_gameref_t game);
432 extern sc_bool lib_cmd_remove_all(sc_gameref_t game);
433 extern sc_bool lib_cmd_remove_except_multiple(sc_gameref_t game);
434 extern sc_bool lib_cmd_remove_multiple(sc_gameref_t game);
435 extern sc_bool lib_cmd_kiss_npc(sc_gameref_t game);
436 extern sc_bool lib_cmd_kiss_object(sc_gameref_t game);
437 extern sc_bool lib_cmd_kiss_other(sc_gameref_t game);
438 extern sc_bool lib_cmd_kill_other(sc_gameref_t game);
439 extern sc_bool lib_cmd_eat_object(sc_gameref_t game);
440 extern sc_bool lib_cmd_give_object_npc(sc_gameref_t game);
441 extern sc_bool lib_cmd_inventory(sc_gameref_t game);
442 extern sc_bool lib_cmd_open_object(sc_gameref_t game);
443 extern sc_bool lib_cmd_close_object(sc_gameref_t game);
444 extern sc_bool lib_cmd_unlock_object_with(sc_gameref_t game);
445 extern sc_bool lib_cmd_lock_object_with(sc_gameref_t game);
446 extern sc_bool lib_cmd_unlock_object(sc_gameref_t game);
447 extern sc_bool lib_cmd_lock_object(sc_gameref_t game);
448 extern sc_bool lib_cmd_ask_npc_about(sc_gameref_t game);
449 extern sc_bool lib_cmd_put_all_in(sc_gameref_t game);
450 extern sc_bool lib_cmd_put_in_except_multiple(sc_gameref_t game);
451 extern sc_bool lib_cmd_put_in_multiple(sc_gameref_t game);
452 extern sc_bool lib_cmd_put_all_on(sc_gameref_t game);
453 extern sc_bool lib_cmd_put_on_except_multiple(sc_gameref_t game);
454 extern sc_bool lib_cmd_put_on_multiple(sc_gameref_t game);
455 extern sc_bool lib_cmd_read_object(sc_gameref_t game);
456 extern sc_bool lib_cmd_read_other(sc_gameref_t game);
457 extern sc_bool lib_cmd_stand_on_object(sc_gameref_t game);
458 extern sc_bool lib_cmd_stand_on_floor(sc_gameref_t game);
459 extern sc_bool lib_cmd_attack_npc_with(sc_gameref_t game);
460 extern sc_bool lib_cmd_sit_on_object(sc_gameref_t game);
461 extern sc_bool lib_cmd_sit_on_floor(sc_gameref_t game);
462 extern sc_bool lib_cmd_lie_on_object(sc_gameref_t game);
463 extern sc_bool lib_cmd_lie_on_floor(sc_gameref_t game);
464 extern sc_bool lib_cmd_get_off_object(sc_gameref_t game);
465 extern sc_bool lib_cmd_get_off(sc_gameref_t game);
466 extern sc_bool lib_cmd_save(sc_gameref_t game);
467 extern sc_bool lib_cmd_restore(sc_gameref_t game);
468 extern sc_bool lib_cmd_locate_object(sc_gameref_t game);
469 extern sc_bool lib_cmd_locate_npc(sc_gameref_t game);
470 extern sc_bool lib_cmd_turns(sc_gameref_t game);
471 extern sc_bool lib_cmd_score(sc_gameref_t game);
472 extern sc_bool lib_cmd_get_what(sc_gameref_t game);
473 extern sc_bool lib_cmd_open_what(sc_gameref_t game);
474 extern sc_bool lib_cmd_close_other(sc_gameref_t game);
475 extern sc_bool lib_cmd_lock_other(sc_gameref_t game);
476 extern sc_bool lib_cmd_lock_what(sc_gameref_t game);
477 extern sc_bool lib_cmd_unlock_other(sc_gameref_t game);
478 extern sc_bool lib_cmd_unlock_what(sc_gameref_t game);
479 extern sc_bool lib_cmd_stand_other(sc_gameref_t game);
480 extern sc_bool lib_cmd_sit_other(sc_gameref_t game);
481 extern sc_bool lib_cmd_lie_other(sc_gameref_t game);
482 extern sc_bool lib_cmd_give_object(sc_gameref_t game);
483 extern sc_bool lib_cmd_give_what(sc_gameref_t game);
484 extern sc_bool lib_cmd_remove_what(sc_gameref_t game);
485 extern sc_bool lib_cmd_drop_what(sc_gameref_t game);
486 extern sc_bool lib_cmd_wear_what(sc_gameref_t game);
487 extern sc_bool lib_cmd_profanity(sc_gameref_t game);
488 extern sc_bool lib_cmd_examine_all(sc_gameref_t game);
489 extern sc_bool lib_cmd_examine_other(sc_gameref_t game);
490 extern sc_bool lib_cmd_locate_other(sc_gameref_t game);
491 extern sc_bool lib_cmd_unix_like(sc_gameref_t game);
492 extern sc_bool lib_cmd_dos_like(sc_gameref_t game);
493 extern sc_bool lib_cmd_ask_object(sc_gameref_t game);
494 extern sc_bool lib_cmd_ask_npc(sc_gameref_t game);
495 extern sc_bool lib_cmd_ask_other(sc_gameref_t game);
496 extern sc_bool lib_cmd_block_object(sc_gameref_t game);
497 extern sc_bool lib_cmd_block_other(sc_gameref_t game);
498 extern sc_bool lib_cmd_block_what(sc_gameref_t game);
499 extern sc_bool lib_cmd_break_object(sc_gameref_t game);
500 extern sc_bool lib_cmd_break_other(sc_gameref_t game);
501 extern sc_bool lib_cmd_break_what(sc_gameref_t game);
502 extern sc_bool lib_cmd_destroy_what(sc_gameref_t game);
503 extern sc_bool lib_cmd_smash_what(sc_gameref_t game);
504 extern sc_bool lib_cmd_buy_object(sc_gameref_t game);
505 extern sc_bool lib_cmd_buy_other(sc_gameref_t game);
506 extern sc_bool lib_cmd_buy_what(sc_gameref_t game);
507 extern sc_bool lib_cmd_clean_object(sc_gameref_t game);
508 extern sc_bool lib_cmd_clean_other(sc_gameref_t game);
509 extern sc_bool lib_cmd_clean_what(sc_gameref_t game);
510 extern sc_bool lib_cmd_climb_object(sc_gameref_t game);
511 extern sc_bool lib_cmd_climb_other(sc_gameref_t game);
512 extern sc_bool lib_cmd_climb_what(sc_gameref_t game);
513 extern sc_bool lib_cmd_cry(sc_gameref_t game);
514 extern sc_bool lib_cmd_cut_object(sc_gameref_t game);
515 extern sc_bool lib_cmd_cut_other(sc_gameref_t game);
516 extern sc_bool lib_cmd_cut_what(sc_gameref_t game);
517 extern sc_bool lib_cmd_drink_object(sc_gameref_t game);
518 extern sc_bool lib_cmd_drink_other(sc_gameref_t game);
519 extern sc_bool lib_cmd_drink_what(sc_gameref_t game);
520 extern sc_bool lib_cmd_dance(sc_gameref_t game);
521 extern sc_bool lib_cmd_eat_other(sc_gameref_t game);
522 extern sc_bool lib_cmd_feed(sc_gameref_t game);
523 extern sc_bool lib_cmd_fight(sc_gameref_t game);
524 extern sc_bool lib_cmd_feel(sc_gameref_t game);
525 extern sc_bool lib_cmd_fix_object(sc_gameref_t game);
526 extern sc_bool lib_cmd_fix_other(sc_gameref_t game);
527 extern sc_bool lib_cmd_fix_what(sc_gameref_t game);
528 extern sc_bool lib_cmd_fly(sc_gameref_t game);
529 extern sc_bool lib_cmd_hint(sc_gameref_t game);
530 extern sc_bool lib_cmd_attack_npc(sc_gameref_t game);
531 extern sc_bool lib_cmd_hit_object(sc_gameref_t game);
532 extern sc_bool lib_cmd_hit_other(sc_gameref_t game);
533 extern sc_bool lib_cmd_hit_what(sc_gameref_t game);
534 extern sc_bool lib_cmd_hum(sc_gameref_t game);
535 extern sc_bool lib_cmd_jump(sc_gameref_t game);
536 extern sc_bool lib_cmd_kick_object(sc_gameref_t game);
537 extern sc_bool lib_cmd_kick_other(sc_gameref_t game);
538 extern sc_bool lib_cmd_kick_what(sc_gameref_t game);
539 extern sc_bool lib_cmd_light_object(sc_gameref_t game);
540 extern sc_bool lib_cmd_light_other(sc_gameref_t game);
541 extern sc_bool lib_cmd_light_what(sc_gameref_t game);
542 extern sc_bool lib_cmd_lift_object(sc_gameref_t game);
543 extern sc_bool lib_cmd_lift_other(sc_gameref_t game);
544 extern sc_bool lib_cmd_lift_what(sc_gameref_t game);
545 extern sc_bool lib_cmd_listen(sc_gameref_t game);
546 extern sc_bool lib_cmd_mend_object(sc_gameref_t game);
547 extern sc_bool lib_cmd_mend_other(sc_gameref_t game);
548 extern sc_bool lib_cmd_mend_what(sc_gameref_t game);
549 extern sc_bool lib_cmd_move_object(sc_gameref_t game);
550 extern sc_bool lib_cmd_move_other(sc_gameref_t game);
551 extern sc_bool lib_cmd_move_what(sc_gameref_t game);
552 extern sc_bool lib_cmd_please(sc_gameref_t game);
553 extern sc_bool lib_cmd_press_object(sc_gameref_t game);
554 extern sc_bool lib_cmd_press_other(sc_gameref_t game);
555 extern sc_bool lib_cmd_press_what(sc_gameref_t game);
556 extern sc_bool lib_cmd_pull_object(sc_gameref_t game);
557 extern sc_bool lib_cmd_pull_other(sc_gameref_t game);
558 extern sc_bool lib_cmd_pull_what(sc_gameref_t game);
559 extern sc_bool lib_cmd_punch(sc_gameref_t game);
560 extern sc_bool lib_cmd_push_object(sc_gameref_t game);
561 extern sc_bool lib_cmd_push_other(sc_gameref_t game);
562 extern sc_bool lib_cmd_push_what(sc_gameref_t game);
563 extern sc_bool lib_cmd_repair_object(sc_gameref_t game);
564 extern sc_bool lib_cmd_repair_other(sc_gameref_t game);
565 extern sc_bool lib_cmd_repair_what(sc_gameref_t game);
566 extern sc_bool lib_cmd_rub_object(sc_gameref_t game);
567 extern sc_bool lib_cmd_rub_other(sc_gameref_t game);
568 extern sc_bool lib_cmd_rub_what(sc_gameref_t game);
569 extern sc_bool lib_cmd_run(sc_gameref_t game);
570 extern sc_bool lib_cmd_say(sc_gameref_t game);
571 extern sc_bool lib_cmd_sell_object(sc_gameref_t game);
572 extern sc_bool lib_cmd_sell_other(sc_gameref_t game);
573 extern sc_bool lib_cmd_sell_what(sc_gameref_t game);
574 extern sc_bool lib_cmd_shake_object(sc_gameref_t game);
575 extern sc_bool lib_cmd_shake_npc(sc_gameref_t game);
576 extern sc_bool lib_cmd_shake_other(sc_gameref_t game);
577 extern sc_bool lib_cmd_shake_what(sc_gameref_t game);
578 extern sc_bool lib_cmd_shout(sc_gameref_t game);
579 extern sc_bool lib_cmd_sing(sc_gameref_t game);
580 extern sc_bool lib_cmd_sleep(sc_gameref_t game);
581 extern sc_bool lib_cmd_smell_object(sc_gameref_t game);
582 extern sc_bool lib_cmd_smell_other(sc_gameref_t game);
583 extern sc_bool lib_cmd_stop_object(sc_gameref_t game);
584 extern sc_bool lib_cmd_stop_other(sc_gameref_t game);
585 extern sc_bool lib_cmd_stop_what(sc_gameref_t game);
586 extern sc_bool lib_cmd_suck_object(sc_gameref_t game);
587 extern sc_bool lib_cmd_suck_other(sc_gameref_t game);
588 extern sc_bool lib_cmd_suck_what(sc_gameref_t game);
589 extern sc_bool lib_cmd_talk(sc_gameref_t game);
590 extern sc_bool lib_cmd_thank(sc_gameref_t game);
591 extern sc_bool lib_cmd_touch_object(sc_gameref_t game);
592 extern sc_bool lib_cmd_touch_other(sc_gameref_t game);
593 extern sc_bool lib_cmd_touch_what(sc_gameref_t game);
594 extern sc_bool lib_cmd_turn_object(sc_gameref_t game);
595 extern sc_bool lib_cmd_turn_other(sc_gameref_t game);
596 extern sc_bool lib_cmd_turn_what(sc_gameref_t game);
597 extern sc_bool lib_cmd_unblock_object(sc_gameref_t game);
598 extern sc_bool lib_cmd_unblock_other(sc_gameref_t game);
599 extern sc_bool lib_cmd_unblock_what(sc_gameref_t game);
600 extern sc_bool lib_cmd_wash_object(sc_gameref_t game);
601 extern sc_bool lib_cmd_wash_other(sc_gameref_t game);
602 extern sc_bool lib_cmd_wash_what(sc_gameref_t game);
603 extern sc_bool lib_cmd_whistle(sc_gameref_t game);
604 extern sc_bool lib_cmd_interrogation(sc_gameref_t game);
605 extern sc_bool lib_cmd_xyzzy(sc_gameref_t game);
606 extern sc_bool lib_cmd_egotistic(sc_gameref_t game);
607 extern sc_bool lib_cmd_yes_or_no(sc_gameref_t game);
608 extern sc_bool lib_cmd_verb_object(sc_gameref_t game);
609 extern sc_bool lib_cmd_verb_npc(sc_gameref_t game);
610 extern void lib_debug_trace(sc_bool flag);
611 
612 /* Resource opaque typedef and control functions. */
613 typedef struct sc_resource_s *sc_resourceref_t;
614 extern sc_bool res_has_sound(sc_gameref_t game);
615 extern sc_bool res_has_graphics(sc_gameref_t game);
616 extern void res_clear_resource(sc_resourceref_t resource);
617 extern sc_bool res_compare_resource(sc_resourceref_t from,
618 									sc_resourceref_t with);
619 extern void res_handle_resource(sc_gameref_t game,
620 								const sc_char *partial_format,
621 								const sc_vartype_t vt_partial[]);
622 extern void res_sync_resources(sc_gameref_t game);
623 extern void res_cancel_resources(sc_gameref_t game);
624 
625 /* Game runner functions. */
626 extern sc_bool run_game_task_commands(sc_gameref_t game, const sc_char *string);
627 extern sc_gameref_t run_create(sc_read_callbackref_t callback, void *opaque);
628 extern void run_interpret(CONTEXT, sc_gameref_t game);
629 extern void run_destroy(sc_gameref_t game);
630 extern void run_restart(CONTEXT, sc_gameref_t game);
631 extern void run_save(sc_gameref_t game, sc_write_callbackref_t callback, void *opaque);
632 extern sc_bool run_save_prompted(sc_gameref_t game);
633 extern sc_bool run_restore(CONTEXT, sc_gameref_t game, sc_read_callbackref_t callback, void *opaque);
634 extern sc_bool run_restore_prompted(CONTEXT, sc_gameref_t game);
635 extern sc_bool run_undo(CONTEXT, sc_gameref_t game);
636 extern void run_quit(CONTEXT, sc_gameref_t game);
637 extern sc_bool run_is_running(sc_gameref_t game);
638 extern sc_bool run_has_completed(sc_gameref_t game);
639 extern sc_bool run_is_undo_available(sc_gameref_t game);
640 extern void run_get_attributes(sc_gameref_t game,
641 							   const sc_char **game_name,
642 							   const sc_char **game_author,
643 							   const sc_char **game_compile_date,
644 							   sc_int *turns, sc_int *score,
645 							   sc_int *max_score,
646 							   const sc_char **current_room_name,
647 							   const sc_char **status_line,
648 							   const sc_char **preferred_font,
649 							   sc_bool *bold_room_names, sc_bool *verbose,
650 							   sc_bool *notify_score_change);
651 extern void run_set_attributes(sc_gameref_t game,
652 							   sc_bool bold_room_names, sc_bool verbose,
653 							   sc_bool notify_score_change);
654 extern sc_hintref_t run_hint_iterate(sc_gameref_t game, sc_hintref_t hint);
655 extern const sc_char *run_get_hint_question(sc_gameref_t game,
656 		sc_hintref_t hint);
657 extern const sc_char *run_get_subtle_hint(sc_gameref_t game,
658 		sc_hintref_t hint);
659 extern const sc_char *run_get_unsubtle_hint(sc_gameref_t game,
660 		sc_hintref_t hint);
661 
662 /* Event functions. */
663 extern sc_bool evt_can_see_event(sc_gameref_t game, sc_int event);
664 extern void evt_tick_events(sc_gameref_t game);
665 extern void evt_debug_trace(sc_bool flag);
666 
667 /* Task functions. */
668 extern sc_bool task_has_hints(sc_gameref_t game, sc_int task);
669 extern const sc_char *task_get_hint_question(sc_gameref_t game, sc_int task);
670 extern const sc_char *task_get_hint_subtle(sc_gameref_t game, sc_int task);
671 extern const sc_char *task_get_hint_unsubtle(sc_gameref_t game, sc_int task);
672 extern sc_bool task_can_run_task_directional(sc_gameref_t game,
673 		sc_int task, sc_bool forwards);
674 extern sc_bool task_can_run_task(sc_gameref_t game, sc_int task);
675 extern sc_bool task_run_task(sc_gameref_t game, sc_int task, sc_bool forwards);
676 extern void task_debug_trace(sc_bool flag);
677 
678 /* Task restriction functions. */
679 extern sc_bool restr_pass_task_object_state(sc_gameref_t game,
680 		sc_int var1, sc_int var2);
681 extern sc_bool restr_eval_task_restrictions(sc_gameref_t game,
682 		sc_int task, sc_bool *pass,
683 		const sc_char **fail_message);
684 extern void restr_debug_trace(sc_bool flag);
685 
686 /* NPC gender enumeration and functions. */
687 enum {
688 	NPC_MALE = 0,
689 	NPC_FEMALE = 1,
690 	NPC_NEUTER = 2
691 };
692 
693 extern sc_bool npc_in_room(sc_gameref_t game, sc_int npc, sc_int Room);
694 extern sc_int npc_count_in_room(sc_gameref_t game, sc_int Room);
695 extern void npc_setup_initial(sc_gameref_t game);
696 extern void npc_start_npc_walk(sc_gameref_t game, sc_int npc, sc_int walk);
697 extern void npc_tick_npcs(sc_gameref_t game);
698 extern void npc_turn_update(sc_gameref_t game);
699 extern void npc_debug_trace(sc_bool flag);
700 
701 /* Object open/closed state enumeration and functions. */
702 enum {
703 	OBJ_WONTCLOSE = 0,
704 	OBJ_OPEN = 5,
705 	OBJ_CLOSED = 6,
706 	OBJ_LOCKED = 7
707 };
708 
709 extern sc_bool obj_is_static(sc_gameref_t game, sc_int object);
710 extern sc_bool obj_is_container(sc_gameref_t game, sc_int _object);
711 extern sc_bool obj_is_surface(sc_gameref_t game, sc_int object);
712 extern sc_int obj_container_object(sc_gameref_t game, sc_int n);
713 extern sc_int obj_surface_object(sc_gameref_t game, sc_int n);
714 extern sc_bool obj_indirectly_in_room(sc_gameref_t game,
715 									  sc_int _object, sc_int Room);
716 extern sc_bool obj_indirectly_held_by_player(sc_gameref_t game, sc_int object);
717 extern sc_bool obj_directly_in_room(sc_gameref_t game,
718 									sc_int _object, sc_int Room);
719 extern sc_int obj_stateful_object(sc_gameref_t game, sc_int n);
720 extern sc_int obj_dynamic_object(sc_gameref_t game, sc_int n);
721 extern sc_int obj_wearable_object(sc_gameref_t game, sc_int n);
722 extern sc_int obj_standable_object(sc_gameref_t game, sc_int n);
723 extern sc_int obj_get_size(sc_gameref_t game, sc_int object);
724 extern sc_int obj_get_weight(sc_gameref_t game, sc_int _object);
725 extern sc_int obj_get_player_size_limit(sc_gameref_t game);
726 extern sc_int obj_get_player_weight_limit(sc_gameref_t game);
727 extern sc_int obj_get_container_maxsize(sc_gameref_t game, sc_int object);
728 extern sc_int obj_get_container_capacity(sc_gameref_t game, sc_int object);
729 extern sc_int obj_lieable_object(sc_gameref_t game, sc_int n);
730 extern sc_bool obj_appears_plural(sc_gameref_t game, sc_int _object);
731 extern void obj_setup_initial(sc_gameref_t game);
732 extern sc_int obj_container_index(sc_gameref_t game, sc_int object);
733 extern sc_int obj_surface_index(sc_gameref_t game, sc_int object);
734 extern sc_int obj_stateful_index(sc_gameref_t game, sc_int _object);
735 extern sc_char *obj_state_name(sc_gameref_t game, sc_int object);
736 extern sc_bool obj_shows_initial_description(sc_gameref_t game, sc_int object);
737 extern void obj_turn_update(sc_gameref_t game);
738 extern void obj_debug_trace(sc_bool flag);
739 
740 /* Locale support, and locale-sensitive functions. */
741 extern void loc_detect_game_locale(sc_prop_setref_t bundle);
742 extern sc_bool loc_set_locale(const sc_char *name);
743 extern const sc_char *loc_get_locale(void);
744 extern sc_bool sc_isspace(sc_char character);
745 extern sc_bool sc_isdigit(sc_char character);
746 extern sc_bool sc_isalpha(sc_char character);
747 extern sc_char sc_toupper(sc_char character);
748 extern sc_char sc_tolower(sc_char character);
749 extern void loc_debug_dump(void);
750 
751 /* Debugger interface. */
752 typedef struct sc_debugger_s *sc_debuggerref_t;
753 extern sc_bool debug_run_command(sc_gameref_t game,
754 								 const sc_char *debug_command);
755 extern sc_bool debug_cmd_debugger(sc_gameref_t game);
756 extern void debug_set_enabled(sc_gameref_t game, sc_bool enable);
757 extern sc_bool debug_get_enabled(sc_gameref_t game);
758 extern void debug_game_started(CONTEXT, sc_gameref_t game);
759 extern void debug_game_ended(CONTEXT, sc_gameref_t game);
760 extern void debug_turn_update(CONTEXT, sc_gameref_t game);
761 
762 /* OS interface functions. */
763 extern sc_bool if_get_trace_flag(sc_uint bitmask);
764 extern void if_print_string(const sc_char *string);
765 extern void if_print_debug(const sc_char *string);
766 extern void if_print_character(sc_char character);
767 extern void if_print_debug_character(sc_char character);
768 extern void if_print_tag(sc_int tag, const sc_char *arg);
769 extern void if_read_line(sc_char *buffer, sc_int length);
770 extern void if_read_debug(sc_char *buffer, sc_int length);
771 extern sc_bool if_confirm(sc_int _type);
772 extern void *if_open_saved_game(sc_bool is_save);
773 extern void if_close_saved_game(void *opaque);
774 extern void if_display_hints(sc_gameref_t game);
775 extern void if_update_sound(const sc_char *filepath, sc_int sound_offset,
776 		sc_int sound_length, sc_bool is_looping);
777 extern void if_update_graphic(const sc_char *filepath, sc_int graphic_offset, sc_int graphic_length);
778 
779 #endif
780 
781 } // End of namespace Adrift
782 } // End of namespace Glk
783