rnd-19981017-1
[rocksndiamonds.git] / src / buttons.c
index 8b825451584020ed9110305eaf1481da869dce89..de63c630fe8f7cc15bc48cf848763487a0dbc7af 100644 (file)
@@ -1,13 +1,12 @@
 /***********************************************************
 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
 *----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
+*  (c) 1995-98 Artsoft Entertainment                       *
+*              Holger Schemel                              *
+*              Oststrasse 11a                              *
+*              33604 Bielefeld                             *
+*              phone: ++49 +521 290471                     *
+*              email: aeglos@valinor.owl.de                *
 *----------------------------------------------------------*
 *  buttons.c                                               *
 ***********************************************************/
@@ -16,6 +15,7 @@
 #include "tools.h"
 #include "misc.h"
 #include "editor.h"
+#include "tape.h"
 
 /****************************************************************/
 /********** drawing buttons and corresponding displays **********/
@@ -24,7 +24,7 @@
 void DrawVideoDisplay(unsigned long state, unsigned long value)
 {
   int i;
-  int part1 = 0, part2 = 1;
+  int part_label = 0, part_symbol = 1;
   int xpos = 0, ypos = 1, xsize = 2, ysize = 3;
   static char *monatsname[12] =
   {
@@ -33,55 +33,55 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
   };
   static int video_pos[10][2][4] =
   {
-    VIDEO_PLAY_LABEL_XPOS, VIDEO_PLAY_LABEL_YPOS,
-    VIDEO_PLAY_LABEL_XSIZE,VIDEO_PLAY_LABEL_YSIZE,
-    VIDEO_PLAY_SYMBOL_XPOS, VIDEO_PLAY_SYMBOL_YPOS,
-    VIDEO_PLAY_SYMBOL_XSIZE,VIDEO_PLAY_SYMBOL_YSIZE,
-
-    VIDEO_REC_LABEL_XPOS, VIDEO_REC_LABEL_YPOS,
-    VIDEO_REC_LABEL_XSIZE,VIDEO_REC_LABEL_YSIZE,
-    VIDEO_REC_SYMBOL_XPOS, VIDEO_REC_SYMBOL_YPOS,
-    VIDEO_REC_SYMBOL_XSIZE,VIDEO_REC_SYMBOL_YSIZE,
-
-    VIDEO_PAUSE_LABEL_XPOS, VIDEO_PAUSE_LABEL_YPOS,
-    VIDEO_PAUSE_LABEL_XSIZE,VIDEO_PAUSE_LABEL_YSIZE,
-    VIDEO_PAUSE_SYMBOL_XPOS, VIDEO_PAUSE_SYMBOL_YPOS,
-    VIDEO_PAUSE_SYMBOL_XSIZE,VIDEO_PAUSE_SYMBOL_YSIZE,
-
-    VIDEO_DATE_LABEL_XPOS, VIDEO_DATE_LABEL_YPOS,
-    VIDEO_DATE_LABEL_XSIZE,VIDEO_DATE_LABEL_YSIZE,
-    VIDEO_DATE_XPOS, VIDEO_DATE_YPOS,
-    VIDEO_DATE_XSIZE,VIDEO_DATE_YSIZE,
-
-    0,0,
-    0,0,
-    VIDEO_TIME_XPOS, VIDEO_TIME_YPOS,
-    VIDEO_TIME_XSIZE,VIDEO_TIME_YSIZE,
-
-    VIDEO_BUTTON_PLAY_XPOS, VIDEO_BUTTON_ANY_YPOS,
-    VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE,
-    0,0,
-    0,0,
-
-    VIDEO_BUTTON_REC_XPOS, VIDEO_BUTTON_ANY_YPOS,
-    VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE,
-    0,0,
-    0,0,
-
-    VIDEO_BUTTON_PAUSE_XPOS, VIDEO_BUTTON_ANY_YPOS,
-    VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE,
-    0,0,
-    0,0,
-
-    VIDEO_BUTTON_STOP_XPOS, VIDEO_BUTTON_ANY_YPOS,
-    VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE,
-    0,0,
-    0,0,
-
-    VIDEO_BUTTON_EJECT_XPOS, VIDEO_BUTTON_ANY_YPOS,
-    VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE,
-    0,0,
-    0,0
+    {{ VIDEO_PLAY_LABEL_XPOS, VIDEO_PLAY_LABEL_YPOS,
+       VIDEO_PLAY_LABEL_XSIZE,VIDEO_PLAY_LABEL_YSIZE },
+     { VIDEO_PLAY_SYMBOL_XPOS, VIDEO_PLAY_SYMBOL_YPOS,
+       VIDEO_PLAY_SYMBOL_XSIZE,VIDEO_PLAY_SYMBOL_YSIZE }},
+
+    {{ VIDEO_REC_LABEL_XPOS, VIDEO_REC_LABEL_YPOS,
+       VIDEO_REC_LABEL_XSIZE,VIDEO_REC_LABEL_YSIZE },
+     { VIDEO_REC_SYMBOL_XPOS, VIDEO_REC_SYMBOL_YPOS,
+       VIDEO_REC_SYMBOL_XSIZE,VIDEO_REC_SYMBOL_YSIZE }},
+
+    {{ VIDEO_PAUSE_LABEL_XPOS, VIDEO_PAUSE_LABEL_YPOS,
+       VIDEO_PAUSE_LABEL_XSIZE,VIDEO_PAUSE_LABEL_YSIZE },
+     { VIDEO_PAUSE_SYMBOL_XPOS, VIDEO_PAUSE_SYMBOL_YPOS,
+       VIDEO_PAUSE_SYMBOL_XSIZE,VIDEO_PAUSE_SYMBOL_YSIZE }},
+
+    {{ VIDEO_DATE_LABEL_XPOS, VIDEO_DATE_LABEL_YPOS,
+       VIDEO_DATE_LABEL_XSIZE,VIDEO_DATE_LABEL_YSIZE },
+     { VIDEO_DATE_XPOS, VIDEO_DATE_YPOS,
+       VIDEO_DATE_XSIZE,VIDEO_DATE_YSIZE }},
+
+    {{ 0,0,
+       0,0 },
+     { VIDEO_TIME_XPOS, VIDEO_TIME_YPOS,
+       VIDEO_TIME_XSIZE,VIDEO_TIME_YSIZE }},
+
+    {{ VIDEO_BUTTON_PLAY_XPOS, VIDEO_BUTTON_ANY_YPOS,
+       VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE },
+     { 0,0,
+       0,0 }},
+
+    {{ VIDEO_BUTTON_REC_XPOS, VIDEO_BUTTON_ANY_YPOS,
+       VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE },
+     { 0,0,
+       0,0 }},
+
+    {{ VIDEO_BUTTON_PAUSE_XPOS, VIDEO_BUTTON_ANY_YPOS,
+       VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE },
+     { 0,0,
+       0,0 }},
+
+    {{ VIDEO_BUTTON_STOP_XPOS, VIDEO_BUTTON_ANY_YPOS,
+       VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE },
+     { 0,0,
+       0,0 }},
+
+    {{ VIDEO_BUTTON_EJECT_XPOS, VIDEO_BUTTON_ANY_YPOS,
+       VIDEO_BUTTON_XSIZE,VIDEO_BUTTON_YSIZE },
+     { 0,0,
+       0,0 }}
   };
 
   for(i=0;i<20;i++)
@@ -95,25 +95,38 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
       else
        cx = DOOR_GFX_PAGEX3;   /* i gerade => STATE_OFF / PRESS_ON */
 
-      if (video_pos[pos][part1][0])
+      if (video_pos[pos][part_label][0] && value != VIDEO_DISPLAY_SYMBOL_ONLY)
        XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-                 cx + video_pos[pos][part1][xpos],
-                 cy + video_pos[pos][part1][ypos],
-                 video_pos[pos][part1][xsize],
-                 video_pos[pos][part1][ysize],
-                 VX + video_pos[pos][part1][xpos],
-                 VY + video_pos[pos][part1][ypos]);
-      if (video_pos[pos][part2][0])
+                 cx + video_pos[pos][part_label][xpos],
+                 cy + video_pos[pos][part_label][ypos],
+                 video_pos[pos][part_label][xsize],
+                 video_pos[pos][part_label][ysize],
+                 VX + video_pos[pos][part_label][xpos],
+                 VY + video_pos[pos][part_label][ypos]);
+      if (video_pos[pos][part_symbol][0] && value != VIDEO_DISPLAY_LABEL_ONLY)
        XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-                 cx + video_pos[pos][part2][xpos],
