rnd-20020401-3-src
authorHolger Schemel <info@artsoft.org>
Mon, 1 Apr 2002 20:22:46 +0000 (22:22 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:36:43 +0000 (10:36 +0200)
15 files changed:
src/Makefile
src/config.c [new file with mode: 0644]
src/config.h [new file with mode: 0644]
src/events.c
src/files.c
src/init.c
src/libgame/misc.c
src/libgame/misc.h
src/libgame/setup.c
src/libgame/setup.h
src/libgame/system.h
src/main.h
src/screens.c
src/screens.h
src/timestamp.h [new file with mode: 0644]

index 5b8f1366c4a6ea44dc438636a6c26f1c60c243c7..4d26807e7f831fa3efc4eb707af0bffd5b281ca9 100644 (file)
@@ -118,6 +118,7 @@ LDFLAGS = $(SYS_LDFLAGS) $(EXTRA_LDFLAGS) -lm
 
 SRCS = main.c          \
        init.c          \
+       config.c        \
        events.c        \
        tools.c         \
        screens.c       \
@@ -131,6 +132,7 @@ SRCS =      main.c          \
 
 OBJS = main.o          \
        init.o          \
+       config.o        \
        events.o        \
        tools.o         \
        screens.o       \
@@ -142,6 +144,8 @@ OBJS =      main.o          \
        network.o       \
        netserv.o
 
+TIMESTAMP_FILE = timestamp.h
+
 LIBDIR = libgame
 LIBGAME = $(LIBDIR)/libgame.a
 
@@ -162,6 +166,11 @@ libgame_dir:
 $(LIBGAME):
        @$(MAKE) -C $(LIBDIR)
 
+$(TIMESTAMP_FILE): $(SRCS)
+       @date '+"[%Y-%m-%d %H:%M]"' \
+       | sed -e 's/^/#define COMPILE_DATE_STRING /' \
+       > $(TIMESTAMP_FILE)
+
 $(ICON):
        $(BMP2ICO) -transparent $(ICONBASE).ico $(ICON32X32)
        echo "$(ICONBASE) ICON $(ICONBASE).ico" | $(WINDRES) -o $(ICON)
diff --git a/src/config.c b/src/config.c
new file mode 100644 (file)
index 0000000..9c6ff21
--- /dev/null
@@ -0,0 +1,30 @@
+/***********************************************************
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
+*----------------------------------------------------------*
+* (c) 1995-2002 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
+*----------------------------------------------------------*
+* config.c                                                 *
+***********************************************************/
+
+#include "libgame/libgame.h"
+
+#include "config.h"
+#include "timestamp.h"
+
+/* use timestamp created at compile-time */
+#define PROGRAM_BUILD_STRING   PROGRAM_IDENT_STRING " " COMPILE_DATE_STRING
+#ifdef DEBUG
+#undef WINDOW_TITLE_STRING
+#define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_BUILD_STRING
+#endif
+
+
+char *getWindowTitleString()
+{
+  return WINDOW_TITLE_STRING;
+}
diff --git a/src/config.h b/src/config.h
new file mode 100644 (file)
index 0000000..d9e5d94
--- /dev/null
@@ -0,0 +1,21 @@
+/***********************************************************
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
+*----------------------------------------------------------*
+* (c) 1995-2002 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
+*----------------------------------------------------------*
+* config.h                                                 *
+***********************************************************/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "main.h"
+
+char *getWindowTitleString(void);
+
+#endif /* CONFIG_H */
index c497116ed6adb55b420a9718af18abd0be2e9820..c002c78ebbd6588dafeb1e64a90da9f801ba67ae 100644 (file)
@@ -489,9 +489,9 @@ void HandleKey(Key key, int key_status)
   /* special shortcuts for quick game tape saving and loading */
   if (game_status == MAINMENU || game_status == PLAYING)
   {
-    if (key == KSYM_F1)                /* save game */
+    if (key == setup.shortcut.save_game)
       TapeQuickSave();
-    else if (key == KSYM_F2)   /* load game */
+    else if (key == setup.shortcut.load_game)
       TapeQuickLoad();
   }
 
index d5ad588bc7c111607d88aafaf6182284efa16caf..5da89a735d83216a0e8d023ec966ecaa29204d3b 100644 (file)
@@ -1183,6 +1183,12 @@ void SaveScore(int level_nr)
 
 #define NUM_GLOBAL_SETUP_TOKENS                15
 
+/* shortcut setup */
+#define SETUP_TOKEN_SAVE_GAME          0
+#define SETUP_TOKEN_LOAD_GAME          1
+
+#define NUM_SHORTCUT_SETUP_TOKENS      2
+
 /* player setup */
 #define SETUP_TOKEN_USE_JOYSTICK       0
 #define SETUP_TOKEN_JOY_DEVICE_NAME    1
@@ -1204,26 +1210,34 @@ void SaveScore(int level_nr)
 #define NUM_PLAYER_SETUP_TOKENS                16
 
 static struct SetupInfo si;
+static struct SetupShortcutInfo ssi;
 static struct SetupInputInfo sii;
 
 static struct TokenInfo global_setup_tokens[] =
 {
   /* global setup */
-  { TYPE_STRING,  &si.player_name,     "player_name"                   },
-  { TYPE_SWITCH,  &si.sound,           "sound"                         },
-  { TYPE_SWITCH,  &si.sound_loops,     "repeating_sound_loops"         },
-  { TYPE_SWITCH,  &si.sound_music,     "background_music"              },
-  { TYPE_SWITCH,  &si.sound_simple,    "simple_sound_effects"          },
-  { TYPE_SWITCH,  &si.toons,           "toons"                         },
-  { TYPE_SWITCH,  &si.scroll_delay,    "scroll_delay"                  },
-  { TYPE_SWITCH,  &si.soft_scrolling,  "soft_scrolling"                },
-  { TYPE_SWITCH,  &si.fading,          "screen_fading"                 },
-  { TYPE_SWITCH,  &si.autorecord,      "automatic_tape_recording"      },
-  { TYPE_SWITCH,  &si.quick_doors,     "quick_doors"                   },
-  { TYPE_SWITCH,  &si.team_mode,       "team_mode"                     },
-  { TYPE_SWITCH,  &si.handicap,                "handicap"                      },
-  { TYPE_SWITCH,  &si.time_limit,      "time_limit"                    },
-  { TYPE_SWITCH,  &si.fullscreen,      "fullscreen"                    }
+  { TYPE_STRING, &si.player_name,      "player_name"                   },
+  { TYPE_SWITCH, &si.sound,            "sound"                         },
+  { TYPE_SWITCH, &si.sound_loops,      "repeating_sound_loops"         },
+  { TYPE_SWITCH, &si.sound_music,      "background_music"              },
+  { TYPE_SWITCH, &si.sound_simple,     "simple_sound_effects"          },
+  { TYPE_SWITCH, &si.toons,            "toons"                         },
+  { TYPE_SWITCH, &si.scroll_delay,     "scroll_delay"                  },
+  { TYPE_SWITCH, &si.soft_scrolling,   "soft_scrolling"                },
+  { TYPE_SWITCH, &si.fading,           "screen_fading"                 },
+  { TYPE_SWITCH, &si.autorecord,       "automatic_tape_recording"      },
+  { TYPE_SWITCH, &si.quick_doors,      "quick_doors"                   },
+  { TYPE_SWITCH, &si.team_mode,                "team_mode"                     },
+  { TYPE_SWITCH, &si.handicap,         "handicap"                      },
+  { TYPE_SWITCH, &si.time_limit,       "time_limit"                    },
+  { TYPE_SWITCH, &si.fullscreen,       "fullscreen"                    }
+};
+
+static struct TokenInfo shortcut_setup_tokens[] =
+{
+  /* shortcut setup */
+  { TYPE_KEY_X11, &ssi.save_game,              "shortcut.save_game"    },
+  { TYPE_KEY_X11, &ssi.load_game,              "shortcut.load_game"    }
 };
 
 static struct TokenInfo player_setup_tokens[] =
@@ -1239,12 +1253,12 @@ static struct TokenInfo player_setup_tokens[] =
   { TYPE_INTEGER, &sii.joy.ylower,     ".joy.ylower"                   },
   { TYPE_INTEGER, &sii.joy.snap,       ".joy.snap_field"               },
   { TYPE_INTEGER, &sii.joy.bomb,       ".joy.place_bomb"               },
-  { TYPE_KEY,     &sii.key.left,       ".key.move_left"                },
-  { TYPE_KEY,     &sii.key.right,      ".key.move_right"               },
-  { TYPE_KEY,     &sii.key.up,         ".key.move_up"                  },
-  { TYPE_KEY,     &sii.key.down,       ".key.move_down"                },
-  { TYPE_KEY,     &sii.key.snap,       ".key.snap_field"               },
-  { TYPE_KEY,     &sii.key.bomb,       ".key.place_bomb"               }
+  { TYPE_KEY_X11, &sii.key.left,       ".key.move_left"                },
+  { TYPE_KEY_X11, &sii.key.right,      ".key.move_right"               },
+  { TYPE_KEY_X11, &sii.key.up,         ".key.move_up"                  },
+  { TYPE_KEY_X11, &sii.key.down,       ".key.move_down"                },
+  { TYPE_KEY_X11, &sii.key.snap,       ".key.snap_field"               },
+  { TYPE_KEY_X11, &sii.key.bomb,       ".key.place_bomb"               }
 };
 
 static void setSetupInfoToDefaults(struct SetupInfo *si)
