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