rnd-20050424-1-src
authorHolger Schemel <info@artsoft.org>
Sun, 24 Apr 2005 00:15:10 +0000 (02:15 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:48:56 +0000 (10:48 +0200)
* fixed a delay problem with SDL and too many mouse motion events
* added setup option "skip levels" and level skipping functionality

ChangeLog
src/conftime.h
src/events.c
src/files.c
src/game_em/sound.c
src/libgame/setup.c
src/libgame/system.c
src/libgame/system.h
src/screens.c

index 630b370a4e9c5ed37716be3f87e3e7efc4f0ff70..b373cd3d2f654486bd0a98a0cad2256d73b2758c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-04-24
+       * fixed a delay problem with SDL and too many mouse motion events
+       * added setup option "skip levels" and level skipping functionality
+
 2005-03-06
        * fixed mapping of obsolete element token names in "editorsetup.conf"
        * fixed bug with sound "acid.splashing" treated as a loop sound
index d364852ddd5960ec13e7f4a6da2f1d96fbf6e02c..d56a2b3cd8ab8965bbddac8cdf3e8fb939d02f48 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2005-04-12 00:03]"
+#define COMPILE_DATE_STRING "[2005-04-23 23:41]"
index 0852cd5529a5bd474a99cbf353adc39bd7d4449b..6b5ec687d3aa6ae1000a8e9da1130bedade0d244 100644 (file)
@@ -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,19 @@ static boolean NextValidEvent(Event *event)
 {
   while (PendingEvent())
   {
+    boolean handle_this_event = FALSE;
+
     NextEvent(event);
 
     if (FilterMouseMotionEvents(event))
+      handle_this_event = TRUE;
+
+#if 1
+    if (SkipPressedMouseMotionEvent(event))
+      handle_this_event = FALSE;
+#endif
+
+    if (handle_this_event)
       return TRUE;
   }
 
@@ -283,6 +322,11 @@ void HandleButtonEvent(ButtonEvent *event)
   else
     button_status = MB_RELEASED;
 
+#if 0
+  printf("::: button %s\n", event->type == EVENT_BUTTONPRESS ?
+       "pressed" : "released");
+#endif
+
   HandleButton(event->x, event->y, button_status);
 }
 
@@ -298,6 +342,10 @@ void HandleMotionEvent(MotionEvent *event)
 
   motion_status = TRUE;
 
+#if 0
+  printf("::: %d, %d\n", event->x, event->y);
+#endif
+
   HandleButton(event->x, event->y, button_status);
 }
 
index 7af744ca1b0452716a84491dbeada334e9a86d35..b1754033ec4d371828e6067a56e79ac23d753cc9 100644 (file)
@@ -4169,17 +4169,18 @@ void SaveScore(int nr)
 #define SETUP_TOKEN_QUICK_DOORS                        10
 #define SETUP_TOKEN_TEAM_MODE                  11
 #define SETUP_TOKEN_HANDICAP                   12
-#define SETUP_TOKEN_TIME_LIMIT                 13
-#define SETUP_TOKEN_FULLSCREEN                 14
-#define SETUP_TOKEN_ASK_ON_ESCAPE              15
-#define SETUP_TOKEN_GRAPHICS_SET               16
-#define SETUP_TOKEN_SOUNDS_SET                 17
-#define SETUP_TOKEN_MUSIC_SET                  18
-#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    19
-#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      20
-#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       21
-
-#define NUM_GLOBAL_SETUP_TOKENS                        22
+#define SETUP_TOKEN_SKIP_LEVELS                        13
+#define SETUP_TOKEN_TIME_LIMIT                 14
+#define SETUP_TOKEN_FULLSCREEN                 15
+#define SETUP_TOKEN_ASK_ON_ESCAPE              16
+#define SETUP_TOKEN_GRAPHICS_SET               17
+#define SETUP_TOKEN_SOUNDS_SET                 18
+#define SETUP_TOKEN_MUSIC_SET                  19
+#define SETUP_TOKEN_OVERRIDE_LEVEL_GRAPHICS    20
+#define SETUP_TOKEN_OVERRIDE_LEVEL_SOUNDS      21
+#define SETUP_TOKEN_OVERRIDE_LEVEL_MUSIC       22
+
+#define NUM_GLOBAL_SETUP_TOKENS                        23
 
 /* editor setup */
 #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH      0
@@ -4259,6 +4260,7 @@ static struct TokenInfo global_setup_tokens[] =
   { TYPE_SWITCH, &si.quick_doors,      "quick_doors"                   },
   { TYPE_SWITCH, &si.team_mode,                "team_mode"                     },
   { TYPE_SWITCH, &si.handicap,         "handicap"                      },