@@ -1270,6 +1284,9 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->time_limit = TRUE;
   si->fullscreen = FALSE;
 
+  si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME;
+  si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME;
+
   for (i=0; i<MAX_PLAYERS; i++)
   {
     si->input[i].use_joystick = FALSE;
@@ -1298,14 +1315,21 @@ static void decodeSetupFileList(struct SetupFileList *setup_file_list)
   if (!setup_file_list)
     return;
 
-  /* handle global setup values */
+  /* global setup */
   si = setup;
   for (i=0; i<NUM_GLOBAL_SETUP_TOKENS; i++)
     setSetupInfo(global_setup_tokens, i,
                 getTokenValue(setup_file_list, global_setup_tokens[i].text));
   setup = si;
 
-  /* handle player specific setup values */
+  /* shortcut setup */
+  ssi = setup.shortcut;
+  for (i=0; i<NUM_SHORTCUT_SETUP_TOKENS; i++)
+    setSetupInfo(shortcut_setup_tokens, i,
+                getTokenValue(setup_file_list,shortcut_setup_tokens[i].text));
+  setup.shortcut = ssi;
+
+  /* player setup */
   for (pnr=0; pnr<MAX_PLAYERS; pnr++)
   {
     char prefix[30];
@@ -1378,7 +1402,7 @@ void SaveSetup()
                                               getCookie("SETUP")));
   fprintf(file, "\n");
 
