X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=31d45abff4cc3946e05589270ad869d05765e3d4;hp=3b48fc01faf7634fb22812e986878d92b641d147;hb=ac173e23840c40f57ca10fc76e5267064faeda55;hpb=efb8505b9788bec1f1249535e7eac307bd18cea6 diff --git a/src/events.c b/src/events.c index 3b48fc01..31d45abf 100644 --- a/src/events.c +++ b/src/events.c @@ -268,12 +268,14 @@ void HandleOtherEvents(Event *event) HandleJoystickEvent(event); break; +#if defined(USE_DRAG_AND_DROP) case SDL_DROPBEGIN: case SDL_DROPCOMPLETE: case SDL_DROPFILE: case SDL_DROPTEXT: HandleDropEvent(event); break; +#endif default: break; @@ -1525,6 +1527,7 @@ void HandleClientMessageEvent(ClientMessageEvent *event) CloseAllAndExit(0); } +#if defined(USE_DRAG_AND_DROP) static boolean HandleDropFileEvent(char *filename) { Error(ERR_DEBUG, "DROP FILE EVENT: '%s'", filename); @@ -1537,6 +1540,7 @@ static boolean HandleDropFileEvent(char *filename) return FALSE; } + TreeInfo *tree_node = NULL; int tree_type = GetZipFileTreeType(filename); char *directory = TREE_USERDIR(tree_type); @@ -1547,6 +1551,23 @@ static boolean HandleDropFileEvent(char *filename) return FALSE; } + if (tree_type == TREE_TYPE_LEVEL_DIR && + game_status == GAME_MODE_LEVELS && + leveldir_current->node_parent != NULL) + { + // extract new level set next to currently selected level set + tree_node = leveldir_current; + + // get parent directory of currently selected level set directory + directory = getLevelDirFromTreeInfo(leveldir_current->node_parent); + + // use private level directory instead of top-level package level directory + if (strPrefix(directory, options.level_directory) && + strEqual(leveldir_current->node_parent->fullpath, ".")) + directory = getUserLevelDir(NULL); + } + + // extract level or artwork set from zip file to target directory char *top_dir = ExtractZipFileIntoDirectory(filename, directory, tree_type); if (top_dir == NULL) @@ -1556,26 +1577,11 @@ static boolean HandleDropFileEvent(char *filename) return FALSE; } - AddUserTreeSetToTreeInfo(top_dir, tree_type); - - // when adding new level set in main menu, select it as current level set - if (tree_type == TREE_TYPE_LEVEL_DIR && - game_status == GAME_MODE_MAIN && - !game.request_active) - { - // change current level set to newly added level set from zip file - leveldir_current = getTreeInfoFromIdentifier(leveldir_first, top_dir); - - // change current level number to first level of newly added level set - level_nr = leveldir_current->first_level; - - // redraw screen to reflect changed level set - DrawMainMenu(); + // add extracted level or artwork set to tree info structure + AddTreeSetToTreeInfo(tree_node, directory, top_dir, tree_type); - // save this level set and level number as last selected level set - SaveLevelSetup_LastSeries(); - SaveLevelSetup_SeriesInfo(); - } + // update menu screen (and possibly change current level set) + DrawScreenAfterAddingSet(top_dir, tree_type); return TRUE; } @@ -1640,6 +1646,7 @@ void HandleDropEvent(Event *event) if (event->drop.file != NULL) SDL_free(event->drop.file); } +#endif void HandleButton(int mx, int my, int button, int button_nr) { @@ -1931,13 +1938,13 @@ boolean HandleKeysDebug(Key key, int key_status) SetVideoFrameDelay(GameFrameDelay); if (GameFrameDelay > ONE_SECOND_DELAY) - Error(ERR_DEBUG, "frame delay == %d ms", GameFrameDelay); + Error(ERR_INFO, "frame delay == %d ms", GameFrameDelay); else if (GameFrameDelay != 0) - Error(ERR_DEBUG, "frame delay == %d ms (max. %d fps / %d %%)", + Error(ERR_INFO, "frame delay == %d ms (max. %d fps / %d %%)", GameFrameDelay, ONE_SECOND_DELAY / GameFrameDelay, GAME_FRAME_DELAY * 100 / GameFrameDelay); else - Error(ERR_DEBUG, "frame delay == 0 ms (maximum speed)"); + Error(ERR_INFO, "frame delay == 0 ms (maximum speed)"); return TRUE; } @@ -1950,14 +1957,14 @@ boolean HandleKeysDebug(Key key, int key_status) { options.debug = !options.debug; - Error(ERR_DEBUG, "debug mode %s", + Error(ERR_INFO, "debug mode %s", (options.debug ? "enabled" : "disabled")); return TRUE; } else if (key == KSYM_v) { - Error(ERR_DEBUG, "currently using game engine version %d", + Error(ERR_INFO, "currently using game engine version %d", game.engine_version); return TRUE; @@ -2012,6 +2019,7 @@ void HandleKey(Key key, int key_status) for (pnr = 0; pnr < MAX_PLAYERS; pnr++) { byte key_action = 0; + byte key_snap_action = 0; if (setup.input[pnr].use_joystick) continue; @@ -2027,15 +2035,33 @@ void HandleKey(Key key, int key_status) { ssi = setup.shortcut; + // also remember normal snap key when handling snap+direction keys + key_snap_action |= key_action & JOY_BUTTON_SNAP; + for (i = 0; i < NUM_DIRECTIONS; i++) + { if (key == *key_info[i].key_snap) - key_action |= key_info[i].action | JOY_BUTTON_SNAP; + { + key_action |= key_info[i].action | JOY_BUTTON_SNAP; + key_snap_action |= key_info[i].action; + } + } } if (key_status == KEY_PRESSED) - stored_player[pnr].action |= key_action; + { + stored_player[pnr].action |= key_action; + stored_player[pnr].snap_action |= key_snap_action; + } else - stored_player[pnr].action &= ~key_action; + { + stored_player[pnr].action &= ~key_action; + stored_player[pnr].snap_action &= ~key_snap_action; + } + + // restore snap action if one of several pressed snap keys was released + if (stored_player[pnr].snap_action) + stored_player[pnr].action |= JOY_BUTTON_SNAP; if (tape.single_step && tape.recording && tape.pausing && !tape.use_mouse) {