+  { TYPE_SWITCH, &si.skip_levels,      "skip_levels"                   },
   { TYPE_SWITCH, &si.time_limit,       "time_limit"                    },
   { TYPE_SWITCH, &si.fullscreen,       "fullscreen"                    },
   { TYPE_SWITCH, &si.ask_on_escape,    "ask_on_escape"                 },
@@ -4360,6 +4362,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->quick_doors = FALSE;
   si->team_mode = FALSE;
   si->handicap = TRUE;
+  si->skip_levels = TRUE;
   si->time_limit = TRUE;
   si->fullscreen = FALSE;
   si->ask_on_escape = TRUE;
index e230d9924f24349f51ab557d80100821a04814c3..9bdd2be8745c027f07aebe83b3694bd2b0bf7db9 100644 (file)
@@ -97,7 +97,9 @@ int sound_thread(void)
     {
 
       /* pick sounds to play, if any */
-      if (sound_play[SAMPLE_exit] || sound_play[SAMPLE_die])
+      if (sound_play[SAMPLE_exit_open] ||
+         sound_play[SAMPLE_exit_leave] ||
+         sound_play[SAMPLE_die])
        sound_play[SAMPLE_boom] = 0; /* no explosions if player goes home */
 
       mix_count = 0;
index 16cb1f0fbd88ad6667b9cd1aeedcce41a65e47f7..63ac0d59b3d67ede1f1027dfad61931a27142439 100644 (file)
@@ -150,7 +150,7 @@ static char *getLevelDirFromTreeInfo(TreeInfo *node)
 
   checked_free(level_dir);
 
-  level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) :
+  level_dir = getPath2((node->in_user_dir ? getUserLevelDir(NULL) :
                        options.level_directory), node->fullpath);
 
   return level_dir;
@@ -936,7 +936,7 @@ void dumpTreeInfo(TreeInfo *node, int depth)
 
 #if 1
     printf("subdir == '%s' ['%s', '%s'] [%d])\n",
-          node->subdir, node->fullpath, node->basepath, node->user_defined);
+          node->subdir, node->fullpath, node->basepath, node->in_user_dir);
 #else
     printf("subdir == '%s' (%s) [%s] (%d)\n",
           node->subdir, node->name, node->identifier, node->sort_priority);
@@ -1593,8 +1593,9 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash,
 #define LEVELINFO_TOKEN_FILENAME       15
 #define LEVELINFO_TOKEN_FILETYPE       16
 #define LEVELINFO_TOKEN_HANDICAP       17
+#define LEVELINFO_TOKEN_SKIP_LEVELS    18
 
-#define NUM_LEVELINFO_TOKENS           18
+#define NUM_LEVELINFO_TOKENS           19
 
 static LevelDirTree ldi;
 
@@ -1618,7 +1619,8 @@ static struct TokenInfo levelinfo_tokens[] =
   { TYPE_STRING,       &ldi.music_set,         "music_set"     },
   { TYPE_STRING,       &ldi.level_filename,    "filename"      },
   { TYPE_STRING,       &ldi.level_filetype,    "filetype"      },
-  { TYPE_BOOLEAN,      &ldi.handicap,          "handicap"      }
+  { TYPE_BOOLEAN,      &ldi.handicap,          "handicap"      },
+  { TYPE_BOOLEAN,      &ldi.skip_levels,       "skip_levels"   }
 };
 
 static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
@@ -1649,6 +1651,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   ldi->sort_priority = LEVELCLASS_UNDEFINED;   /* default: least priority */
   ldi->latest_engine = FALSE;                  /* default: get from level */
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = FALSE;
   ldi->user_defined = FALSE;
   ldi->color = 0;
   ldi->class_desc = NULL;
@@ -1675,6 +1678,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
     ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 }
 
@@ -1713,6 +1717,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->sort_priority = parent->sort_priority;
   ldi->latest_engine = parent->latest_engine;
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = parent->in_user_dir;
   ldi->user_defined = parent->user_defined;
   ldi->color = parent->color;
   ldi->class_desc = getStringCopy(parent->class_desc);
@@ -1739,6 +1744,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
     ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 
 #else
@@ -2012,13 +2018,16 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     leveldir_new->first_level + leveldir_new->levels - 1;
 
 #if 1
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (strcmp(leveldir_new->basepath, options.level_directory) != 0);
 #else
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (leveldir_new->basepath == options.level_directory ? FALSE : TRUE);
 #endif
 
+  leveldir_new->user_defined =
+    (leveldir_new->in_user_dir && IS_LEVELCLASS_PRIVATE(leveldir_new));
+
   leveldir_new->color = LEVELCOLOR(leveldir_new);
 #if 1
   setString(&leveldir_new->class_desc, getLevelClassDescription(leveldir_new));