-  /* handle global setup values */
+  /* global setup */
   si = setup;
   for (i=0; i<NUM_GLOBAL_SETUP_TOKENS; i++)
   {
@@ -1389,7 +1413,13 @@ void SaveSetup()
       fprintf(file, "\n");
   }
 
-  /* handle player specific setup values */
+  /* shortcut setup */
+  ssi = setup.shortcut;
+  fprintf(file, "\n");
+  for (i=0; i<NUM_SHORTCUT_SETUP_TOKENS; i++)
+    fprintf(file, "%s\n", getSetupLine(shortcut_setup_tokens, "", i));
+
+  /* player setup */
   for (pnr=0; pnr<MAX_PLAYERS; pnr++)
   {
     char prefix[30];
index f4a7f1aec7ed0cf9df4c4c3482a81c48c79c2714..e03d2ae2aa4bcbe15fa6d34f733df304ab19e9a1 100644 (file)
@@ -24,6 +24,7 @@
 #include "network.h"
 #include "netserv.h"
 #include "cartoons.h"
+#include "config.h"
 
 static char *image_filename[NUM_PICTURES] =
 {
@@ -62,7 +63,7 @@ void OpenAll(void)
   }
 
   InitProgramInfo(UNIX_USERDATA_DIRECTORY,
-                 PROGRAM_TITLE_STRING, WINDOW_TITLE_STRING,
+                 PROGRAM_TITLE_STRING, getWindowTitleString(),
                  ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME,
                  MSDOS_POINTER_FILENAME,
                  COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL);
index b0244aa627ff6de461e6d99b72a2f43905bba53f..6992ff230bdda9b61150c91bcc9a39252832aab8 100644 (file)
@@ -818,7 +818,8 @@ void WriteUnusedBytesToFile(FILE *file, unsigned long bytes)
 
 #define TRANSLATE_KEYSYM_TO_KEYNAME    0
 #define TRANSLATE_KEYSYM_TO_X11KEYNAME 1
-#define TRANSLATE_X11KEYNAME_TO_KEYSYM 2
+#define TRANSLATE_KEYNAME_TO_KEYSYM    2
+#define TRANSLATE_X11KEYNAME_TO_KEYSYM 3
 
 void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
 {
@@ -1005,6 +1006,26 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
 
     *x11name = name_buffer;
   }
+  else if (mode == TRANSLATE_KEYNAME_TO_KEYSYM)
+  {
+    Key key = KSYM_UNDEFINED;
+
+    i = 0;
+    do
+    {
+      if (strcmp(translate_key[i].name, *name) == 0)
+      {
+       key = translate_key[i].key;
+       break;
+      }
+    }
+    while (translate_key[++i].x11name);
+
+    if (key == KSYM_UNDEFINED)
+      Error(ERR_WARN, "getKeyFromKeyName(): not completely implemented");
+
+    *keysym = key;
+  }
   else if (mode == TRANSLATE_X11KEYNAME_TO_KEYSYM)
   {
     Key key = KSYM_UNDEFINED;
@@ -1106,6 +1127,14 @@ char *getX11KeyNameFromKey(Key key)
   return x11name;
 }
 
+Key getKeyFromKeyName(char *name)
+{
+  Key key;
+
+  translate_keyname(&key, NULL, &name, TRANSLATE_KEYNAME_TO_KEYSYM);
+  return key;
+}
+
 Key getKeyFromX11KeyName(char *x11name)
 {
   Key key;
index fbfc902381fbcbd0486026acd76d81ad705f8f8f..6d8f0666863f8afc07ad01d96e3ef832c24bc444 100644 (file)
@@ -94,6 +94,7 @@ void WriteUnusedBytesToFile(FILE *, unsigned long);
 
 char *getKeyNameFromKey(Key);
 char *getX11KeyNameFromKey(Key);
+Key getKeyFromKeyName(char *);
 Key getKeyFromX11KeyName(char *);
 char getCharFromKey(Key);
 
index 240fe67f928bd47524ae85afcc7a3113a5598752..9d4aed61fe943256cec6a1686b2f29490a038826 100644 (file)
@@ -1102,6 +1102,10 @@ void setSetupInfo(struct TokenInfo *token_info,
       break;
 
     case TYPE_KEY:
+      *(Key *)setup_value = getKeyFromKeyName(token_value);
+      break;
+
+    case TYPE_KEY_X11:
       *(Key *)setup_value = getKeyFromX11KeyName(token_value);
       break;
 
@@ -1403,6 +1407,10 @@ char *getSetupValue(int type, void *value)
       break;
 
     case TYPE_KEY:
+      strcpy(value_string, getKeyNameFromKey(*(Key *)value));
+      break;
+
+    case TYPE_KEY_X11:
       strcpy(value_string, getX11KeyNameFromKey(*(Key *)value));
       break;
 
@@ -1439,7 +1447,7 @@ char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr)
   /* continue with the token's value (which can have different types) */
   strcat(entry, value_string);
 
-  if (token_type == TYPE_KEY)
+  if (token_type == TYPE_KEY_X11)
   {
     Key key = *(Key *)setup_value;
     char *keyname = getKeyNameFromKey(key);
index a644642021f9ccf075ca73af4f347490143a9b83..e0372617ecb76cb57930cc8feaa8847bbb1c1535 100644 (file)
 #define TYPE_SWITCH                    (1 << 1)
 #define TYPE_YES_NO                    (1 << 2)
 #define TYPE_KEY                       (1 << 3)
-#define TYPE_INTEGER                   (1 << 4)
-#define TYPE_STRING                    (1 << 5)
+#define TYPE_KEY_X11                   (1 << 4)
+#define TYPE_INTEGER                   (1 << 5)
+#define TYPE_STRING                    (1 << 6)
 
 #define TYPE_BOOLEAN_STYLE             (TYPE_BOOLEAN | \
                                         TYPE_SWITCH  | \
                                         TYPE_YES_NO)
 
 /* additional values for setup screen */
-#define TYPE_ENTER_MENU                        (1 << 6)
-#define TYPE_LEAVE_MENU                        (1 << 7)
-#define TYPE_EMPTY                     (1 << 8)
-#define TYPE_GHOSTED                   (1 << 9)
+#define TYPE_ENTER_MENU                        (1 << 7)
+#define TYPE_LEAVE_MENU                        (1 << 8)
+#define TYPE_EMPTY                     (1 << 9)
+#define TYPE_KEYTEXT                   (1 << 10)
 
-#define TYPE_ENTER_OR_LEAVE_MENU       (TYPE_ENTER_MENU | TYPE_LEAVE_MENU)
+#define TYPE_GHOSTED                   (1 << 11)
+#define TYPE_QUERY                     (1 << 12)
+
+#define TYPE_VALUE                     (TYPE_BOOLEAN_STYLE | \
+                                        TYPE_KEY | \
+                                        TYPE_KEY_X11 | \
+                                        TYPE_INTEGER | \
+                                        TYPE_STRING)
+
+#define TYPE_SKIP_ENTRY                        (TYPE_EMPTY | \
+                                        TYPE_KEY)
+
+#define TYPE_ENTER_OR_LEAVE_MENU       (TYPE_ENTER_MENU | \
+                                        TYPE_LEAVE_MENU)
 
 /* cookie token for file identifier and version number */
 #define TOKEN_STR_FILE_IDENTIFIER      "file_identifier"
