rnd-19990201-1
authorHolger Schemel <info@artsoft.org>
Mon, 1 Feb 1999 02:23:00 +0000 (03:23 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:33:25 +0000 (10:33 +0200)
src/Makefile
src/buttons.c
src/editor.c
src/events.c
src/files.c
src/main.h
src/misc.c
src/msdos.c
src/msdos.h
src/tools.c

index 4c0a427baea5f9e3ab285213d2227e6449084447..3735291679c09be9eb9a0e84331b1bf06ec0b814 100644 (file)
@@ -69,9 +69,9 @@ CONFIG = $(CONFIG_GAME_DIR) $(SOUNDS) $(JOYSTICK)     \
         $(CONFIG_SCORE_ENTRIES) $(XPM_INCLUDE_FILE)
 
 # DEBUG = -DDEBUG -g -Wall -ansi -pedantic
-DEBUG = -DDEBUG -g -Wall
+DEBUG = -DDEBUG -g -Wall
 # DEBUG = -O3 -Wall -ansi -pedantic
-DEBUG = -O3 -Wall
+DEBUG = -O3 -Wall
 # DEBUG = -O3
 
 # SYSTEM = -Aa -D_HPUX_SOURCE -Dhpux   # for HP-UX (obsolete)
index 5fba665c84fc70e87d9ae1fc865540f6ffbc81f9..7c1e9c9a0ee99bf9a1c84d1ffb1a2fddbdf8dad7 100644 (file)
@@ -2297,7 +2297,7 @@ void HandleGadgets(int mx, int my, int button)
   static unsigned long pressed_delay = 0;
   static int last_button = 0;
   static int last_mx = 0, last_my = 0;
-  int scrollbar_mouse_pos;
+  int scrollbar_mouse_pos = 0;
   struct GadgetInfo *new_gi, *gi;
   boolean press_event;
   boolean release_event;
index 23f12d071424b82cc6c5ebf0ac9100ed114d9938..ab28fe0cf4d002a8d4760c7243992b925f634650 100644 (file)
@@ -2814,21 +2814,22 @@ static void FloodFill(int from_x, int from_y, int fill_element)
 }
 
 /* values for DrawLevelText() modes */
-#define TEXT_INIT      0
-#define TEXT_SETCURSOR 1
-#define TEXT_WRITECHAR 2
-#define TEXT_BACKSPACE 3
-#define TEXT_NEWLINE   4
-#define TEXT_END       5
+#define TEXT_INIT              0
+#define TEXT_SETCURSOR         1
+#define TEXT_WRITECHAR         2
+#define TEXT_BACKSPACE         3
+#define TEXT_NEWLINE           4
+#define TEXT_END               5
+#define TEXT_QUERY_TYPING      6
 
-static void DrawLevelText(int sx, int sy, char letter, int mode)
+static int DrawLevelText(int sx, int sy, char letter, int mode)
 {
   static short delete_buffer[MAX_LEV_FIELDX];
   static int start_sx, start_sy;
   static int last_sx, last_sy;
   static boolean typing = FALSE;
   int letter_element = EL_CHAR_ASCII0 + letter;
-  int lx, ly;
+  int lx = 0, ly = 0;
 
   /* map lower case letters to upper case and convert special characters */
   if (letter >= 'a' && letter <= 'z')
@@ -2847,7 +2848,7 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
   if (mode != TEXT_INIT)
   {
     if (!typing)
-      return;
+      return FALSE;
 
     if (mode != TEXT_SETCURSOR)
     {
@@ -2897,7 +2898,7 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
       if (sx > start_sx)
       {
        Feld[lx - 1][ly] = delete_buffer[sx - start_sx - 1];
-       DrawMiniElement(sx - 1, sy, new_element3);
+       DrawMiniElement(sx - 1, sy, Feld[lx - 1][ly]);
        DrawLevelText(sx - 1, sy, 0, TEXT_SETCURSOR);
       }
       break;
@@ -2915,9 +2916,14 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
       typing = FALSE;
       break;
 
+    case TEXT_QUERY_TYPING:
+      break;
+
     default:
       break;
   }
+
+  return typing;
 }
 
 static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy,
@@ -3069,7 +3075,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   int sx = gi->event.x, sy = gi->event.y;
   int min_sx = 0, min_sy = 0;
   int max_sx = gi->drawing.area_xsize - 1, max_sy = gi->drawing.area_ysize - 1;
-  int lx, ly;
+  int lx = 0, ly = 0;
   int min_lx = 0, min_ly = 0;
   int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
   int x, y;
@@ -3832,7 +3838,8 @@ void HandleLevelEditorKeyInput(KeySym key)
   char letter = getCharFromKeySym(key);
   int button = MB_LEFT;
 
-  if (drawing_function == GADGET_ID_TEXT)
+  if (drawing_function == GADGET_ID_TEXT &&
+      DrawLevelText(0, 0, 0, TEXT_QUERY_TYPING) == TRUE)
   {
     if (letter)
       DrawLevelText(0, 0, letter, TEXT_WRITECHAR);
index b5d3c18c4473bfdee23c1b4bbf70b19512eafa42..a336f013d3a5ae35140ad8095734aa216e643a58 100644 (file)
@@ -169,7 +169,7 @@ void SleepWhileUnmapped()
     }
   }
 