@@ -2238,10 +2247,10 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   }
 
 #if 1
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (strcmp(artwork_new->basepath, OPTIONS_ARTWORK_DIRECTORY(type)) != 0);
 #else
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE);
 #endif
 
@@ -2814,7 +2823,7 @@ static void checkSeriesInfo()
 
   /* check for more levels besides the 'levels' field of 'levelinfo.conf' */
 
-  level_directory = getPath2((leveldir_current->user_defined ?
+  level_directory = getPath2((leveldir_current->in_user_dir ?
                              getUserLevelDir(NULL) :
                              options.level_directory),
                             leveldir_current->fullpath);
index ed73cb5bf3c5129092af6f764c38cd8f725ddd23..78fd020039b03ff13ba6895e349387b51c2b8133 100644 (file)
@@ -1143,6 +1143,15 @@ inline void NextEvent(Event *event)
 #endif
 }
 
+inline void PeekEvent(Event *event)
+{
+#if defined(TARGET_SDL)
+  SDL_PeepEvents(event, 1, SDL_PEEKEVENT, SDL_ALLEVENTS);
+#else
+  XPeekEvent(display, event);
+#endif
+}
+
 inline Key GetEventKey(KeyEvent *event, boolean with_modifiers)
 {
 #if defined(TARGET_SDL)
index 0183b0665e795b09c8cbb3c4677ac3ad86b046e2..903c982ca238b49f6cf10a2f86f2b1649450c743 100644 (file)
@@ -600,6 +600,7 @@ struct SetupInfo
   boolean quick_doors;
   boolean team_mode;
   boolean handicap;
+  boolean skip_levels;
   boolean time_limit;
   boolean fullscreen;
   boolean ask_on_escape;
@@ -661,9 +662,11 @@ struct TreeInfo
 
   boolean level_group; /* directory contains more level series directories */
   boolean parent_link; /* entry links back to parent directory */
-  boolean user_defined;        /* user defined levels are stored in home directory */
+  boolean in_user_dir; /* user defined levels are stored in home directory */
+  boolean user_defined;        /* levels in user directory and marked as "private" */
   boolean readonly;    /* readonly levels can not be changed with editor */
   boolean handicap;    /* level set has no handicap when set to "false" */
+  boolean skip_levels; /* levels can be skipped when set to "true" */
 
   int color;           /* color to use on selection screen for this level */
   char *class_desc;    /* description of level series class */
@@ -892,6 +895,7 @@ inline void SetAudioMode(boolean);
 inline void InitEventFilter(EventFilter);
 inline boolean PendingEvent(void);
 inline void NextEvent(Event *event);
+inline void PeekEvent(Event *event);
 inline Key GetEventKey(KeyEvent *, boolean);
 inline KeyMod HandleKeyModState(Key, int);
 inline KeyMod GetKeyModState();
index 26983cdb22c788c00c9e1534302f07bde8b7de69..10a7cd5791c52521b60d7b29c19a6a26673b590b 100644 (file)
@@ -417,8 +417,26 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
     if (new_level_nr > leveldir_current->last_level)
       new_level_nr = leveldir_current->last_level;
 
+#if 1
+    if (setup.handicap && new_level_nr > leveldir_current->handicap_level + 1)
+      new_level_nr = leveldir_current->handicap_level;
+
+    if (setup.handicap && new_level_nr > leveldir_current->handicap_level &&
+       leveldir_current->handicap_level < leveldir_current->last_level)
+    {
+      if (setup.skip_levels &&
+         Request("Level still unsolved ! Skip despite handicap ?", REQ_ASK))
+      {
+       leveldir_current->handicap_level++;
+       SaveLevelSetup_SeriesInfo();
+      }
+
+      new_level_nr = leveldir_current->handicap_level;
+    }
+#else
     if (setup.handicap && new_level_nr > leveldir_current->handicap_level)
       new_level_nr = leveldir_current->handicap_level;
+#endif
 
     if (new_level_nr != old_level_nr &&
        DelayReached(&level_delay, GADGET_FRAME_DELAY))
@@ -1948,6 +1966,7 @@ static struct TokenInfo setup_info_game[] =
 {
   { TYPE_SWITCH,       &setup.team_mode,       "Team-Mode:"            },
   { TYPE_SWITCH,       &setup.handicap,        "Handicap:"             },
+  { TYPE_SWITCH,       &setup.skip_levels,     "Skip Levels:"          },
   { TYPE_SWITCH,       &setup.time_limit,      "Timelimit:"            },
   { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record:"          },
   { TYPE_EMPTY,                NULL,                   ""                      },