index 1416f231739ebf3fa9aad5f505f654b3d868dc3a..801fb44bdbe31a55e9fce93a4cdd8fc10fcc9294 100644 (file)
 #define DEFAULT_KEY_OKAY       KSYM_Return
 #define DEFAULT_KEY_CANCEL     KSYM_Escape
 
+/* default shortcut keys */
+#define DEFAULT_KEY_SAVE_GAME  KSYM_F1
+#define DEFAULT_KEY_LOAD_GAME  KSYM_F2
+
 /* values for move directions */
 #define MV_NO_MOVING           0
 #define MV_LEFT                        (1 << 0)
@@ -283,6 +287,12 @@ struct SetupInputInfo
   struct SetupKeyboardInfo key;
 };
 
+struct SetupShortcutInfo
+{
+  Key save_game;
+  Key load_game;
+};
+
 struct SetupInfo
 {
   char *player_name;
@@ -304,6 +314,7 @@ struct SetupInfo
   boolean time_limit;
   boolean fullscreen;
 
+  struct SetupShortcutInfo shortcut;
   struct SetupInputInfo input[MAX_PLAYERS];
 };
 
index 416ba9f2308c21090ca24b846c25fa8eb3868fc4..42eeba637cf089862a856f9a57e48432252fde74 100644 (file)
@@ -1455,19 +1455,12 @@ extern int              num_element_info;
 #define PROGRAM_VERSION_PATCH  2
 #define PROGRAM_VERSION_STRING "2.0.2"
 
