diff options
Diffstat (limited to 'engines/glk/frotz/glk_interface.h')
-rw-r--r-- | engines/glk/frotz/glk_interface.h | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/engines/glk/frotz/glk_interface.h b/engines/glk/frotz/glk_interface.h new file mode 100644 index 0000000000..e3fa2c9081 --- /dev/null +++ b/engines/glk/frotz/glk_interface.h @@ -0,0 +1,195 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef GLK_FROTZ_GLK_INTERFACE +#define GLK_FROTZ_GLK_INTERFACE + +#include "glk/glk.h" +#include "glk/frotz/mem.h" + +namespace Gargoyle { +namespace Frotz { + +enum SoundEffect { + EFFECT_PREPARE = 1, + EFFECT_PLAY = 2, + EFFECT_STOP = 3, + EFFECT_FINISH_WITH = 4 +}; + +enum RestartAction { + RESTART_BEGIN = 0, + RESTART_WPROP_SET = 1, + RESTART_END = 2 +}; + + +/** + * Implements an intermediate interface on top of the GLK layer, providing screen + * and sound effect handling + */ +class GlkInterface : public Glk, public virtual UserOptions, public virtual Mem { +public: + zchar statusline[256]; + int oldstyle; + int curstyle; + int cury; + int curx; + int fixforced; + + int curr_fg; + int curr_bg; + int curr_font; + int prev_font; + int temp_font; + + int curr_status_ht; + int mach_status_ht; + + winid_t gos_status; + winid_t gos_upper; + winid_t gos_lower; + winid_t gos_curwin; + int gos_linepending; + zchar *gos_linebuf; + winid_t gos_linewin; + schanid_t gos_channel; + + // Current window and mouse data + int cwin; + int mwin; + int mouse_y; + int mouse_x; + int menu_selected; + + // IO streams + bool ostream_screen; + bool ostream_script; + bool ostream_memory; + bool ostream_record; + bool istream_replay; + bool message; + + // Window attributes + bool enable_wrapping; + bool enable_scripting; + bool enable_scrolling; + bool enable_buffering; + + // Sound fields + int next_sample; + int next_volume; + + bool _soundLocked; + bool _soundPlaying; +protected: + int os_char_width(zchar z); + int os_string_width(const zchar *s); + int os_string_length(zchar *s); + void os_prepare_sample(int a); + void os_finish_with_sample(int a); + + /** + * Play the given sample at the given volume (ranging from 1 to 8 and + * 255 meaning a default volume). The sound is played once or several + * times in the background (255 meaning forever). In Z-code 3 the + * repeats value is always 0 and the number of repeats is taken from + * the sound file itself. The end_of_sound function is called as soon + * as the sound finishes. + */ + void os_start_sample(int number, int volume, int repeats, zword eos); + + void os_stop_sample(int a); + void os_beep(int volume); + + /** + * Call the IO interface to play a sample. + */ + void start_sample(int number, int volume, int repeats, zword eos); + + void start_next_sample(); + void gos_update_width(); + void gos_update_height(); + void reset_status_ht(); + void erase_window(zword w); + void split_window(zword lines); + void restart_screen(); + + /** + * statusline overflowed the window size ... bad game! + * so ... split status text into regions, reformat and print anew. + */ + void packspaces(zchar *src, zchar *dst); + + void smartstatusline(); + + /** + * Cancels any pending line + */ + void gos_cancel_pending_line(); + + /** + * Called during game restarts + */ + void os_restart_game(RestartAction) {} + + /** + * Reads the mouse buttons + */ + zword os_read_mouse() { + // Not implemented + return 0; + } + + void os_scrollback_char(zchar z) { + // Not implemented + } + + void os_scrollback_erase(int amount) { + // Not implemented + } + + /** + * Waits for a keypress + */ + zchar os_read_key(int timeout, bool show_cursor); + + /** + * Waits for the user to type an input line + */ + zchar os_read_line(int max, zchar *buf, int timeout, int width, int continued); +public: + /** + * Constructor + */ + GlkInterface(OSystem *syst, const GargoyleGameDescription *gameDesc); + + /** + * Initialization + */ + void initialize(); +}; + +} // End of namespace Frotz +} // End of namespace Gargoyle + +#endif |