-                 cy + video_pos[pos][part2][ypos],
-                 video_pos[pos][part2][xsize],
-                 video_pos[pos][part2][ysize],
-                 VX + video_pos[pos][part2][xpos],
-                 VY + video_pos[pos][part2][ypos]);
+                 cx + video_pos[pos][part_symbol][xpos],
+                 cy + video_pos[pos][part_symbol][ypos],
+                 video_pos[pos][part_symbol][xsize],
+                 video_pos[pos][part_symbol][ysize],
+                 VX + video_pos[pos][part_symbol][xpos],
+                 VY + video_pos[pos][part_symbol][ypos]);
     }
   }
 
+  if (state & VIDEO_STATE_FFWD_ON)
+  {
+    int cx = DOOR_GFX_PAGEX4, cy = DOOR_GFX_PAGEY2;
+
+    XCopyArea(display,pix[PIX_DOOR],drawto,gc,
+             cx + VIDEO_PLAY_SYMBOL_XPOS,
+             cy + VIDEO_PLAY_SYMBOL_YPOS,
+             VIDEO_PLAY_SYMBOL_XSIZE - 2,
+             VIDEO_PLAY_SYMBOL_YSIZE,
+             VX + VIDEO_PLAY_SYMBOL_XPOS - 9,
+             VY + VIDEO_PLAY_SYMBOL_YPOS);
+  }
+
   if (state & VIDEO_STATE_DATE_ON)
   {
     int tag = value % 100;
@@ -161,7 +174,7 @@ void DrawCompleteVideoDisplay()
   if (tape.date && tape.length)
   {
     DrawVideoDisplay(VIDEO_STATE_DATE_ON,tape.date);
-    DrawVideoDisplay(VIDEO_STATE_TIME_ON,0);
+    DrawVideoDisplay(VIDEO_STATE_TIME_ON,tape.length_seconds);
   }
 
   XCopyArea(display,drawto,pix[PIX_DB_DOOR],gc,
@@ -174,7 +187,7 @@ void DrawSoundDisplay(unsigned long state)
 
   pos = (state & BUTTON_SOUND_MUSIC ? SOUND_BUTTON_MUSIC_XPOS :
         state & BUTTON_SOUND_LOOPS ? SOUND_BUTTON_LOOPS_XPOS :
-        SOUND_BUTTON_SOUND_XPOS);
+        SOUND_BUTTON_SIMPLE_XPOS);
 
   if (state & BUTTON_ON)
     cy -= SOUND_BUTTON_YSIZE;
@@ -209,34 +222,119 @@ void DrawGameButton(unsigned long state)
   redraw_mask |= REDRAW_DOOR_1;
 }
 