-#define PROGRAM_DATE_STRING    "[2002-04-01 01:11]"
-
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
 #define PROGRAM_RIGHTS_STRING  "Copyright ^1995-2002 by"
 #define PROGRAM_DOS_PORT_STRING        "DOS port done by Guido Schulz"
 #define PROGRAM_IDENT_STRING   PROGRAM_VERSION_STRING " " TARGET_STRING
-#define PROGRAM_BUILD_STRING   PROGRAM_IDENT_STRING " " PROGRAM_DATE_STRING
-#ifdef DEBUG
-#define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_BUILD_STRING
-#else
 #define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING
-#endif
 #define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
 #define ICON_TITLE_STRING      PROGRAM_TITLE_STRING
 #define UNIX_USERDATA_DIRECTORY        ".rocksndiamonds"
index b9b7c5dde86630c7858ad9338821c368b830fa09..9310b5f1ddb0ae89f91a9728b30b7fcbdf9ceb94 100644 (file)
 /* screens in the setup menu */
 #define SETUP_MODE_MAIN                        0
 #define SETUP_MODE_INPUT               1
-#define SETUP_MODE_GRAPHICS            2
-#define SETUP_MODE_SOUND               3
+#define SETUP_MODE_SHORTCUT            2
+#define SETUP_MODE_GRAPHICS            3
+#define SETUP_MODE_SOUND               4
 
-#define MAX_SETUP_MODES                        4
+#define MAX_SETUP_MODES                        5
 
-/* for HandleSetupInputScreen() */
+/* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
 #define SETUPINPUT_SCREEN_POS_END      (SCR_FIELDY - 4)
 #define SETUPINPUT_SCREEN_POS_EMPTY1   (SETUPINPUT_SCREEN_POS_START + 3)
 #define SETUPINPUT_SCREEN_POS_EMPTY2   (SETUPINPUT_SCREEN_POS_END - 1)
 
-/* for HandleChooseLevel() */
+/* for various menu stuff  */
 #define MAX_MENU_ENTRIES_ON_SCREEN     (SCR_FIELDY - 2)
 #define MENU_SCREEN_START_YPOS         2
 #define MENU_SCREEN_VALUE_XPOS         14
 #define NUM_SCREEN_SCROLLBARS          1
 #define NUM_SCREEN_GADGETS             3
 
-/* forward declaration for internal use */
+/* forward declarations of internal functions */
 static void HandleScreenGadgets(struct GadgetInfo *);
+static void HandleSetupScreen_Generic(int, int, int, int, int);
+static void HandleSetupScreen_Input(int, int, int, int, int);
+static void CustomizeKeyboard(int);
+static void CalibrateJoystick(int);
 
 static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 
@@ -1323,6 +1328,12 @@ static void execSetupInput()
   DrawSetupScreen();
 }
 