-  if (game_status==PLAYING)
+  if (game_status == PLAYING)
     XAutoRepeatOff(display);
 }
 
@@ -274,13 +274,36 @@ void HandleFocusEvent(XFocusChangeEvent *event)
 
   if (event->type == FocusOut)
   {
+    int i;
+
     XAutoRepeatOn(display);
     old_joystick_status = joystick_status;
     joystick_status = JOYSTICK_OFF;
+
+    /* simulate key release events for still pressed keys */
     key_joystick_mapping = 0;
+    for (i=0; i<MAX_PLAYERS; i++)
+      stored_player[i].action = 0;
   }
   else if (event->type == FocusIn)
   {
+    /* When there are two Rocks'n'Diamonds windows which overlap and
+       the player moves the pointer from one game window to the other,
+       a 'FocusOut' event is generated for the window the pointer is
+       leaving and a 'FocusIn' event is generated for the window the
+       pointer is entering. In some cases, it can happen that the
+       'FocusIn' event is handled by the one game process before the
+       'FocusOut' event by the other game process. In this case the
+       X11 environment would end up with activated keyboard auto repeat,
+       because unfortunately this is a global setting and not (which
+       would be far better) set for each X11 window individually.
+       The effect would be keyboard auto repeat while playing the game
+       (game_status == PLAYING), which is not desired.
+       To avoid this special case, we just wait 1/50 second before
+       processing the 'FocusIn' event.
+    */
+
+    Delay(20);
     if (game_status == PLAYING)
       XAutoRepeatOff(display);
     if (old_joystick_status != -1)
index 0c4a7f435ee6f230cd8a9a323303940d5142b1c9..71d01e945fd9f35c3d38ee7736d2e38e2f1d44a0 100644 (file)
@@ -1203,7 +1203,7 @@ static struct SetupFileList *loadSetupFileList(char *filename)
     /* cut trailing comment or whitespace from input line */
     for (line_ptr = line; *line_ptr; line_ptr++)
     {
-      if (*line_ptr == '#' || *line_ptr == '\n')
+      if (*line_ptr == '#' || *line_ptr == '\n' || *line_ptr == '\r')
       {
        *line_ptr = '\0';
        break;
index 8e5a427ce45b3014710ea987c46d4180ce8385c1..f25774b42b9632f72b1c7d1f1f4231f53e7e624c 100644 (file)
@@ -1273,7 +1273,7 @@ extern char               *element_info[];
 #define TAPES_DIRECTORY                "tapes"
 #define SCORES_DIRECTORY       "scores"
 
-#define PROGRAM_VERSION_STRING "1.2.1"
+#define PROGRAM_VERSION_STRING "1.3.0"
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
 #define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_VERSION_STRING
index 9aec199e92e8a442a56922fdcb7c080a14776317..fd85aeddac9e433635bff3586077c11e6fa5ad2f 100644 (file)
@@ -243,6 +243,7 @@ char *getLoginName()
 
 char *getRealName()
 {
+#ifndef MSDOS
   struct passwd *pwd;
 
   if ((pwd = getpwuid(getuid())) == NULL || strlen(pwd->pw_gecos) == 0)
@@ -272,6 +273,9 @@ char *getRealName()
 
     return real_name;
   }
+#else
+  return ANONYMOUS_NAME;
+#endif
 }
 
 char *getHomeDir()
index b64b9fab6ea36349c54a43f72d239d2409c1cad9..598aa5d2c5b3081c39b1cca2bd0514cacb96eb5d 100644 (file)
@@ -37,6 +37,7 @@ extern JOYSTICK_INFO joy[];
 extern int i_love_bill;
 
 /* internal variables of msdos.c */
+static boolean keyboard_auto_repeat = TRUE;
 static int key_press_state[MAX_SCANCODES];
 static XEvent event_buffer[MAX_EVENT_BUFFER];
 static int pending_events;
@@ -250,6 +251,42 @@ void XMapWindow(Display *display, Window window)
     unhide_mouse(display);
 }
 
+static unsigned long AllocColorCell(int r, int g, int b)
+{
+  byte pixel_mapping = 0;
+  int i;
+
+  r >>= 10;
+  g >>= 10;
+  b >>= 10;
+
+  /* try to use existing colors from the global colormap */
+  for (i=0; i<global_colormap_entries_used; i++)
+  {
+    if (r == global_colormap[i].r &&
+       g == global_colormap[i].g &&
+       b == global_colormap[i].b)              /* color found */
+    {
+      pixel_mapping = i;
+      break;
+    }
+  }
+
+  if (i == global_colormap_entries_used)       /* color not found */
+  {
+    if (global_colormap_entries_used < MAX_COLORS)
+      global_colormap_entries_used++;
+
+    global_colormap[i].r = r;
+    global_colormap[i].g = g;
+    global_colormap[i].b = b;
+
+    pixel_mapping = i;
+  }
+
+  return pixel_mapping;
+}
+
 Display *XOpenDisplay(char *display_name)
 {
   Screen *screen;
@@ -271,8 +308,13 @@ Display *XOpenDisplay(char *display_name)
 
   screen[0].cmap = 0;
   screen[0].root = 0;
+#if 0
   screen[0].white_pixel = 0xFF;
   screen[0].black_pixel = 0x00;
+#else
+  screen[0].white_pixel = AllocColorCell(0xFFFF, 0xFFFF, 0xFFFF);
+  screen[0].black_pixel = AllocColorCell(0x0000, 0x0000, 0x0000);
+#endif
   screen[0].video_bitmap = NULL;
 
   display->default_screen = 0;
@@ -385,7 +427,7 @@ void XFillRectangle(Display *display, Drawable d, GC gc, int x, int y,
     mouse_off = hide_mouse(display, x, y, width, height);
   }
 
-  rectfill((BITMAP *)d, x, y, x + width, y + height,
+  rectfill((BITMAP *)d, x, y, x + width - 1, y + height - 1,
           ((XGCValues *)gc)->foreground);
 
   if (mouse_off)
@@ -460,7 +502,12 @@ static BITMAP *Image_to_AllegroBitmap(Image *image)
   byte *src_ptr = image->data;
   byte pixel_mapping[MAX_COLORS];
   unsigned int depth = 8;
+
+#if 0
   int i, j, x, y;
+#else
+  int i, x, y;
+#endif
 
   /* allocate new allegro bitmap structure */
   if ((bitmap = create_bitmap_ex(depth, image->width, image->height)) == NULL)
@@ -471,11 +518,16 @@ static BITMAP *Image_to_AllegroBitmap(Image *image)
   /* try to use existing colors from the global colormap */
   for (i=0; i<MAX_COLORS; i++)
   {
+
+#if 0
     int r, g, b;
+#endif
 
     if (!image->rgb.color_used[i])
       continue;
 
+
+#if 0
     r = image->rgb.red[i] >> 10;
     g = image->rgb.green[i] >> 10;
     b = image->rgb.blue[i] >> 10;
@@ -502,6 +554,12 @@ static BITMAP *Image_to_AllegroBitmap(Image *image)
 
       pixel_mapping[i] = j;
     }
+#else
+    pixel_mapping[i] = AllocColorCell(image->rgb.red[i],
+                                     image->rgb.green[i],
+                                     image->rgb.blue[i]);
+#endif
+
   }
 
   /* copy bitmap data */
@@ -633,7 +691,7 @@ static void NewKeyEvent(int key_press_state, KeySym keysym)
   xkey->state = (unsigned int)keysym;
 }
 
-#define HANDLE_RAW_KB_ALL_KEYS         0
+#define HANDLE_RAW_KB_ALL_KEYS                 0
 #define HANDLE_RAW_KB_MODIFIER_KEYS_ONLY       1
 
 static int modifier_scancode[] =
@@ -701,6 +759,26 @@ static void HandleKeyboardEvent()
       else if (ascii == '.')
        keysym = XK_KP_Separator;
     }