-void DrawChooseButton(unsigned long state)
+void DrawYesNoButton(unsigned long state, int mode)
 {
-  int pos, cx = DOOR_GFX_PAGEX4, cy = 0;
+  Drawable dest_drawto;
+  int dest_xoffset, dest_yoffset;
+  int xpos, cx = DOOR_GFX_PAGEX4;
 
-  pos = (state & BUTTON_OK ? OK_BUTTON_XPOS : NO_BUTTON_XPOS);
+  if (mode == DB_INIT)
+  {
+    dest_drawto = pix[PIX_DB_DOOR];
+    dest_xoffset = DOOR_GFX_PAGEX1;
+    dest_yoffset = 0;
+  }
+  else
+  {
+    dest_drawto = drawto;
+    dest_xoffset = DX;
+    dest_yoffset = DY;
+  }
+
+  xpos = (state & BUTTON_OK ? OK_BUTTON_XPOS : NO_BUTTON_XPOS);
 
   if (state & BUTTON_PRESSED)
     cx = DOOR_GFX_PAGEX3;
 
-  XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-           cx + pos,cy + OK_BUTTON_GFX_YPOS,
-           OK_BUTTON_XSIZE,OK_BUTTON_YSIZE,
-           DX + pos,DY + OK_BUTTON_YPOS);
+  XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc,
+           cx + xpos, OK_BUTTON_GFX_YPOS,
+           OK_BUTTON_XSIZE, OK_BUTTON_YSIZE,
+           dest_xoffset + xpos, dest_yoffset + OK_BUTTON_YPOS);
 
   redraw_mask |= REDRAW_DOOR_1;
 }
 