+static void execSetupShortcut()
+{
+  setup_mode = SETUP_MODE_SHORTCUT;
+  DrawSetupScreen();
+}
+
 static void execExitSetup()
 {
   game_status = MAINMENU;
@@ -1339,8 +1350,9 @@ static struct TokenInfo setup_info_main[] =
 {
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound Setup"   },
   { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices" },
-  { TYPE_EMPTY,                NULL,                   ""              },
+  { TYPE_ENTER_MENU,   execSetupShortcut,      "Key Shortcuts" },
 #if 0
+  { TYPE_EMPTY,                NULL,                   ""              },
   { TYPE_SWITCH,       &setup.sound,           "Sound:",       },
   { TYPE_SWITCH,       &setup.sound_loops,     " Sound Loops:" },
   { TYPE_SWITCH,       &setup.sound_music,     " Game Music:"  },
@@ -1378,6 +1390,64 @@ static struct TokenInfo setup_info_sound[] =
   { 0,                 NULL,                   NULL            }
 };
 
+static struct TokenInfo setup_info_shortcut[] =
+{
+  { TYPE_KEYTEXT,      NULL,                   "Quick Save Game:",     },
+  { TYPE_KEY,          &setup.shortcut.save_game,      ""              },
+  { TYPE_KEYTEXT,      NULL,                   "Quick Load Game:",     },
+  { TYPE_KEY,          &setup.shortcut.load_game,      ""              },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Exit"                  },
+  { 0,                 NULL,                   NULL                    }
+};
+
+static Key getSetupKey()
+{
+  Key key = KSYM_UNDEFINED;
+  boolean got_key_event = FALSE;
+
+  while (!got_key_event)
+  {
+    if (PendingEvent())                /* got event */
+    {
+      Event event;
+
+      NextEvent(&event);
+
+      switch(event.type)
+      {
+        case EVENT_KEYPRESS:
+         {
+           key = GetEventKey((KeyEvent *)&event, TRUE);
+
+           /* press 'Escape' or 'Enter' to keep the existing key binding */
+           if (key == KSYM_Escape || key == KSYM_Return)
+             key = KSYM_UNDEFINED;     /* keep old value */
+
+           got_key_event = TRUE;
+         }
+         break;
+
+        case EVENT_KEYRELEASE:
+         key_joystick_mapping = 0;
+         break;
+
+        default:
+         HandleOtherEvents(&event);
+         break;
+      }
+    }
+
+    BackToFront();
+    DoAnimation();
+
+    /* don't eat all CPU time */
+    Delay(10);
+  }
+
+  return key;
+}
+
 static void drawSetupValue(int pos)
 {
   int xpos = MENU_SCREEN_VALUE_XPOS;
@@ -1386,23 +1456,49 @@ static void drawSetupValue(int pos)
   char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED,
                                     setup_info[pos].value);
 
-  if (setup_info[pos].type & TYPE_SWITCH ||
-      setup_info[pos].type & TYPE_YES_NO)
+  if (setup_info[pos].type & TYPE_KEY)
   {
-    boolean value = *(boolean *)(setup_info[pos].value);
-    int value_length = 3;
-
-    if (!value)
-      value_color = FC_BLUE;
+    xpos = 3;
 
-    if (strlen(value_string) < value_length)
-      strcat(value_string, " ");
+    if (setup_info[pos].type & TYPE_QUERY)
+    {
+      value_string = "<press key>";
+      value_color = FC_RED;
+    }
   }
 
+  if (setup_info[pos].type & TYPE_BOOLEAN_STYLE &&
+      !*(boolean *)(setup_info[pos].value))
+    value_color = FC_BLUE;
+
+  DrawText(SX + xpos * 32, SY + ypos * 32,
+          (xpos == 3 ? "              " : "   "), FS_BIG, FC_YELLOW);
   DrawText(SX + xpos * 32, SY + ypos * 32, value_string, FS_BIG, value_color);
 }
 
-static void DrawGenericSetupScreen()
+static void changeSetupValue(int pos)
+{
+  if (setup_info[pos].type & TYPE_BOOLEAN_STYLE)
+  {
+    *(boolean *)setup_info[pos].value ^= TRUE;
+  }
+  else if (setup_info[pos].type & TYPE_KEY)
+  {
+    Key key;
+
+    setup_info[pos].type |= TYPE_QUERY;
+    drawSetupValue(pos);
+    setup_info[pos].type &= ~TYPE_QUERY;
+
+    key = getSetupKey();
+    if (key != KSYM_UNDEFINED)
+      *(Key *)setup_info[pos].value = key;
+  }
+
+  drawSetupValue(pos);
+}
+
+static void DrawSetupScreen_Generic()
 {
   char *title_string = NULL;
   int i;
@@ -1419,7 +1515,12 @@ static void DrawGenericSetupScreen()
   else if (setup_mode == SETUP_MODE_SOUND)
   {
     setup_info = setup_info_sound;
-    title_string = "Sound Setup";
+    title_string = "Setup Sound";
+  }
+  else if (setup_mode == SETUP_MODE_SHORTCUT)
+  {
+    setup_info = setup_info_shortcut;
+    title_string = "Setup Shortcuts";
   }
 
   DrawText(SX + 16, SY + 16, title_string, FS_BIG, FC_YELLOW);
@@ -1444,10 +1545,10 @@ static void DrawGenericSetupScreen()
       initCursor(i, GFX_ARROW_BLUE_RIGHT);
     else if (setup_info[i].type & TYPE_LEAVE_MENU)
       initCursor(i, GFX_ARROW_BLUE_LEFT);
-    else if (setup_info[i].type != TYPE_EMPTY)
+    else if (setup_info[i].type & ~TYPE_SKIP_ENTRY)
       initCursor(i, GFX_KUGEL_BLAU);
 
-    if (setup_info[i].type & TYPE_BOOLEAN_STYLE)
+    if (setup_info[i].type & TYPE_VALUE)
       drawSetupValue(i);
 
     num_setup_info++;
@@ -1455,10 +1556,10 @@ static void DrawGenericSetupScreen()
 
   FadeToFront();
   InitAnimation();
-  HandleSetupScreen(0,0,0,0,MB_MENU_INITIALIZE);
+  HandleSetupScreen_Generic(0,0,0,0,MB_MENU_INITIALIZE);
 }
 
-void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
+void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 {
   static int choice_store[MAX_SETUP_MODES];
   int choice = choice_store[setup_mode];
@@ -1479,7 +1580,7 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
        void (*menu_callback_function)(void) = setup_info[y].value;
 
        menu_callback_function();
-       break;  /* absolutely needed because 'setup_info' has changed! */
+       break;  /* absolutely needed because function changes 'setup_info'! */
       }
     }
 
