X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=879b5396dd22f13549eb52245e15e97d1fa71db5;hb=066b410c0573fe64a1783116daf9d64883e9f03e;hp=7da6e5536c058fb79e9598f4a8a95e10de3cee7c;hpb=4c23826c2c9f8f6c7d1fec69769ba0d7254c9a7c;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 7da6e553..879b5396 100644 --- a/src/events.c +++ b/src/events.c @@ -1,26 +1,26 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-98 Artsoft Entertainment * -* Holger Schemel * -* Oststrasse 11a * -* 33604 Bielefeld * -* phone: ++49 +521 290471 * -* email: aeglos@valinor.owl.de * +* (c) 1995-2001 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* events.c * +* events.c * ***********************************************************/ +#include "libgame/libgame.h" + #include "events.h" #include "init.h" #include "screens.h" #include "tools.h" #include "game.h" #include "editor.h" -#include "misc.h" +#include "files.h" #include "tape.h" -#include "joystick.h" -#include "buttons.h" #include "network.h" /* values for key_status */ @@ -33,7 +33,7 @@ delay problems with lots of mouse motion events when mouse button not pressed */ -int EventFilter(const Event *event) +int FilterMouseMotionEvents(const Event *event) { if (event->type != EVENT_MOTIONNOTIFY) return 1; @@ -45,6 +45,23 @@ int EventFilter(const Event *event) return 1; } +/* this is only really needed for non-SDL targets to filter unwanted events; + when using SDL with properly installed event filter, this function can be + replaced with a simple "NextEvent()" call, but it doesn't hurt either */ + +static boolean NextValidEvent(Event *event) +{ + while (PendingEvent()) + { + NextEvent(event); + + if (FilterMouseMotionEvents(event)) + return TRUE; + } + + return FALSE; +} + void EventLoop(void) { while(1) @@ -53,9 +70,7 @@ void EventLoop(void) { Event event; - NextEvent(&event); - - if (EventFilter(&event)) + if (NextValidEvent(&event)) { switch(event.type) { @@ -123,7 +138,7 @@ void HandleOtherEvents(Event *event) HandleClientMessageEvent((ClientMessageEvent *) event); break; -#ifdef USE_SDL_JOYSTICK +#if defined(TARGET_SDL) case SDL_JOYAXISMOTION: case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: @@ -206,39 +221,8 @@ void SleepWhileUnmapped() void HandleExposeEvent(ExposeEvent *event) { -#ifndef USE_SDL_LIBRARY - int x = event->x, y = event->y; - int width = event->width, height = event->height; - - if (setup.direct_draw && game_status==PLAYING) - { - int xx,yy; - int x1 = (x-SX)/TILEX, y1 = (y-SY)/TILEY; - int x2 = (x-SX+width)/TILEX, y2 = (y-SY+height)/TILEY; - - SetDrawtoField(DRAW_BACKBUFFER); - - for(xx=0; xx=x1 && xx<=x2 && yy>=y1 && yy<=y2) - DrawScreenField(xx,yy); - DrawAllPlayers(); - - SetDrawtoField(DRAW_DIRECT); - } - - if (setup.soft_scrolling && game_status == PLAYING) - { - int fx = FX, fy = FY; - - fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0); - fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0); - - BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY); - } - - BlitBitmap(drawto, window, x,y, width,height, x,y); - +#ifndef TARGET_SDL + RedrawPlayfield(FALSE, event->x, event->y, event->width, event->height); FlushDisplay(); #endif } @@ -288,8 +272,8 @@ void HandleFocusEvent(FocusChangeEvent *event) int i; KeyboardAutoRepeatOn(); - old_joystick_status = joystick_status; - joystick_status = JOYSTICK_OFF; + old_joystick_status = joystick.status; + joystick.status = JOYSTICK_NOT_AVAILABLE; /* simulate key release events for still pressed keys */ key_joystick_mapping = 0; @@ -320,21 +304,14 @@ void HandleFocusEvent(FocusChangeEvent *event) KeyboardAutoRepeatOff(); } if (old_joystick_status != -1) - joystick_status = old_joystick_status; + joystick.status = old_joystick_status; } } void HandleClientMessageEvent(ClientMessageEvent *event) { -#ifdef USE_SDL_LIBRARY - CloseAllAndExit(0); /* the only possible message here is SDL_QUIT */ -#else -#ifndef MSDOS - if ((event->window == window) && - (event->data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", FALSE))) + if (CheckCloseWindowEvent(event)) CloseAllAndExit(0); -#endif -#endif } void HandleButton(int mx, int my, int button) @@ -362,7 +339,7 @@ void HandleButton(int mx, int my, int button) break; case TYPENAME: - HandleTypeName(0, KEY_Return); + HandleTypeName(0, KSYM_Return); break; case CHOOSELEVEL: @@ -384,10 +361,6 @@ void HandleButton(int mx, int my, int button) HandleSetupScreen(mx,my, 0,0, button); break; - case SETUPINPUT: - HandleSetupInputScreen(mx,my, 0,0, button); - break; - case PLAYING: #ifdef DEBUG if (button == MB_RELEASED) @@ -426,6 +399,7 @@ void HandleButton(int mx, int my, int button) void HandleKey(Key key, int key_status) { int joy = 0; + boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive(); static struct SetupKeyboardInfo custom_key; static struct { @@ -491,7 +465,7 @@ void HandleKey(Key key, int key_status) if (key_status == KEY_RELEASED) return; - if ((key == KEY_Return || key == KEY_space) && + if ((key == KSYM_Return || key == KSYM_space) && game_status == PLAYING && AllPlayersGone) { CloseDoor(DOOR_CLOSE_1); @@ -501,14 +475,26 @@ void HandleKey(Key key, int key_status) } /* allow quick escape to the main menu with the Escape key */ - if (key == KEY_Escape && game_status != MAINMENU) + if (key == KSYM_Escape && + game_status != MAINMENU && + game_status != PLAYING && + game_status != LEVELED && + game_status != CHOOSELEVEL && + game_status != SETUP) { - CloseDoor(DOOR_CLOSE_1 | DOOR_OPEN_2 | DOOR_NO_DELAY); game_status = MAINMENU; DrawMainMenu(); return; } + /* special shortcuts for quick game tape saving and loading */ + if (game_status == MAINMENU || game_status == PLAYING) + { + if (key == setup.shortcut.save_game) + TapeQuickSave(); + else if (key == setup.shortcut.load_game) + TapeQuickLoad(); + } #ifndef DEBUG @@ -531,31 +517,41 @@ void HandleKey(Key key, int key_status) case MAINMENU: case CHOOSELEVEL: case SETUP: - case SETUPINPUT: switch(key) { - case KEY_Return: - case KEY_space: + case KSYM_Return: + case KSYM_space: if (game_status == MAINMENU) HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); else if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE); else if (game_status == SETUP) HandleSetupScreen(0,0, 0,0, MB_MENU_CHOICE); - else if (game_status == SETUPINPUT) - HandleSetupInputScreen(0,0, 0,0, MB_MENU_CHOICE); break; - case KEY_Page_Up: + case KSYM_Escape: + if (game_status == CHOOSELEVEL) + HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE); + else if (game_status == SETUP) + HandleSetupScreen(0,0, 0,0, MB_MENU_LEAVE); + break; + + case KSYM_Page_Up: if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0, 0,-SCR_FIELDY, MB_MENU_MARK); break; - case KEY_Page_Down: + case KSYM_Page_Down: if (game_status == CHOOSELEVEL) HandleChooseLevel(0,0, 0,SCR_FIELDY, MB_MENU_MARK); break; +#ifdef DEBUG + case KSYM_t: + DumpTape(&tape); + break; +#endif + default: break; } @@ -568,18 +564,18 @@ void HandleKey(Key key, int key_status) case HALLOFFAME: switch(key) { - case KEY_Return: - case KEY_space: + case KSYM_Return: + case KSYM_space: game_status = MAINMENU; DrawMainMenu(); BackToFront(); break; - case KEY_Page_Up: + case KSYM_Page_Up: HandleHallOfFame(0,0, 0,-SCR_FIELDY, MB_MENU_MARK); break; - case KEY_Page_Down: + case KSYM_Page_Down: HandleHallOfFame(0,0, 0,SCR_FIELDY, MB_MENU_MARK); break; @@ -589,26 +585,30 @@ void HandleKey(Key key, int key_status) break; case LEVELED: - HandleLevelEditorKeyInput(key); + if (!anyTextGadgetActiveOrJustFinished || key == KSYM_Escape) + HandleLevelEditorKeyInput(key); break; case PLAYING: { switch(key) { + case KSYM_Escape: + RequestQuitGame(setup.ask_on_escape); + break; #ifdef DEBUG - case KEY_0: - case KEY_1: - case KEY_2: - case KEY_3: - case KEY_4: - case KEY_5: - case KEY_6: - case KEY_7: - case KEY_8: - case KEY_9: - if (key == KEY_0) + case KSYM_0: + case KSYM_1: + case KSYM_2: + case KSYM_3: + case KSYM_4: + case KSYM_5: + case KSYM_6: + case KSYM_7: + case KSYM_8: + case KSYM_9: + if (key == KSYM_0) { if (GameFrameDelay == 500) GameFrameDelay = GAME_FRAME_DELAY; @@ -616,12 +616,12 @@ void HandleKey(Key key, int key_status) GameFrameDelay = 500; } else - GameFrameDelay = (key - KEY_0) * 10; + GameFrameDelay = (key - KSYM_0) * 10; printf("Game speed == %d%% (%d ms delay between two frames)\n", GAME_FRAME_DELAY * 100 / GameFrameDelay, GameFrameDelay); break; - case KEY_d: + case KSYM_d: if (options.debug) { options.debug = FALSE; @@ -634,7 +634,7 @@ void HandleKey(Key key, int key_status) } break; - case KEY_s: + case KSYM_s: if (!global.fps_slowdown) { global.fps_slowdown = TRUE; @@ -655,7 +655,7 @@ void HandleKey(Key key, int key_status) break; #if 0 - case KEY_a: + case KSYM_a: if (ScrollStepSize == TILEX/8) ScrollStepSize = TILEX/4; else @@ -665,7 +665,7 @@ void HandleKey(Key key, int key_status) #endif #if 0 - case KEY_m: + case KSYM_m: if (MoveSpeed == 8) { MoveSpeed = 4; @@ -680,30 +680,28 @@ void HandleKey(Key key, int key_status) break; #endif - case KEY_f: + case KSYM_f: ScrollStepSize = TILEX/8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); break; - case KEY_g: + case KSYM_g: ScrollStepSize = TILEX/4; printf("ScrollStepSize == %d (1/4)\n", ScrollStepSize); break; - case KEY_h: + case KSYM_h: ScrollStepSize = TILEX/2; printf("ScrollStepSize == %d (1/2)\n", ScrollStepSize); break; - case KEY_l: + case KSYM_l: ScrollStepSize = TILEX; printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize); break; -#ifndef MSDOS - case KEY_Q: -#endif - case KEY_q: + case KSYM_Q: + case KSYM_q: local_player->dynamite = 1000; break; @@ -711,7 +709,7 @@ void HandleKey(Key key, int key_status) #if 0 - case KEY_z: + case KSYM_z: { int i; @@ -748,7 +746,7 @@ void HandleNoEvent() return; } -#if !defined(MSDOS) && !defined(WIN32) +#if defined(PLATFORM_UNIX) if (options.network) HandleNetworking(); #endif @@ -803,7 +801,6 @@ void HandleJoystick() case MAINMENU: case CHOOSELEVEL: case SETUP: - case SETUPINPUT: { static unsigned long joystickmove_delay = 0; @@ -817,9 +814,6 @@ void HandleJoystick() HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status==SETUP) HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); - else if (game_status==SETUPINPUT) - HandleSetupInputScreen(0,0,dx,dy, - newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); break; }