-void DrawConfirmButton(unsigned long state)
+void DrawConfirmButton(unsigned long state, int mode)
 {
+  Drawable dest_drawto;
+  int dest_xoffset, dest_yoffset;
+  int cx = DOOR_GFX_PAGEX4;
+
+  if (mode == DB_INIT)
+  {
+    dest_drawto = pix[PIX_DB_DOOR];
+    dest_xoffset = DOOR_GFX_PAGEX1;
+    dest_yoffset = 0;
+  }
+  else
+  {
+    dest_drawto = drawto;
+    dest_xoffset = DX;
+    dest_yoffset = DY;
+  }
+
+  if (state & BUTTON_PRESSED)
+    cx = DOOR_GFX_PAGEX3;
+
+  XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc,
+           cx + CONFIRM_BUTTON_XPOS, CONFIRM_BUTTON_GFX_YPOS,
+           CONFIRM_BUTTON_XSIZE, CONFIRM_BUTTON_YSIZE,
+           dest_xoffset + CONFIRM_BUTTON_XPOS,
+           dest_yoffset + CONFIRM_BUTTON_YPOS);
+
+  redraw_mask |= REDRAW_DOOR_1;
+}
+
+void DrawPlayerButton(unsigned long state, int mode)
+{
+  Drawable dest_drawto;
+  int dest_xoffset, dest_yoffset;
+  int graphic;
+  int graphic_offset = (PLAYER_BUTTON_XSIZE - TILEX/2)/2;
+  int xpos, ypos;
   int cx = DOOR_GFX_PAGEX4, cy = 0;
 
+  if (mode == DB_INIT)
+  {
+    dest_drawto = pix[PIX_DB_DOOR];
+    dest_xoffset = DOOR_GFX_PAGEX1;
+    dest_yoffset = 0;
+  }
+  else
+  {
+    dest_drawto = drawto;
+    dest_xoffset = DX;
+    dest_yoffset = DY;
+  }
+
+  if (state & BUTTON_PLAYER_1)
+    graphic = GFX_SPIELER1;
+  else if (state & BUTTON_PLAYER_2)
+    graphic = GFX_SPIELER2;
+  else if (state & BUTTON_PLAYER_3)
+    graphic = GFX_SPIELER3;
+  else if (state & BUTTON_PLAYER_4)
+    graphic = GFX_SPIELER4;
+
+  xpos = (state & BUTTON_PLAYER_1 || state & BUTTON_PLAYER_3 ?
+         PLAYER_BUTTON_1_XPOS : PLAYER_BUTTON_2_XPOS);
+  ypos = (state & BUTTON_PLAYER_1 || state & BUTTON_PLAYER_2 ?
+         PLAYER_BUTTON_1_YPOS : PLAYER_BUTTON_3_YPOS);
+
   if (state & BUTTON_PRESSED)
+  {
     cx = DOOR_GFX_PAGEX3;
+    graphic_offset += 1;
+  }
 
-  XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-           cx + CONFIRM_BUTTON_XPOS,cy + CONFIRM_BUTTON_GFX_YPOS,
-           CONFIRM_BUTTON_XSIZE,CONFIRM_BUTTON_YSIZE,
-           DX + CONFIRM_BUTTON_XPOS,DY + CONFIRM_BUTTON_YPOS);
+  XCopyArea(display, pix[PIX_DOOR], dest_drawto, gc,
+           cx + PLAYER_BUTTON_GFX_XPOS, cy + PLAYER_BUTTON_GFX_YPOS,
+           PLAYER_BUTTON_XSIZE, PLAYER_BUTTON_YSIZE,
+           dest_xoffset + xpos, dest_yoffset + ypos);
+  DrawMiniGraphicExt(dest_drawto,gc,
+                    dest_xoffset + xpos + graphic_offset,
+                    dest_yoffset + ypos + graphic_offset,
+                    graphic);
 
   redraw_mask |= REDRAW_DOOR_1;
 }