@@ -1495,10 +1596,10 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
   {
     if (dx)
     {
-      int type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU);
+      int menu_navigation_type = (dx < 0 ? TYPE_LEAVE_MENU : TYPE_ENTER_MENU);
 
-      if (!(setup_info[choice].type & TYPE_ENTER_OR_LEAVE_MENU) ||
-         setup_info[choice].type == type)
+      if ((setup_info[choice].type & menu_navigation_type) ||
+         (setup_info[choice].type & TYPE_BOOLEAN_STYLE))
        button = MB_MENU_CHOICE;
     }
     else if (dy)
@@ -1506,12 +1607,12 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
 
     /* jump to next non-empty menu entry (up or down) */
     while (y > 0 && y < num_setup_info - 1 &&
-          setup_info[y].type == TYPE_EMPTY)
+          (setup_info[y].type & TYPE_SKIP_ENTRY))
       y += dy;
   }
 
   if (x == 0 && y >= 0 && y < num_setup_info &&
-      setup_info[y].type != TYPE_EMPTY)
+      (setup_info[y].type & ~TYPE_SKIP_ENTRY))
   {
     if (button)
     {
@@ -1524,6 +1625,7 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
     }
     else if (!(setup_info[y].type & TYPE_GHOSTED))
     {
+#if 0
       if (setup_info[y].type & TYPE_BOOLEAN_STYLE)
       {
        boolean new_value = !*(boolean *)(setup_info[y].value);
@@ -1531,12 +1633,34 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
        *(boolean *)setup_info[y].value = new_value;
        drawSetupValue(y);
       }
+      else if (setup_info[y].type == TYPE_KEYTEXT &&
+              setup_info[y + 1].type == TYPE_KEY)
+      {
+       changeSetupValue(y + 1);
+      }
       else if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
       {
        void (*menu_callback_function)(void) = setup_info[choice].value;
 
        menu_callback_function();
       }
+#else
+      if (setup_info[y].type & TYPE_ENTER_OR_LEAVE_MENU)
+      {
+       void (*menu_callback_function)(void) = setup_info[choice].value;
+
+       menu_callback_function();
+      }
+      else
+      {
+       if ((setup_info[y].type & TYPE_KEYTEXT) &&
+           (setup_info[y + 1].type & TYPE_KEY))
+         y++;
+
+       if (setup_info[y].type & TYPE_VALUE)
+         changeSetupValue(y);
+      }
+#endif
     }
   }
 