+    else if (ascii >= ' ' && ascii <= 'Z')
+      keysym = XK_space + (KeySym)(ascii - ' ');
+    else if (ascii == '^')
+      keysym = XK_asciicircum;
+    else if (ascii == '_')
+      keysym = XK_underscore;
+    else if (ascii == 'Ä')
+      keysym = XK_Adiaeresis;
+    else if (ascii == 'Ö')
+      keysym = XK_Odiaeresis;
+    else if (ascii == 'Ü')
+      keysym = XK_Udiaeresis;
+    else if (ascii == 'ä')
+      keysym = XK_adiaeresis;
+    else if (ascii == 'ö')
+      keysym = XK_odiaeresis;
+    else if (ascii == 'ü')
+      keysym = XK_udiaeresis;
+    else if (ascii == 'ß')
+      keysym = XK_ssharp;
 
     NewKeyEvent(KeyPress, keysym);
   }
@@ -720,15 +798,22 @@ int XPending(Display *display)
   XMotionEvent *xmotion;
   int i;
 
+  /* When using 'HandleKeyboardRaw()', keyboard input is also stored in
+     the allegro keyboard input buffer and would be available a second
+     time by calling 'HandleKeyboardEvent()'. To avoid double keyboard
+     events, the allegro function 'clear_keybuf()' must be called each
+     time when switching from calling 'HandleKeyboardRaw()' to calling
+     'HandleKeyboardEvent()' to get keyboard input, which is actually
+     done by 'XAutoRepeatOn()' which sets keyboard_auto_repeat to TRUE. */
+
   /* keyboard event */