@@ -250,23 +348,23 @@ void DrawEditButton(unsigned long state)
   int cx = DOOR_GFX_PAGEX6, cy = DOOR_GFX_PAGEY2;
   static int edit_pos[6][4] =
   {
-    ED_BUTTON_CTRL_XPOS,ED_BUTTON_CTRL_YPOS,
-    ED_BUTTON_CTRL_XSIZE,ED_BUTTON_CTRL_YSIZE,
+   {ED_BUTTON_CTRL_XPOS,ED_BUTTON_CTRL_YPOS,
+    ED_BUTTON_CTRL_XSIZE,ED_BUTTON_CTRL_YSIZE},
 
-    ED_BUTTON_FILL_XPOS,ED_BUTTON_FILL_YPOS,
-    ED_BUTTON_FILL_XSIZE,ED_BUTTON_FILL_YSIZE,
+   {ED_BUTTON_FILL_XPOS,ED_BUTTON_FILL_YPOS,
+    ED_BUTTON_FILL_XSIZE,ED_BUTTON_FILL_YSIZE},
 
-    ED_BUTTON_LEFT_XPOS,ED_BUTTON_LEFT_YPOS,
-    ED_BUTTON_LEFT_XSIZE,ED_BUTTON_LEFT_YSIZE,
+   {ED_BUTTON_LEFT_XPOS,ED_BUTTON_LEFT_YPOS,
+    ED_BUTTON_LEFT_XSIZE,ED_BUTTON_LEFT_YSIZE},
 
-    ED_BUTTON_UP_XPOS,ED_BUTTON_UP_YPOS,
-    ED_BUTTON_UP_XSIZE,ED_BUTTON_UP_YSIZE,
+   {ED_BUTTON_UP_XPOS,ED_BUTTON_UP_YPOS,
+    ED_BUTTON_UP_XSIZE,ED_BUTTON_UP_YSIZE},
 
-    ED_BUTTON_DOWN_XPOS,ED_BUTTON_DOWN_YPOS,
-    ED_BUTTON_DOWN_XSIZE,ED_BUTTON_DOWN_YSIZE,
+   {ED_BUTTON_DOWN_XPOS,ED_BUTTON_DOWN_YPOS,
+    ED_BUTTON_DOWN_XSIZE,ED_BUTTON_DOWN_YSIZE},
 
-    ED_BUTTON_RIGHT_XPOS,ED_BUTTON_RIGHT_YPOS,
-    ED_BUTTON_RIGHT_XSIZE,ED_BUTTON_RIGHT_YSIZE
+   {ED_BUTTON_RIGHT_XPOS,ED_BUTTON_RIGHT_YPOS,
+    ED_BUTTON_RIGHT_XSIZE,ED_BUTTON_RIGHT_YSIZE}
   };
 
   if (state & ED_BUTTON_PRESSED)