@@ -1546,10 +1670,10 @@ void HandleGenericSetupScreen(int mx, int my, int dx, int dy, int button)
     DoAnimation();
 }
 
-void DrawSetupInputScreen()
+void DrawSetupScreen_Input()
 {
   ClearWindow();
-  DrawText(SX+16, SY+16, "SETUP INPUT", FS_BIG, FC_YELLOW);
+  DrawText(SX+16, SY+16, "Setup Input", FS_BIG, FC_YELLOW);
 
   initCursor(0, GFX_KUGEL_BLAU);
   initCursor(1, GFX_KUGEL_BLAU);
@@ -1567,7 +1691,7 @@ void DrawSetupInputScreen()
   DrawTextFCentered(SYSIZE - 20, FC_BLUE,
                    "Joysticks deactivated on this screen");
 
-  HandleSetupInputScreen(0,0, 0,0, MB_MENU_INITIALIZE);
+  HandleSetupScreen_Input(0,0, 0,0, MB_MENU_INITIALIZE);
   FadeToFront();
   InitAnimation();
 }
@@ -1664,7 +1788,7 @@ static void drawPlayerSetupInputInfo(int player_nr)
   }
 }
 
-void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
+void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
 {
   static int choice = 0;
   static int player_nr = 0;
@@ -1785,22 +1909,6 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
     DoAnimation();
 }
 
-void DrawSetupScreen()
-{
-  if (setup_mode == SETUP_MODE_INPUT)
-    DrawSetupInputScreen();
-  else
-    DrawGenericSetupScreen();
-}
-
-void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
-{
-  if (setup_mode == SETUP_MODE_INPUT)
-    HandleSetupInputScreen(mx, my, dx, dy, button);
-  else
-    HandleGenericSetupScreen(mx, my, dx, dy, button);
-}
-
 void CustomizeKeyboard(int player_nr)
 {
   int i;
@@ -1928,7 +2036,7 @@ void CustomizeKeyboard(int player_nr)
   setup.input[player_nr].key = custom_key;
 
   StopAnimation();
-  DrawSetupInputScreen();
+  DrawSetupScreen_Input();
 }
 
 static boolean CalibrateJoystickMain(int player_nr)
@@ -2096,7 +2204,7 @@ static boolean CalibrateJoystickMain(int player_nr)
 
   StopAnimation();
 
-  DrawSetupInputScreen();
+  DrawSetupScreen_Input();
 
   /* wait until the last pressed button was released */
   while (Joystick(player_nr) & JOY_BUTTON)
@@ -2128,6 +2236,22 @@ void CalibrateJoystick(int player_nr)
   }
 }
 
+void DrawSetupScreen()
+{
+  if (setup_mode == SETUP_MODE_INPUT)
+    DrawSetupScreen_Input();
+  else
+    DrawSetupScreen_Generic();
+}
+
+void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
+{
+  if (setup_mode == SETUP_MODE_INPUT)
+    HandleSetupScreen_Input(mx, my, dx, dy, button);
+  else
+    HandleSetupScreen_Generic(mx, my, dx, dy, button);
+}
+
 void HandleGameActions()
 {
   if (game_status != PLAYING)
index 68567082cb1676f50c079cb4b2a18be55ac737c0..bf0702b4245cea18d50b2b92a666e182cdefc6ec 100644 (file)
 #include "main.h"
 
 void DrawHeadline(void);
+
 void DrawMainMenu(void);
 void HandleMainMenu(int, int, int, int, int);
+
 void DrawHelpScreenElAction(int);
 void DrawHelpScreenElText(int);
 void DrawHelpScreenMusicText(int);
 void DrawHelpScreenCreditsText(void);
 void DrawHelpScreen(void);
 void HandleHelpScreen(int);
+
 void HandleTypeName(int, Key);
+
 void DrawChooseLevel(void);
 void HandleChooseLevel(int, int, int, int, int);
+
 void DrawHallOfFame(int);
 void HandleHallOfFame(int, int, int, int, int);
+
 void DrawSetupScreen(void);
 void HandleSetupScreen(int, int, int, int, int);
-void DrawSetupInputScreen(void);
-void HandleSetupInputScreen(int, int, int, int, int);
-void CustomizeKeyboard(int);
-void CalibrateJoystick(int);
+
 void HandleGameActions(void);
 
 void CreateScreenGadgets();
diff --git a/src/timestamp.h b/src/timestamp.h
new file mode 100644 (file)
index 0000000..ecb53d5
--- /dev/null
@@ -0,0 +1 @@
+#define COMPILE_DATE_STRING "[2002-04-01 20:50]"