X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=134a5e73f536a54d9ac7288c7502df7a69a62ce5;hb=e6e7b00366bd426aaaad8f5175feabb0eafb4cb0;hp=e76026e17bfc68c3c468eedc59421fcdc08a1ff3;hpb=e0bf8eee0aec424593e68e37e35c6b6f120e4712;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index e76026e1..134a5e73 100644 --- a/src/events.c +++ b/src/events.c @@ -53,13 +53,42 @@ int FilterMouseMotionEvents(const Event *event) } /* skip mouse motion events without pressed button outside level editor */ - if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR && - game_status != GAME_MODE_PLAYING) + if (button_status == MB_RELEASED && + game_status != GAME_MODE_EDITOR && game_status != GAME_MODE_PLAYING) return 0; else return 1; } +/* to prevent delay problems, skip mouse motion events if the very next + event is also a mouse motion event (and therefore effectively only + handling the last of a row of mouse motion events in the event queue) */ + +boolean SkipPressedMouseMotionEvent(const Event *event) +{ + /* nothing to do if the current event is not a mouse motion event */ + if (event->type != EVENT_MOTIONNOTIFY) + return FALSE; + + /* only skip motion events with pressed button outside level editor */ + if (button_status == MB_RELEASED || + game_status == GAME_MODE_EDITOR || game_status == GAME_MODE_PLAYING) + return FALSE; + + if (PendingEvent()) + { + Event next_event; + + PeekEvent(&next_event); + + /* if next event is also a mouse motion event, skip the current one */ + if (next_event.type == EVENT_MOTIONNOTIFY) + return TRUE; + } + + return FALSE; +} + /* 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 */ @@ -68,9 +97,17 @@ static boolean NextValidEvent(Event *event) { while (PendingEvent()) { + boolean handle_this_event = FALSE; + NextEvent(event); if (FilterMouseMotionEvents(event)) + handle_this_event = TRUE; + + if (SkipPressedMouseMotionEvent(event)) + handle_this_event = FALSE; + + if (handle_this_event) return TRUE; } @@ -85,7 +122,7 @@ void EventLoop(void) { Event event; - if (NextValidEvent(&event)) + while (NextValidEvent(&event)) { switch(event.type) { @@ -112,7 +149,7 @@ void EventLoop(void) else { /* when playing, display a special mouse pointer inside the playfield */ - if (game_status == GAME_MODE_PLAYING) + if (game_status == GAME_MODE_PLAYING && !tape.pausing) { if (!playfield_cursor_set && cursor_inside_playfield && DelayReached(&playfield_cursor_delay, 1000)) @@ -134,7 +171,9 @@ void EventLoop(void) has its own synchronization and is CPU friendly, too */ if (game_status == GAME_MODE_PLAYING) + { HandleGameActions(); + } else { SyncDisplay(); @@ -291,10 +330,8 @@ void HandleMotionEvent(MotionEvent *event) if (!PointerInWindow(window)) return; /* window and pointer are on different screens */ -#if 1 if (button_status == MB_RELEASED && game_status != GAME_MODE_EDITOR) return; -#endif motion_status = TRUE; @@ -347,6 +384,7 @@ void HandleFocusEvent(FocusChangeEvent *event) Delay(100); KeyboardAutoRepeatOffUnlessAutoplay(); } + if (old_joystick_status != -1) joystick.status = old_joystick_status; } @@ -382,6 +420,10 @@ void HandleButton(int mx, int my, int button) switch(game_status) { + case GAME_MODE_TITLE: + HandleTitleScreen(mx,my, 0,0, button); + break; + case GAME_MODE_MAIN: HandleMainMenu(mx,my, 0,0, button); break; @@ -399,6 +441,7 @@ void HandleButton(int mx, int my, int button) break; case GAME_MODE_EDITOR: + HandleLevelEditorIdle(); break; case GAME_MODE_INFO: @@ -411,36 +454,8 @@ void HandleButton(int mx, int my, int button) case GAME_MODE_PLAYING: #ifdef DEBUG - if (button == MB_RELEASED) - { - if (IN_GFX_SCREEN(mx, my)) - { - int sx = (mx - SX) / TILEX; - int sy = (my - SY) / TILEY; - int x = LEVELX(sx); - int y = LEVELY(sy); - - printf("INFO: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y); - - if (!IN_LEV_FIELD(x, y)) - break; - - printf(" Feld[%d][%d] == %d ('%s')\n", x,y, Feld[x][y], - element_info[Feld[x][y]].token_name); - printf(" Back[%d][%d] == %d\n", x,y, Back[x][y]); - printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]); - printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]); - printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]); - printf(" MovPos[%d][%d] == %d\n", x,y, MovPos[x][y]); - printf(" MovDir[%d][%d] == %d\n", x,y, MovDir[x][y]); - printf(" MovDelay[%d][%d] == %d\n", x,y, MovDelay[x][y]); - printf(" ChangeDelay[%d][%d] == %d\n", x,y, ChangeDelay[x][y]); - printf(" GfxElement[%d][%d] == %d\n", x,y, GfxElement[x][y]); - printf(" GfxAction[%d][%d] == %d\n", x,y, GfxAction[x][y]); - printf(" GfxFrame[%d][%d] == %d\n", x,y, GfxFrame[x][y]); - printf("\n"); - } - } + if (button == MB_PRESSED && !motion_status && IN_GFX_SCREEN(mx, my)) + DumpTile(LEVELX((mx - SX) / TILEX), LEVELY((my - SY) / TILEY)); #endif break; @@ -457,7 +472,7 @@ static boolean is_string_suffix(char *string, char *suffix) if (suffix_len > string_len) return FALSE; - return (strcmp(&string[string_len - suffix_len], suffix) == 0); + return (strEqual(&string[string_len - suffix_len], suffix)); } #define MAX_CHEAT_INPUT_LEN 32 @@ -535,10 +550,7 @@ static void HandleKeysSpecial(Key key) { #ifdef DEBUG if (is_string_suffix(cheat_input, ".q")) - for (i = 0; i < MAX_INVENTORY_SIZE; i++) - if (local_player->inventory_size < MAX_INVENTORY_SIZE) - local_player->inventory_element[local_player->inventory_size++] = - EL_DYNAMITE; + DEBUG_SetMaximumDynamite(); #endif } else if (game_status == GAME_MODE_EDITOR) @@ -548,12 +560,15 @@ static void HandleKeysSpecial(Key key) { DumpBrush(); } + else if (is_string_suffix(cheat_input, ":DDB")) + { + DumpBrush_Small(); + } } } void HandleKey(Key key, int key_status) { - int joy = 0; boolean anyTextGadgetActiveOrJustFinished = anyTextGadgetActive(); static struct SetupKeyboardInfo custom_key; static struct @@ -570,6 +585,8 @@ void HandleKey(Key key, int key_status) { &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 }, { &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 } }; + int joy = 0; + int i; if (game_status == GAME_MODE_PLAYING) { @@ -580,7 +597,6 @@ void HandleKey(Key key, int key_status) for (pnr = 0; pnr < MAX_PLAYERS; pnr++) { - int i; byte key_action = 0; if (setup.input[pnr].use_joystick) @@ -636,8 +652,6 @@ void HandleKey(Key key, int key_status) } else { - int i; - for (i = 0; i < 6; i++) if (key == key_info[i].key_default) joy |= key_info[i].action; @@ -669,21 +683,10 @@ void HandleKey(Key key, int key_status) return; } - if (game_status == GAME_MODE_MAIN && key == setup.shortcut.toggle_pause) + if (game_status == GAME_MODE_MAIN && + (key == setup.shortcut.toggle_pause || key == KSYM_space)) { - if (setup.autorecord) - TapeStartRecording(); - -#if defined(PLATFORM_UNIX) - if (options.network) - SendToServer_StartPlaying(); - else -#endif - { - game_status = GAME_MODE_PLAYING; - StopAnimation(); - InitGame(); - } + StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE); return; } @@ -698,6 +701,30 @@ void HandleKey(Key key, int key_status) TapeTogglePause(TAPE_TOGGLE_MANUAL); } + if (game_status == GAME_MODE_PLAYING && !network_playing) + { + int centered_player_nr_next = -999; + + if (key == setup.shortcut.focus_player_all) + centered_player_nr_next = -1; + else + for (i = 0; i < MAX_PLAYERS; i++) + if (key == setup.shortcut.focus_player[i]) + centered_player_nr_next = i; + + if (centered_player_nr_next != -999) + { + game.centered_player_nr_next = centered_player_nr_next; + game.set_centered_player = TRUE; + + if (tape.recording) + { + tape.centered_player_nr_next = game.centered_player_nr_next; + tape.set_centered_player = TRUE; + } + } + } + HandleKeysSpecial(key); if (HandleGadgetsKeyInput(key)) @@ -712,14 +739,23 @@ void HandleKey(Key key, int key_status) HandleTypeName(0, key); break; + case GAME_MODE_TITLE: case GAME_MODE_MAIN: case GAME_MODE_LEVELS: case GAME_MODE_SETUP: case GAME_MODE_INFO: switch(key) { +#if 1 + case KSYM_space: +#else + /* !!! only use "space" key to start game from main menu !!! */ + case KSYM_space: +#endif case KSYM_Return: - if (game_status == GAME_MODE_MAIN) + if (game_status == GAME_MODE_TITLE) + HandleTitleScreen(0,0, 0,0, MB_MENU_CHOICE); + else if (game_status == GAME_MODE_MAIN) HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE); else if (game_status == GAME_MODE_LEVELS) HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE); @@ -730,7 +766,9 @@ void HandleKey(Key key, int key_status) break; case KSYM_Escape: - if (game_status == GAME_MODE_LEVELS) + if (game_status == GAME_MODE_TITLE) + HandleTitleScreen(0,0, 0,0, MB_MENU_LEAVE); + else if (game_status == GAME_MODE_LEVELS) HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE); else if (game_status == GAME_MODE_SETUP) HandleSetupScreen(0,0, 0,0, MB_MENU_LEAVE); @@ -756,6 +794,12 @@ void HandleKey(Key key, int key_status) HandleInfoScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK); break; +#ifdef DEBUG + case KSYM_0: + GameFrameDelay = (GameFrameDelay == 500 ? GAME_FRAME_DELAY : 500); + break; +#endif + default: break; } @@ -764,6 +808,7 @@ void HandleKey(Key key, int key_status) case GAME_MODE_SCORES: switch(key) { + case KSYM_space: case KSYM_Return: case KSYM_Escape: game_status = GAME_MODE_MAIN; @@ -798,6 +843,7 @@ void HandleKey(Key key, int key_status) #ifdef DEBUG case KSYM_0: +#if 0 case KSYM_1: case KSYM_2: case KSYM_3: @@ -807,6 +853,7 @@ void HandleKey(Key key, int key_status) case KSYM_7: case KSYM_8: case KSYM_9: +#endif if (key == KSYM_0) { if (GameFrameDelay == 500) @@ -853,32 +900,6 @@ void HandleKey(Key key, int key_status) } break; -#if 0 - case KSYM_a: - if (ScrollStepSize == TILEX/8) - ScrollStepSize = TILEX/4; - else - ScrollStepSize = TILEX/8; - printf("ScrollStepSize == %d\n", ScrollStepSize); - break; -#endif - -#if 0 - case KSYM_m: - if (MoveSpeed == 8) - { - MoveSpeed = 4; - ScrollStepSize = TILEX/4; - } - else - { - MoveSpeed = 8; - ScrollStepSize = TILEX/8; - } - printf("MoveSpeed == %d\n", MoveSpeed); - break; -#endif - case KSYM_f: ScrollStepSize = TILEX/8; printf("ScrollStepSize == %d (1/8)\n", ScrollStepSize); @@ -899,25 +920,10 @@ void HandleKey(Key key, int key_status) printf("ScrollStepSize == %d (1/1)\n", ScrollStepSize); break; -#if 0 - - case KSYM_z: - { - int i; - - for (i = 0; i < MAX_PLAYERS; i++) - { - printf("Player %d:\n", i); - printf(" jx == %d, jy == %d\n", - stored_player[i].jx, stored_player[i].jy); - printf(" last_jx == %d, last_jy == %d\n", - stored_player[i].last_jx, stored_player[i].last_jy); - } - printf("\n"); - } - + case KSYM_v: + printf("::: currently using game engine version %d\n", + game.engine_version); break; -#endif #endif default: @@ -945,7 +951,7 @@ void HandleNoEvent() return; } -#if defined(PLATFORM_UNIX) +#if defined(NETWORK_AVALIABLE) if (options.network) HandleNetworking(); #endif @@ -995,6 +1001,7 @@ void HandleJoystick() switch(game_status) { + case GAME_MODE_TITLE: case GAME_MODE_MAIN: case GAME_MODE_LEVELS: case GAME_MODE_SETUP: @@ -1006,7 +1013,9 @@ void HandleJoystick() !DelayReached(&joystickmove_delay, GADGET_FRAME_DELAY)) newbutton = dx = dy = 0; - if (game_status == GAME_MODE_MAIN) + if (game_status == GAME_MODE_TITLE) + HandleTitleScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); + else if (game_status == GAME_MODE_MAIN) HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); else if (game_status == GAME_MODE_LEVELS) HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);