-  if (game_status == PLAYING)
-    HandleKeyboardRaw(HANDLE_RAW_KB_ALL_KEYS);
-  else
+  if (keyboard_auto_repeat)
     HandleKeyboardEvent();
+  else
+    HandleKeyboardRaw(HANDLE_RAW_KB_ALL_KEYS);
 
   /* mouse motion event */
-  /* generate mouse motion event only if any mouse buttons are pressed */
-  if (mouse_pos != last_mouse_pos && mouse_b)
+  if (mouse_pos != last_mouse_pos)
   {
     last_mouse_pos = mouse_pos;
     pending_events++;
@@ -812,6 +897,27 @@ void XDestroyImage(XImage *ximage)
 {
 }
 
+Bool XQueryPointer(Display *display, Window window,
+                  Window *root, Window *child, int *root_x, int *root_y,
+                  int *win_x, int *win_y, unsigned int *mask)
+{
+  *win_x = mouse_x - display->screens[display->default_screen].x;
+  *win_y = mouse_y - display->screens[display->default_screen].y;
+
+  return True;
+}
+
+void XAutoRepeatOn(Display *display)
+{
+  keyboard_auto_repeat = TRUE;
+  clear_keybuf();
+}
+
+void XAutoRepeatOff(Display *display)
+{
+  keyboard_auto_repeat = FALSE;
+}
+
 void NetworkServer(int port, int serveronly)
 {
   Error(ERR_WARN, "networking not supported in DOS version");
index 32d6a4c23700f07214b740a3ac27c672d88d40b8..508bb84463a5970dbbea345bc2aa392da7f1cd79 100644 (file)
 
 #define XFlush(a)
 #define XGetImage(a,b,c,d,e,f,g,h)             ((XImage *) NULL)
-#define XAutoRepeatOn(a)
-#define XAutoRepeatOff(a)
 #define XDisplayName(a)                                ((char *) NULL)
 #define XFreeColors(a,b,c,d,e)
 #define XpmFreeAttributes(a)
@@ -711,4 +709,8 @@ int XLookupString(XKeyEvent *, char *, int, KeySym *, XComposeStatus *);
 void XSetForeground(Display *, GC, unsigned long);
 void XDrawLine(Display *, Drawable, GC, int, int, int, int);
 void XDestroyImage(XImage *);
+Bool XQueryPointer(Display *, Window, Window *, Window *, int *, int *,
+                  int *, int *, unsigned int *);
+void XAutoRepeatOn(Display *);
+void XAutoRepeatOff(Display *);
 void NetworkServer(int, int);
index 0d1f8b910314491db687c2059f612c7dc9e81e57..f68804f5365fcf6ad71fdefa128500598cd22877 100644 (file)
@@ -543,7 +543,7 @@ void DrawPlayer(struct PlayerInfo *player)
     */
 #endif
 
-    static last_dir = MV_LEFT;
+    static int last_dir = MV_LEFT;
 
     if (player->Pushing)
     {
@@ -2430,8 +2430,8 @@ void CreateToolButtons()
   for (i=0; i<NUM_TOOL_BUTTONS; i++)
   {
     Pixmap gd_pixmap = pix[PIX_DOOR];
-    Pixmap deco_pixmap = 0;
-    int deco_x, deco_y, deco_xpos, deco_ypos;
+    Pixmap deco_pixmap = None;
+    int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0;
     struct GadgetInfo *gi;
     unsigned long event_mask;
     int gd_xoffset, gd_yoffset;