tron@2186: /* $Id$ */ tron@2186: truelight@0: #ifndef HAL_H truelight@0: #define HAL_H truelight@0: rubidium@5587: #ifdef __cplusplus rubidium@5587: extern "C" { rubidium@5587: #endif //__cplusplus rubidium@5587: rubidium@5587: enum WindowKeyCodes { rubidium@5587: WKC_SHIFT = 0x8000, rubidium@5587: WKC_CTRL = 0x4000, rubidium@5587: WKC_ALT = 0x2000, rubidium@5587: WKC_META = 0x1000, rubidium@5587: rubidium@5587: // Special ones rubidium@5587: WKC_NONE = 0, rubidium@5587: WKC_ESC = 1, rubidium@5587: WKC_BACKSPACE = 2, rubidium@5587: WKC_INSERT = 3, rubidium@5587: WKC_DELETE = 4, rubidium@5587: rubidium@5587: WKC_PAGEUP = 5, rubidium@5587: WKC_PAGEDOWN = 6, rubidium@5587: WKC_END = 7, rubidium@5587: WKC_HOME = 8, rubidium@5587: rubidium@5587: // Arrow keys rubidium@5587: WKC_LEFT = 9, rubidium@5587: WKC_UP = 10, rubidium@5587: WKC_RIGHT = 11, rubidium@5587: WKC_DOWN = 12, rubidium@5587: rubidium@5587: // Return & tab rubidium@5587: WKC_RETURN = 13, rubidium@5587: WKC_TAB = 14, rubidium@5587: rubidium@5587: // Numerical keyboard rubidium@5587: WKC_NUM_0 = 16, rubidium@5587: WKC_NUM_1 = 17, rubidium@5587: WKC_NUM_2 = 18, rubidium@5587: WKC_NUM_3 = 19, rubidium@5587: WKC_NUM_4 = 20, rubidium@5587: WKC_NUM_5 = 21, rubidium@5587: WKC_NUM_6 = 22, rubidium@5587: WKC_NUM_7 = 23, rubidium@5587: WKC_NUM_8 = 24, rubidium@5587: WKC_NUM_9 = 25, rubidium@5587: WKC_NUM_DIV = 26, rubidium@5587: WKC_NUM_MUL = 27, rubidium@5587: WKC_NUM_MINUS = 28, rubidium@5587: WKC_NUM_PLUS = 29, rubidium@5587: WKC_NUM_ENTER = 30, rubidium@5587: WKC_NUM_DECIMAL = 31, rubidium@5587: rubidium@5587: // Space rubidium@5587: WKC_SPACE = 32, rubidium@5587: rubidium@5587: // Function keys rubidium@5587: WKC_F1 = 33, rubidium@5587: WKC_F2 = 34, rubidium@5587: WKC_F3 = 35, rubidium@5587: WKC_F4 = 36, rubidium@5587: WKC_F5 = 37, rubidium@5587: WKC_F6 = 38, rubidium@5587: WKC_F7 = 39, rubidium@5587: WKC_F8 = 40, rubidium@5587: WKC_F9 = 41, rubidium@5587: WKC_F10 = 42, rubidium@5587: WKC_F11 = 43, rubidium@5587: WKC_F12 = 44, rubidium@5587: rubidium@5587: // backquote is the key left of "1" rubidium@5587: // we only store this key here, no matter what character is really mapped to it rubidium@5587: // on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) rubidium@5587: WKC_BACKQUOTE = 45, rubidium@5587: WKC_PAUSE = 46, rubidium@5587: rubidium@5587: // 0-9 are mapped to 48-57 rubidium@5587: // A-Z are mapped to 65-90 rubidium@5587: // a-z are mapped to 97-122 rubidium@5587: }; rubidium@5587: rubidium@5587: truelight@0: typedef struct { tron@1301: const char *(*start)(const char * const *parm); tron@1093: void (*stop)(void); truelight@0: } HalCommonDriver; truelight@0: truelight@0: typedef struct { tron@1301: const char *(*start)(const char * const *parm); tron@1093: void (*stop)(void); truelight@0: void (*make_dirty)(int left, int top, int width, int height); tron@2228: void (*main_loop)(void); truelight@0: bool (*change_resolution)(int w, int h); Darkvater@1829: void (*toggle_fullscreen)(bool fullscreen); truelight@0: } HalVideoDriver; truelight@0: truelight@0: typedef struct { tron@1301: const char *(*start)(const char * const *parm); tron@1093: void (*stop)(void); truelight@0: } HalSoundDriver; truelight@0: truelight@0: typedef struct { tron@1301: const char *(*start)(const char * const *parm); tron@1093: void (*stop)(void); truelight@0: truelight@0: void (*play_song)(const char *filename); tron@1093: void (*stop_song)(void); tron@1093: bool (*is_song_playing)(void); truelight@0: void (*set_volume)(byte vol); truelight@0: } HalMusicDriver; truelight@0: rubidium@5587: extern HalMusicDriver *_music_driver; rubidium@5587: extern HalSoundDriver *_sound_driver; rubidium@5587: extern HalVideoDriver *_video_driver; truelight@0: truelight@0: enum DriverType { truelight@0: VIDEO_DRIVER = 0, truelight@0: SOUND_DRIVER = 1, truelight@0: MUSIC_DRIVER = 2, truelight@0: }; truelight@0: rubidium@5587: enum GameModes { rubidium@5587: GM_MENU, rubidium@5587: GM_NORMAL, rubidium@5587: GM_EDITOR rubidium@5587: }; rubidium@5587: Darkvater@4217: void GameLoop(void); truelight@0: tron@1093: void CreateConsole(void); truelight@0: rubidium@5587: typedef int32 CursorID; rubidium@5587: typedef byte Pixel; rubidium@5587: rubidium@5587: typedef struct Point { rubidium@5587: int x,y; rubidium@5587: } Point; rubidium@5587: rubidium@5587: typedef struct Rect { rubidium@5587: int left,top,right,bottom; rubidium@5587: } Rect; rubidium@5587: rubidium@5587: rubidium@5587: typedef struct CursorVars { rubidium@5587: Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement rubidium@5587: Point draw_pos, draw_size; ///< position and size bounding-box for drawing rubidium@5587: CursorID sprite; ///< current image of cursor rubidium@5587: rubidium@5587: int wheel; ///< mouse wheel movement rubidium@5587: const CursorID *animate_list, *animate_cur; ///< in case of animated cursor, list of frames rubidium@5587: uint animate_timeout; ///< current frame in list of animated cursor rubidium@5587: rubidium@5587: bool visible; ///< cursor is visible rubidium@5587: bool dirty; ///< the rect occupied by the mouse is dirty (redraw) rubidium@5587: bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling) rubidium@5587: bool in_window; ///< mouse inside this window, determines drawing logic rubidium@5587: } CursorVars; rubidium@5587: rubidium@5587: typedef struct DrawPixelInfo { rubidium@5587: Pixel *dst_ptr; rubidium@5587: int left, top, width, height; rubidium@5587: int pitch; rubidium@5587: uint16 zoom; rubidium@5587: } DrawPixelInfo; rubidium@5587: rubidium@5587: rubidium@5587: extern byte _dirkeys; // 1 = left, 2 = up, 4 = right, 8 = down rubidium@5587: extern bool _fullscreen; rubidium@5587: extern CursorVars _cursor; rubidium@5587: extern bool _ctrl_pressed; // Is Ctrl pressed? rubidium@5587: extern bool _shift_pressed; // Is Shift pressed? rubidium@5587: extern byte _fast_forward; rubidium@5587: rubidium@5587: extern bool _left_button_down; rubidium@5587: extern bool _left_button_clicked; rubidium@5587: extern bool _right_button_down; rubidium@5587: extern bool _right_button_clicked; rubidium@5587: rubidium@5587: extern DrawPixelInfo _screen; rubidium@5587: extern bool _exit_game; rubidium@5587: extern bool _networking; ///< are we in networking mode? rubidium@5587: extern byte _game_mode; rubidium@5587: extern byte _pause; rubidium@5587: rubidium@5587: rubidium@5587: void HandleKeypress(uint32 key); rubidium@5587: void HandleMouseEvents(void); rubidium@5587: void CSleep(int milliseconds); rubidium@5587: void UpdateWindows(void); rubidium@5587: rubidium@5587: uint32 InteractiveRandom(void); /* Used for random sequences that are not the same on the other end of the multiplayer link */ rubidium@5587: uint InteractiveRandomRange(uint max); rubidium@5587: void DrawTextMessage(void); rubidium@5587: void DrawMouseCursor(void); rubidium@5587: void ScreenSizeChanged(void); rubidium@5587: void HandleExitGameRequest(void); rubidium@5587: void GameSizeChanged(void); rubidium@5587: void UndrawMouseCursor(void); rubidium@5587: rubidium@5587: extern int _pal_first_dirty; rubidium@5587: extern int _pal_last_dirty; rubidium@5587: extern int _num_resolutions; rubidium@5587: extern uint16 _resolutions[32][2]; rubidium@5587: extern uint16 _cur_resolution[2]; rubidium@5587: rubidium@5587: typedef struct Colour { rubidium@5587: byte r; rubidium@5587: byte g; rubidium@5587: byte b; rubidium@5587: } Colour; rubidium@5587: extern Colour _cur_palette[256]; rubidium@5587: rubidium@5587: #ifdef __cplusplus rubidium@5587: } // extern "C" rubidium@5587: #endif //__cplusplus rubidium@5587: truelight@0: #endif /* HAL_H */