@@ -294,17 +392,17 @@ void DrawCtrlButton(unsigned long state)
   int cx = DOOR_GFX_PAGEX4, cy = DOOR_GFX_PAGEY1+80;
   static int edit_pos[4][4] =
   {
-    ED_BUTTON_EDIT_XPOS,ED_BUTTON_EDIT_YPOS,
-    ED_BUTTON_EDIT_XSIZE,ED_BUTTON_EDIT_YSIZE,
+   {ED_BUTTON_EDIT_XPOS,ED_BUTTON_EDIT_YPOS,
+    ED_BUTTON_EDIT_XSIZE,ED_BUTTON_EDIT_YSIZE},
 
-    ED_BUTTON_CLEAR_XPOS,ED_BUTTON_CLEAR_YPOS,
-    ED_BUTTON_CLEAR_XSIZE,ED_BUTTON_CLEAR_YSIZE,
+   {ED_BUTTON_CLEAR_XPOS,ED_BUTTON_CLEAR_YPOS,
+    ED_BUTTON_CLEAR_XSIZE,ED_BUTTON_CLEAR_YSIZE},
 
-    ED_BUTTON_UNDO_XPOS,ED_BUTTON_UNDO_YPOS,
-    ED_BUTTON_UNDO_XSIZE,ED_BUTTON_UNDO_YSIZE,
+   {ED_BUTTON_UNDO_XPOS,ED_BUTTON_UNDO_YPOS,
+    ED_BUTTON_UNDO_XSIZE,ED_BUTTON_UNDO_YSIZE},
 
-    ED_BUTTON_EXIT_XPOS,ED_BUTTON_EXIT_YPOS,
-    ED_BUTTON_EXIT_XSIZE,ED_BUTTON_EXIT_YSIZE
+   {ED_BUTTON_EXIT_XPOS,ED_BUTTON_EXIT_YPOS,
+    ED_BUTTON_EXIT_XSIZE,ED_BUTTON_EXIT_YSIZE}
   };
 
   if (state & ED_BUTTON_PRESSED)
@@ -332,14 +430,14 @@ void DrawElemButton(int button_nr, int button_state)
   int from_x, from_y, to_x,to_y, size_x, size_y;
   static int edit_pos[3][4] =
   {
-    ED_BUTTON_EUP_XPOS,ED_BUTTON_EUP_YPOS,
-    ED_BUTTON_EUP_XSIZE,ED_BUTTON_EUP_YSIZE,
+   {ED_BUTTON_EUP_XPOS,ED_BUTTON_EUP_YPOS,
+    ED_BUTTON_EUP_XSIZE,ED_BUTTON_EUP_YSIZE},
 
-    ED_BUTTON_EDOWN_XPOS,ED_BUTTON_EDOWN_YPOS,
-    ED_BUTTON_EDOWN_XSIZE,ED_BUTTON_EDOWN_YSIZE,
+   {ED_BUTTON_EDOWN_XPOS,ED_BUTTON_EDOWN_YPOS,
+    ED_BUTTON_EDOWN_XSIZE,ED_BUTTON_EDOWN_YSIZE},
 
-    ED_BUTTON_ELEM_XPOS,ED_BUTTON_ELEM_YPOS,
-    ED_BUTTON_ELEM_XSIZE,ED_BUTTON_ELEM_YSIZE
+   {ED_BUTTON_ELEM_XPOS,ED_BUTTON_ELEM_YPOS,
+    ED_BUTTON_ELEM_XSIZE,ED_BUTTON_ELEM_YSIZE}
   };
 
   if (button_nr<ED_BUTTON_ELEM)
@@ -394,12 +492,12 @@ void DrawElemButton(int button_nr, int button_state)
     XCopyArea(display,pix[PIX_DOOR],drawto,gc,
              from_x,from_y, size_x,size_y, to_x,to_y);
 
