X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fevents.c;h=410c34c28864a56a07725b3acf1aef253194899e;hb=1e5cae5e3ab889c3bcba80a065c6d7ba1e6d28a2;hp=b1c15e9fc8a8e09069c64984b52e4bfb9b81c439;hpb=9de8eede744c45187c7011543ef8097d1ebc879c;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index b1c15e9f..410c34c2 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; } @@ -79,13 +116,13 @@ static boolean NextValidEvent(Event *event) void EventLoop(void) { - while(1) + while (1) { if (PendingEvent()) /* got event */ { 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)) @@ -219,7 +256,7 @@ void ClearPlayerAction() /* simulate key release events for still pressed keys */ key_joystick_mapping = 0; - for (i=0; i string_len) + return FALSE; + + return (strcmp(&string[string_len - suffix_len], suffix) == 0); +} + +#define MAX_CHEAT_INPUT_LEN 32 + +static void HandleKeysSpecial(Key key) +{ + static char cheat_input[2 * MAX_CHEAT_INPUT_LEN + 1] = ""; + char letter = getCharFromKey(key); + int cheat_input_len = strlen(cheat_input); + int i; + + if (letter == 0) + return; + + if (cheat_input_len >= 2 * MAX_CHEAT_INPUT_LEN) + { + for (i = 0; i < MAX_CHEAT_INPUT_LEN + 1; i++) + cheat_input[i] = cheat_input[MAX_CHEAT_INPUT_LEN + i]; + + cheat_input_len = MAX_CHEAT_INPUT_LEN; + } + + cheat_input[cheat_input_len++] = letter; + cheat_input[cheat_input_len] = '\0'; + +#if 0 + printf("::: '%s' [%d]\n", cheat_input, cheat_input_len); +#endif + + if (game_status == GAME_MODE_MAIN) + { + if (is_string_suffix(cheat_input, ":insert-solution-tape") || + is_string_suffix(cheat_input, ":ist")) + { + InsertSolutionTape(); + } + else if (is_string_suffix(cheat_input, ":reload-graphics") || + is_string_suffix(cheat_input, ":rg")) + { + ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS); + DrawMainMenu(); + } + else if (is_string_suffix(cheat_input, ":reload-sounds") || + is_string_suffix(cheat_input, ":rs")) + { + ReloadCustomArtwork(1 << ARTWORK_TYPE_SOUNDS); + DrawMainMenu(); + } + else if (is_string_suffix(cheat_input, ":reload-music") || + is_string_suffix(cheat_input, ":rm")) + { + ReloadCustomArtwork(1 << ARTWORK_TYPE_MUSIC); + DrawMainMenu(); + } + else if (is_string_suffix(cheat_input, ":reload-artwork") || + is_string_suffix(cheat_input, ":ra")) + { + ReloadCustomArtwork(1 << ARTWORK_TYPE_GRAPHICS | + 1 << ARTWORK_TYPE_SOUNDS | + 1 << ARTWORK_TYPE_MUSIC); + DrawMainMenu(); + } + else if (is_string_suffix(cheat_input, ":dump-level") || + is_string_suffix(cheat_input, ":dl")) + { + DumpLevel(&level); + } + else if (is_string_suffix(cheat_input, ":dump-tape") || + is_string_suffix(cheat_input, ":dt")) + { + DumpTape(&tape); + } + } + else if (game_status == GAME_MODE_PLAYING) + { +#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; +#endif + } + else if (game_status == GAME_MODE_EDITOR) + { + if (is_string_suffix(cheat_input, ":dump-brush") || + is_string_suffix(cheat_input, ":DB")) + { + DumpBrush(); + } + else if (is_string_suffix(cheat_input, ":DDB")) + { + DumpBrush_Small(); + } + } +} + void HandleKey(Key key, int key_status) { int joy = 0; @@ -460,17 +581,17 @@ void HandleKey(Key key, int key_status) { &custom_key.up, DEFAULT_KEY_UP, JOY_UP }, { &custom_key.down, DEFAULT_KEY_DOWN, JOY_DOWN }, { &custom_key.snap, DEFAULT_KEY_SNAP, JOY_BUTTON_1 }, - { &custom_key.bomb, DEFAULT_KEY_BOMB, JOY_BUTTON_2 } + { &custom_key.drop, DEFAULT_KEY_DROP, JOY_BUTTON_2 } }; if (game_status == GAME_MODE_PLAYING) { /* only needed for single-step tape recording mode */ static boolean clear_button_2[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; - static boolean bomb_placed[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; + static boolean element_dropped[MAX_PLAYERS] = { FALSE,FALSE,FALSE,FALSE }; int pnr; - for (pnr=0; pnrdynamite = 1000; + case KSYM_v: + printf("::: currently using game engine version %d\n", + game.engine_version); break; - - - -#if 0 - - case KSYM_z: - { - int i; - - for(i=0; i