-    DrawMiniGraphicExtHiRes(drawto,gc,
-                           DX+ED_BUTTON_ELEM_XPOS+3+shift + 
-                           (elem_pos % MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
-                           DY+ED_BUTTON_ELEM_YPOS+3-shift +
-                           (elem_pos / MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
-                           graphic);
+    DrawMiniGraphicExt(drawto,gc,
+                      DX+ED_BUTTON_ELEM_XPOS+3+shift + 
+                      (elem_pos % MAX_ELEM_X)*ED_BUTTON_ELEM_XSIZE,
+                      DY+ED_BUTTON_ELEM_YPOS+3-shift +
+                      (elem_pos / MAX_ELEM_X)*ED_BUTTON_ELEM_YSIZE,
+                      graphic);
   }
 
   redraw_mask |= REDRAW_DOOR_1;
@@ -437,7 +535,7 @@ int CheckVideoButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
   static int video_button[5] =
   {
     VIDEO_PRESS_EJECT_ON,
@@ -497,12 +595,12 @@ int CheckSoundButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
   int sound_state[3];
 
-  sound_state[0] = BUTTON_SOUND_MUSIC | (BUTTON_ON * sound_music_on);
-  sound_state[1] = BUTTON_SOUND_LOOPS | (BUTTON_ON * sound_loops_on);
-  sound_state[2] = BUTTON_SOUND_SOUND | (BUTTON_ON * sound_on);
+  sound_state[0] = BUTTON_SOUND_MUSIC  | (BUTTON_ON * setup.sound_music_on);
+  sound_state[1] = BUTTON_SOUND_LOOPS  | (BUTTON_ON * setup.sound_loops_on);
+  sound_state[2] = BUTTON_SOUND_SIMPLE | (BUTTON_ON * setup.sound_simple_on);
 
   if (button)
   {
@@ -554,7 +652,7 @@ int CheckGameButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
   int game_state[3] =
   {
     BUTTON_GAME_STOP,
@@ -608,12 +706,12 @@ int CheckGameButtons(int mx, int my, int button)
   return(return_code);
 }
 
-int CheckChooseButtons(int mx, int my, int button)
+int CheckYesNoButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
-  static int choose_button[5] =
+  static boolean pressed = FALSE;
+  static int yesno_button[5] =
   {
     BUTTON_OK,
     BUTTON_NO
@@ -623,33 +721,33 @@ int CheckChooseButtons(int mx, int my, int button)
   {
     if (!motion_status)                /* Maustaste neu gedrückt */
     {
-      if (ON_CHOOSE_BUTTON(mx,my))
+      if (ON_YESNO_BUTTON(mx,my))
       {
-       choice = CHOOSE_BUTTON(mx);
+       choice = YESNO_BUTTON(mx);
        pressed = TRUE;
-       DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
+       DrawYesNoButton(yesno_button[choice] | BUTTON_PRESSED, DB_NORMAL);
       }
     }
     else                       /* Mausbewegung bei gedrückter Maustaste */
     {
-      if ((!ON_CHOOSE_BUTTON(mx,my) || CHOOSE_BUTTON(mx)!=choice) &&
+      if ((!ON_YESNO_BUTTON(mx,my) || YESNO_BUTTON(mx)!=choice) &&
          choice>=0 && pressed)
       {
        pressed = FALSE;
-       DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
+       DrawYesNoButton(yesno_button[choice] | BUTTON_RELEASED, DB_NORMAL);
       }
-      else if (ON_CHOOSE_BUTTON(mx,my) &&CHOOSE_BUTTON(mx)==choice && !pressed)
+      else if (ON_YESNO_BUTTON(mx,my) && YESNO_BUTTON(mx)==choice && !pressed)
       {
        pressed = TRUE;
-       DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
+       DrawYesNoButton(yesno_button[choice] | BUTTON_PRESSED, DB_NORMAL);
       }
     }
   }
   else                         /* Maustaste wieder losgelassen */
   {
-    if (ON_CHOOSE_BUTTON(mx,my) && CHOOSE_BUTTON(mx)==choice && pressed)
+    if (ON_YESNO_BUTTON(mx,my) && YESNO_BUTTON(mx)==choice && pressed)
     {
-      DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
+      DrawYesNoButton(yesno_button[choice] | BUTTON_RELEASED, DB_NORMAL);
       return_code = choice+1;
       choice = -1;
       pressed = FALSE;
@@ -669,7 +767,7 @@ int CheckConfirmButton(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
 
   if (button)
   {
@@ -679,7 +777,7 @@ int CheckConfirmButton(int mx, int my, int button)
       {
        choice = 0;
        pressed = TRUE;
-       DrawConfirmButton(BUTTON_PRESSED);
+       DrawConfirmButton(BUTTON_PRESSED, DB_NORMAL);
       }
     }
     else                       /* Mausbewegung bei gedrückter Maustaste */
@@ -687,12 +785,12 @@ int CheckConfirmButton(int mx, int my, int button)
       if (!ON_CONFIRM_BUTTON(mx,my) && choice>=0 && pressed)
       {
        pressed = FALSE;
-       DrawConfirmButton(BUTTON_RELEASED);
+       DrawConfirmButton(BUTTON_RELEASED, DB_NORMAL);
       }
       else if (ON_CONFIRM_BUTTON(mx,my) && !pressed)
       {
        pressed = TRUE;
-       DrawConfirmButton(BUTTON_PRESSED);
+       DrawConfirmButton(BUTTON_PRESSED, DB_NORMAL);
       }
     }
   }
@@ -700,7 +798,7 @@ int CheckConfirmButton(int mx, int my, int button)
   {
     if (ON_CONFIRM_BUTTON(mx,my) && pressed)
     {
-      DrawConfirmButton(BUTTON_RELEASED);
+      DrawConfirmButton(BUTTON_RELEASED, DB_NORMAL);
       return_code = BUTTON_CONFIRM;
       choice = -1;
       pressed = FALSE;
@@ -716,13 +814,72 @@ int CheckConfirmButton(int mx, int my, int button)
   return(return_code);
 }
 
+int CheckPlayerButtons(int mx, int my, int button)
+{
+  int return_code = 0;
+  static int choice = -1;
+  static boolean pressed = FALSE;
+  int player_state[4] =
+  {
+    BUTTON_PLAYER_1,
+    BUTTON_PLAYER_2,
+    BUTTON_PLAYER_3,
+    BUTTON_PLAYER_4
+  };
+
+  if (button)
+  {
+    if (!motion_status)                /* Maustaste neu gedrückt */
+    {
+      if (ON_PLAYER_BUTTON(mx,my))
+      {
+       choice = PLAYER_BUTTON(mx,my);
+       pressed = TRUE;
+       DrawPlayerButton(player_state[choice] | BUTTON_PRESSED, DB_NORMAL);
+      }
+    }
+    else                       /* Mausbewegung bei gedrückter Maustaste */
+    {
+      if ((!ON_PLAYER_BUTTON(mx,my) || PLAYER_BUTTON(mx,my)!=choice) &&
+         choice>=0 && pressed)
+      {
+       pressed = FALSE;
+       DrawPlayerButton(player_state[choice] | BUTTON_RELEASED, DB_NORMAL);
+      }
+      else if (ON_PLAYER_BUTTON(mx,my) && PLAYER_BUTTON(mx,my)==choice && !pressed)
+      {
+       pressed = TRUE;
+       DrawPlayerButton(player_state[choice] | BUTTON_PRESSED, DB_NORMAL);
+      }
+    }
+  }
+  else                         /* Maustaste wieder losgelassen */
+  {
+    if (ON_PLAYER_BUTTON(mx,my) && PLAYER_BUTTON(mx,my)==choice && pressed)
+    {
+      DrawPlayerButton(player_state[choice] | BUTTON_RELEASED, DB_NORMAL);
+      return_code = player_state[choice];
+      choice = -1;
+      pressed = FALSE;
+    }
+    else
+    {
+      choice = -1;
+      pressed = FALSE;
+    }
+  }
+
+  BackToFront();
+  return(return_code);
+}
+
 /* several buttons in the level editor */
 
 int CheckEditButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
   static int edit_button[6] =
   {
     ED_BUTTON_CTRL,
@@ -792,7 +949,7 @@ int CheckCtrlButtons(int mx, int my, int button)
 {
   int return_code = 0;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
   static int ctrl_button[4] =
   {
     ED_BUTTON_EDIT,
@@ -851,7 +1008,7 @@ int CheckElemButtons(int mx, int my, int button)
 {
   int return_code = -1;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
 
   if (button)
   {
@@ -912,7 +1069,7 @@ int CheckCountButtons(int mx, int my, int button)
 {
   int return_code = -1;
   static int choice = -1;
-  static BOOL pressed = FALSE;
+  static boolean pressed = FALSE;
 
   if (button)
   {