rnd-19981017-1
[rocksndiamonds.git] / src / screens.c
index 2d5d17c10b9fe84b7f367bb67e1544e783189d52..d728c42a24a4ac7ec2eeabd1fb9415f9b01937ba 100644 (file)
@@ -1,17 +1,14 @@
 /***********************************************************
 *  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                *
 *----------------------------------------------------------*
 *  screens.c                                               *
-*                                                          *
-*  Letzte Aenderung: 15.06.1995                            *
 ***********************************************************/
 
 #include "screens.h"
 #include "tools.h"
 #include "editor.h"
 #include "misc.h"
+#include "files.h"
+#include "buttons.h"
+#include "tape.h"
+#include "joystick.h"
+#include "cartoons.h"
+#include "network.h"
+
+#ifdef MSDOS
+extern unsigned char get_ascii(KeySym);
+#endif
+
+void DrawHeadline()
+{
+  int x1 = SX+(SXSIZE - strlen(GAMETITLE_STRING) * FONT1_XSIZE) / 2;
+  int y1 = SY+8;
+  int x2 = SX+(SXSIZE - strlen(COPYRIGHT_STRING) * FONT2_XSIZE) / 2;
+  int y2 = SY+46;
+
+  DrawText(x1,y1, GAMETITLE_STRING, FS_BIG,FC_YELLOW);
+  DrawText(x2,y2, COPYRIGHT_STRING, FS_SMALL,FC_RED);
+}
 
 void DrawMainMenu()
 {
@@ -31,14 +49,12 @@ void DrawMainMenu()
   LoadLevel(level_nr);
 
   ClearWindow();
-  DrawText(SX+16, SY+8,  "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
-  DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
-          FS_SMALL,FC_RED);
+  DrawHeadline();
   DrawText(SX+32, SY+64, "Name:",FS_BIG,FC_GREEN);
-  DrawText(SX+192,SY+64, player.alias_name,FS_BIG,FC_RED);
+  DrawText(SX+192,SY+64, local_player->alias_name,FS_BIG,FC_RED);
   DrawText(SX+32, SY+96, "Level:",FS_BIG,FC_GREEN);
   DrawText(SX+352,SY+96, int2str(level_nr,3),FS_BIG,
-          (level_nr<leveldir[leveldir_nr].num_ready ? FC_RED : FC_YELLOW));
+          (level_nr<leveldir[leveldir_nr].levels ? FC_RED : FC_YELLOW));
   DrawText(SX+32, SY+128,"Hall Of Fame",FS_BIG,FC_GREEN);
   DrawText(SX+32, SY+160,"Level Creator",FS_BIG,FC_GREEN);
   DrawText(SY+32, SY+192,"Info Screen",FS_BIG,FC_GREEN);
@@ -50,10 +66,10 @@ void DrawMainMenu()
 
   for(i=2;i<10;i++)
     DrawGraphic(0,i,GFX_KUGEL_BLAU);
-  DrawGraphic(10,3,GFX_KUGEL_BLAU);
-  DrawGraphic(14,3,GFX_KUGEL_BLAU);
+  DrawGraphic(10,3,GFX_PFEIL_L);
+  DrawGraphic(14,3,GFX_PFEIL_R);
 
-  DrawText(SX+54+16,SY+326,"A Game by Artsoft Development",FS_SMALL,FC_BLUE);
+  DrawText(SX+40+16,SY+326,"A Game by Artsoft Entertainment",FS_SMALL,FC_BLUE);
   DrawText(SX+40+16,SY+344,"Graphics: Deluxe Paint IV Amiga",
           FS_SMALL,FC_BLUE);
   DrawText(SX+60+16,SY+362,"Sounds: AudioMaster IV Amiga",
@@ -61,7 +77,7 @@ void DrawMainMenu()
 
   FadeToFront();
   InitAnimation();
-  HandleMainMenu(0,0,0,0,MB_MENU_MARK);
+  HandleMainMenu(0,0,0,0,MB_MENU_INITIALIZE);
 
   TapeStop();
   if (TAPE_IS_EMPTY(tape))
@@ -70,6 +86,7 @@ void DrawMainMenu()
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
 
+  ClearEventQueue();
   XAutoRepeatOn(display);
 }
 
@@ -79,12 +96,15 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
   static int redraw = TRUE;
   int x = (mx+32-SX)/32, y = (my+32-SY)/32;
 
-  if (redraw)
+  if (redraw || button == MB_MENU_INITIALIZE)
   {
     DrawGraphic(0,choice-1,GFX_KUGEL_ROT);
     redraw = FALSE;
   }
 
+  if (button == MB_MENU_INITIALIZE)
+    return;
+
   if (dx || dy)
   {
     if (dx && choice==4)
@@ -113,33 +133,29 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
   }
 
   if (y==4 && ((x==11 && level_nr>0) ||
-              (x==15 && level_nr<LEVELDIR_SIZE(leveldir[leveldir_nr]))) &&
+              (x==15 && level_nr<leveldir[leveldir_nr].levels)) &&
       button)
   {
     static long level_delay = 0;
     int step = (button==1 ? 1 : button==2 ? 5 : 10);
+    int new_level_nr, old_level_nr = level_nr;
 
-    if (!DelayReached(&level_delay,20))
+    new_level_nr = level_nr + (x==11 ? -step : +step);
+    if (new_level_nr<0)
+      new_level_nr = 0;
+    if (new_level_nr>leveldir[leveldir_nr].levels-1)
+      new_level_nr = leveldir[leveldir_nr].levels-1;
+
+    if (old_level_nr==new_level_nr || !DelayReached(&level_delay,150))
       goto out;
 
-    level_nr += (x==11 ? -step : +step);
-    if (level_nr<0)
-      level_nr = 0;
-    if (level_nr>LEVELDIR_SIZE(leveldir[leveldir_nr])-1)
-      level_nr = LEVELDIR_SIZE(leveldir[leveldir_nr])-1;
+    level_nr = new_level_nr;
 
-    if (level_nr>player.handicap && level_nr<leveldir[leveldir_nr].num_ready)
-    {
-      if (x==11 || leveldir[leveldir_nr].num_free==0)
-       level_nr = player.handicap;
-      else
-       level_nr = leveldir[leveldir_nr].num_ready;
-    }
+    if (level_nr > local_player->handicap)
+      level_nr = local_player->handicap;
 
-    DrawTextExt(drawto,gc,SX+352,SY+96, int2str(level_nr,3),FS_BIG,
-               (level_nr<leveldir[leveldir_nr].num_ready ?FC_RED :FC_YELLOW));
-    DrawTextExt(window,gc,SX+352,SY+96,        int2str(level_nr,3),FS_BIG,
-               (level_nr<leveldir[leveldir_nr].num_ready ?FC_RED :FC_YELLOW));
+    DrawTextExt(drawto,gc,SX+352,SY+96, int2str(level_nr,3), FS_BIG,FC_RED);
+    DrawTextExt(window,gc,SX+352,SY+96,        int2str(level_nr,3), FS_BIG,FC_RED);
 
     LoadLevel(level_nr);
     DrawMicroLevel(MICROLEV_XPOS,MICROLEV_YPOS);
@@ -147,6 +163,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
     TapeErase();
     LoadLevelTape(level_nr);
     DrawCompleteVideoDisplay();
+
+    /* needed because DrawMicroLevel() takes some time */
+    BackToFront();
+    XSync(display,FALSE);
+    DelayReached(&level_delay,0);      /* reset delay counter */
   }
   else if (x==1 && y>=3 && y<=10)
   {
@@ -164,55 +185,61 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       if (y==3)
       {
        game_status = TYPENAME;
-       HandleTypeName(strlen(player.alias_name),0);
+       HandleTypeName(strlen(local_player->alias_name),0);
       }
       else if (y==4)
       {
        if (num_leveldirs)
        {
          game_status = CHOOSELEVEL;
+         SavePlayerInfo(PLAYER_LEVEL);
          DrawChooseLevel();
-         redraw = TRUE;
        }
       }
       else if (y==5)
       {
        game_status = HALLOFFAME;
        DrawHallOfFame(-1);
-       redraw = TRUE;
       }
       else if (y==6)
       {
        game_status = LEVELED;
+       if (leveldir[leveldir_nr].readonly)
+         Request("This level is read only !",REQ_CONFIRM);
        DrawLevelEd();
-       redraw = TRUE;
       }
       else if (y==7)
       {
        game_status = HELPSCREEN;
        DrawHelpScreen();
-       redraw = TRUE;
       }
       else if (y==8)
       {
-       if (autorecord_on && !tape.playing)
-         TapeInitRecording();
+       if (setup.autorecord_on)
+         TapeStartRecording();
 
-       game_status = PLAYING;
-       InitGame();
-       redraw = TRUE;
+       if (options.network)
+         SendToServer_StartPlaying();
+       else
+       {
+         game_status = PLAYING;
+         InitGame();
+       }
       }
       else if (y==9)
       {
        game_status = SETUP;
        DrawSetupScreen();
-       redraw = TRUE;
       }
       else if (y==10)
       {
-        if (AreYouSure("Do you really want to quit ?",AYS_ASK|AYS_STAY_CLOSED))
+       SavePlayerInfo(PLAYER_LEVEL);
+        if (Request("Do you really want to quit ?", REQ_ASK | REQ_STAY_CLOSED))
          game_status = EXITGAME;
       }
+
+      if (!button)
+       redraw = TRUE;
     }
   }
   BackToFront();
@@ -233,25 +260,49 @@ static int helpscreen_frame[MAX_HELPSCREEN_ELS];
 static int helpscreen_delay[MAX_HELPSCREEN_ELS];
 static int helpscreen_action[] =
 {
+  GFX_SPIELER1_DOWN,4,2,
+  GFX_SPIELER1_UP,4,2,
+  GFX_SPIELER1_LEFT,4,2,
+  GFX_SPIELER1_RIGHT,4,2,
+  GFX_SPIELER1_PUSH_LEFT,4,2,
+  GFX_SPIELER1_PUSH_RIGHT,4,2,                                 HA_NEXT,
   GFX_ERDREICH,1,100,                                          HA_NEXT,
   GFX_LEERRAUM,1,100,                                          HA_NEXT,
   GFX_MORAST_LEER,1,100,                                       HA_NEXT,
   GFX_BETON,1,100,                                             HA_NEXT,
   GFX_MAUERWERK,1,100,                                         HA_NEXT,
+  GFX_MAUER_R1,3,4, GFX_MAUERWERK,1,20, GFX_LEERRAUM,1,10,
+  GFX_MAUER_L1,3,4, GFX_MAUERWERK,1,20, GFX_LEERRAUM,1,10,     HA_NEXT,
+  GFX_UNSICHTBAR,1,100,                                                HA_NEXT,
   GFX_FELSBODEN,1,100,                                         HA_NEXT,
+  GFX_CHAR_A,30,4, GFX_CHAR_AUSRUF,32,4,                       HA_NEXT,
   GFX_EDELSTEIN,2,5,                                           HA_NEXT,
   GFX_DIAMANT,2,5,                                             HA_NEXT,
+  GFX_EDELSTEIN_BD,2,5,                                                HA_NEXT,
+  GFX_EDELSTEIN_GELB,2,5, GFX_EDELSTEIN_ROT,2,5,
+  GFX_EDELSTEIN_LILA,2,5,                                      HA_NEXT,
   GFX_FELSBROCKEN,4,5,                                         HA_NEXT,
   GFX_BOMBE,1,50, GFX_EXPLOSION,8,1, GFX_LEERRAUM,1,10,                HA_NEXT,
   GFX_KOKOSNUSS,1,50, GFX_CRACKINGNUT,3,1, GFX_EDELSTEIN,1,10, HA_NEXT,
-  GFX_ERZ_1,1,50, GFX_EXPLOSION,8,1, GFX_EDELSTEIN,1,10,       HA_NEXT,
-  GFX_ERZ_2,1,50, GFX_EXPLOSION,8,1, GFX_DIAMANT,1,10,         HA_NEXT,
+  GFX_ERZ_EDEL,1,50, GFX_EXPLOSION,8,1, GFX_EDELSTEIN,1,10,    HA_NEXT,
+  GFX_ERZ_DIAM,1,50, GFX_EXPLOSION,8,1, GFX_DIAMANT,1,10,      HA_NEXT,
+  GFX_ERZ_EDEL_BD,1,50, GFX_EXPLOSION,8,1,GFX_EDELSTEIN_BD,1,10,HA_NEXT,
+  GFX_ERZ_EDEL_GELB,1,50, GFX_EXPLOSION,8,1,
+  GFX_EDELSTEIN_GELB,1,10, GFX_ERZ_EDEL_ROT,1,50,
+  GFX_EXPLOSION,8,1, GFX_EDELSTEIN_ROT,1,10,
+  GFX_ERZ_EDEL_LILA,1,50, GFX_EXPLOSION,8,1,
+  GFX_EDELSTEIN_LILA,1,10,                                     HA_NEXT,
   GFX_GEBLUBBER,4,4,                                           HA_NEXT,
-  GFX_SCHLUESSEL1,4,33,                                                HA_NEXT,
-  GFX_PFORTE1,4,33,                                            HA_NEXT,
-  GFX_PFORTE1X,4,33,                                           HA_NEXT,
+  GFX_SCHLUESSEL1,4,25,                                                HA_NEXT,
+  GFX_PFORTE1,4,25,                                            HA_NEXT,
+  GFX_PFORTE1X,4,25,                                           HA_NEXT,
   GFX_DYNAMIT_AUS,1,100,                                       HA_NEXT,
   GFX_DYNAMIT,7,6, GFX_EXPLOSION,8,1, GFX_LEERRAUM,1,10,       HA_NEXT,
+  GFX_DYNABOMB+0,4,3, GFX_DYNABOMB+3,1,3, GFX_DYNABOMB+2,1,3,
+  GFX_DYNABOMB+1,1,3, GFX_DYNABOMB+0,1,3, GFX_EXPLOSION,8,1,
+  GFX_LEERRAUM,1,10,                                           HA_NEXT,
+  GFX_DYNABOMB_NR,1,100,                                       HA_NEXT,
+  GFX_DYNABOMB_SZ,1,100,                                       HA_NEXT,
   GFX_FLIEGER+4,1,3, GFX_FLIEGER+0,1,3, GFX_FLIEGER+4,1,3,
   GFX_FLIEGER+5,1,3, GFX_FLIEGER+1,1,3, GFX_FLIEGER+5,1,3,
   GFX_FLIEGER+6,1,3, GFX_FLIEGER+2,1,3, GFX_FLIEGER+6,1,3,
@@ -260,69 +311,133 @@ static int helpscreen_action[] =
   GFX_KAEFER+5,1,1, GFX_KAEFER+1,1,1, GFX_KAEFER+5,1,1,
   GFX_KAEFER+6,1,1, GFX_KAEFER+2,1,1, GFX_KAEFER+6,1,1,
   GFX_KAEFER+7,1,1, GFX_KAEFER+3,1,1, GFX_KAEFER+7,1,1,                HA_NEXT,
+  GFX_BUTTERFLY,2,2,                                           HA_NEXT,
+  GFX_FIREFLY,2,2,                                             HA_NEXT,
   GFX_PACMAN+0,1,3, GFX_PACMAN+4,1,2, GFX_PACMAN+0,1,3,
   GFX_PACMAN+1,1,3, GFX_PACMAN+5,1,2, GFX_PACMAN+1,1,3,
   GFX_PACMAN+2,1,3, GFX_PACMAN+6,1,2, GFX_PACMAN+2,1,3,
   GFX_PACMAN+3,1,3, GFX_PACMAN+7,1,2, GFX_PACMAN+3,1,3,                HA_NEXT,
-  GFX_MAMPFER+0,4,0, GFX_MAMPFER+3,1,0, GFX_MAMPFER+2,1,0,
-  GFX_MAMPFER+1,1,0,                                           HA_NEXT,
-  GFX_ZOMBIE+0,4,0, GFX_ZOMBIE+3,1,0, GFX_ZOMBIE+2,1,0,
-  GFX_ZOMBIE+1,1,0,                                            HA_NEXT,
+  GFX_MAMPFER+0,4,1, GFX_MAMPFER+3,1,1, GFX_MAMPFER+2,1,1,
+  GFX_MAMPFER+1,1,1, GFX_MAMPFER+0,1,1,                                HA_NEXT,
+  GFX_MAMPFER2+0,4,1, GFX_MAMPFER2+3,1,1, GFX_MAMPFER2+2,1,1,
+  GFX_MAMPFER2+1,1,1, GFX_MAMPFER2+0,1,1,                      HA_NEXT,
+  GFX_ROBOT+0,4,1, GFX_ROBOT+3,1,1, GFX_ROBOT+2,1,1,
+  GFX_ROBOT+1,1,1, GFX_ROBOT+0,1,1,                            HA_NEXT,
+  GFX_MAULWURF_DOWN,4,2,
+  GFX_MAULWURF_UP,4,2,
+  GFX_MAULWURF_LEFT,4,2,
+  GFX_MAULWURF_RIGHT,4,2,                                      HA_NEXT,
+  GFX_PINGUIN_DOWN,4,2,
+  GFX_PINGUIN_UP,4,2,
+  GFX_PINGUIN_LEFT,4,2,
+  GFX_PINGUIN_RIGHT,4,2,                                       HA_NEXT,
+  GFX_SCHWEIN_DOWN,4,2,
+  GFX_SCHWEIN_UP,4,2,
+  GFX_SCHWEIN_LEFT,4,2,
+  GFX_SCHWEIN_RIGHT,4,2,                                       HA_NEXT,
+  GFX_DRACHE_DOWN,4,2,
+  GFX_DRACHE_UP,4,2,
+  GFX_DRACHE_LEFT,4,2,
+  GFX_DRACHE_RIGHT,4,2,                                                HA_NEXT,
+  GFX_SONDE_START,8,1,                                         HA_NEXT,
   GFX_ABLENK,4,1,                                              HA_NEXT,
-  GFX_AMOEBE_LEBT,4,40,                                                HA_NEXT,
+  GFX_BIRNE_AUS,1,25, GFX_BIRNE_EIN,1,25,                      HA_NEXT,
+  GFX_ZEIT_VOLL,1,25, GFX_ZEIT_LEER,1,25,                      HA_NEXT,
+  GFX_TROPFEN,1,25, GFX_AMOEBING,4,1, GFX_AMOEBE_LEBT,1,10,    HA_NEXT,
   GFX_AMOEBE_TOT+2,2,50, GFX_AMOEBE_TOT,2,50,                  HA_NEXT,
+  GFX_AMOEBE_LEBT,4,40,                                                HA_NEXT,
+  GFX_AMOEBE_LEBT,1,10,        GFX_AMOEBING,4,2,                       HA_NEXT,
+  GFX_AMOEBE_LEBT,1,25, GFX_AMOEBE_TOT,1,25, GFX_EXPLOSION,8,1,
+  GFX_DIAMANT,1,10,                                            HA_NEXT,
+  GFX_LIFE,1,100,                                              HA_NEXT,
+  GFX_LIFE_ASYNC,1,100,                                                HA_NEXT,
   GFX_SIEB_LEER,4,2,                                           HA_NEXT,
+  GFX_SIEB2_LEER,4,2,                                          HA_NEXT,
+  GFX_AUSGANG_ZU,1,100, GFX_AUSGANG_ACT,4,2,
+  GFX_AUSGANG_AUF+0,4,2, GFX_AUSGANG_AUF+3,1,2,
+  GFX_AUSGANG_AUF+2,1,2, GFX_AUSGANG_AUF+1,1,2,                        HA_NEXT,
+  GFX_AUSGANG_AUF+0,4,2, GFX_AUSGANG_AUF+3,1,2,
+  GFX_AUSGANG_AUF+2,1,2, GFX_AUSGANG_AUF+1,1,2,                        HA_NEXT,
   HA_END
 };
 static char *helpscreen_eltext[][2] =
 {
-  "Normal sand:", "You can dig through it",
-  "Empty field:", "You can walk through it",
-  "Quicksand: You cannot pass it,", "but rocks can fall though it",
-  "Massive Wall:", "Nothing can go through it",
-  "Normal Wall: You can't go through", "it, but you can bomb it away",
-  "Old Wall: Like normal wall, but", "some things can fall down from it",
-  "Emerald: You must collect enough of", "them to finish a level",
-  "Diamond: Counts as 3 emeralds;", "Can be destroyed by rocks",
-  "Rock: Smashes several things;", "Can be moved by the player",
-  "Bomb: You can move it, but be", "careful when dropping it",
-  "Nut: Throw a rock on it to open it;", "Each nut contains an emerald",
-  "Wall with an Emerald inside:", "Bomb the wall away to get it",
-  "Wall with a Diamond inside:", "Bomb the wall away to get it",
-  "Acid: Destroys everything that", "falls or walks into it",
-  "Key: Opens the door that has the", "same color (red/yellow/green/blue)",
-  "Door: Can be opened by the key", "with the same color",
-  "Door: You have to find out the", "right color of the key for it",
-  "Dynamite: Collect it and use it to", "destroy walls or kill enemies",
-  "Dynamite: This one explodes after", "a few seconds",
-  "Spaceship: Moves at the left side", "of walls; don't touch it!",
-  "Bug: Moves at the right side of", "walls; don't touch it!",
-  "Pacman: Eats the amoeba and you,", "if you're not careful",
-  "Cruncher: Eats diamonds and you,", "if you're not careful",
-  "Robot: Tries to kill the player", "",
-  "Magic Wheel: Touch it to get rid of", "the robots for some seconds",
-  "Living Amoeba: Grows through empty", "fields, sand and quicksand",
-  "Dead Amoeba: Does not grow, but", "can still kill bugs and spaceships",
-  "Magic Wall: Changes rocks, emeralds", "and diamonds when they pass it",
+ {"THE HERO:",                         "(Is _this_ guy good old Rockford?)"},
+ {"Normal sand:",                      "You can dig through it"},
+ {"Empty field:",                      "You can walk through it"},
+ {"Quicksand: You cannot pass it,",    "but rocks can fall though it"},
+ {"Massive Wall:",                     "Nothing can go through it"},
+ {"Normal Wall: You can't go through", "it, but you can bomb it away"},
+ {"Growing Wall: Grows to the left or",        "right if there is an empty field"},
+ {"Invisible Wall: Behaves like normal","wall, but is invisible"},
+ {"Old Wall: Like normal wall, but",   "some things can fall down from it"},
+ {"Letter Wall: Looks like a letter,", "behaves like a normal wall"},
+ {"Emerald: You must collect enough of","them to finish a level"},
+ {"Diamond: Counts as 3 emeralds, but",        "can be destroyed by rocks"},
+ {"Diamond (BD style): Counts like one","emerald and behaves a bit different"},
+ {"Colorful Gems:",                    "Seem to behave like Emeralds"},
+ {"Rock: Smashes several things;",     "Can be moved by the player"},
+ {"Bomb: You can move it, but be",     "careful when dropping it"},
+ {"Nut: Throw a rock on it to open it;","Each nut contains an emerald"},
+ {"Wall with an emerald inside:",      "Bomb the wall away to get it"},
+ {"Wall with a diamond inside:",       "Bomb the wall away to get it"},
+ {"Wall with BD style diamond inside:",        "Bomb the wall away to get it"},
+ {"Wall with colorful gem inside:",    "Bomb the wall away to get it"},
+ {"Acid: Things that fall in are gone",        "forever (including our hero)"},
+ {"Key: Opens the door that has the",  "same color (red/yellow/green/blue)"},
+ {"Door: Can be opened by the key",    "with the same color"},
+ {"Door: You have to find out the",    "right color of the key for it"},
+ {"Dynamite: Collect it and use it to",        "destroy walls or kill enemies"},
+ {"Dynamite: This one explodes after", "a few seconds"},
+ {"Dyna Bomb: Explodes in 4 directions","with variable explosion size"},
+ {"Dyna Bomb: Increases the number of",        "dyna bombs available at a time"},
+ {"Dyna Bomb: Increases the size of",  "explosion of dyna bombs"},
+ {"Spaceship: Moves at the left side", "of walls; don't touch it!"},
+ {"Bug: Moves at the right side",      "of walls; don't touch it!"},
+ {"Butterfly: Moves at the right side",        "of walls; don't touch it!"},
+ {"Firefly: Moves at the left side",   "of walls; don't touch it!"},
+ {"Pacman: Eats the amoeba and you,",  "if you're not careful"},
+ {"Cruncher: Eats diamonds and you,",  "if you're not careful"},
+ {"Cruncher (BD style):",              "Eats almost everything"},
+ {"Robot: Tries to kill the player",   ""},
+ {"The mole: You must guide him savely","to the exit; he will follow you"},
+ {"The penguin: Guide him to the exit,","but keep him away from monsters!"},
+ {"The Pig: Harmless, but eats all",   "gems it can get"},
+ {"The Dragon: Breathes fire,",                "especially to some monsters"},
+ {"Sonde: Follows you everywhere;",    "harmless, but may block your way"},
+ {"Magic Wheel: Touch it to get rid of","the robots for some seconds"},
+ {"Light Bulb: All of them must be",   "switched on to finish a level"},
+ {"Extra Time Orb: Adds some seconds", "to the time available for the level"},
+ {"Amoeba Drop: Grows to an amoeba on",        "the ground - don't touch it"},
+ {"Dead Amoeba: Does not grow, but",   "can still kill bugs and spaceships"},
+ {"Normal Amoeba: Grows through empty",        "fields, sand and quicksand"},
+ {"Dropping Amoeba: This one makes",   "drops that grow to a new amoeba"},
+ {"Living Amoeba (BD style): Contains",        "other element, when surrounded"},
+ {"Game Of Life: Behaves like the well","known 'Game Of Life' (2333 style)"},
+ {"Biomaze: A bit like the 'Game Of",  "Life', but builds crazy mazes"},
+ {"Magic Wall: Changes rocks, emeralds","and diamonds when they pass it"},
+ {"Magic Wall (BD style):",            "Changes rocks and BD style diamonds"},
+ {"Exit door: Opens if you have enough","emeralds to finish the level"},
+ {"Open exit door: Enter here to leave","the level and exit the actual game"},
 };
 static int num_helpscreen_els = sizeof(helpscreen_eltext)/(2*sizeof(char *));
 
 static char *helpscreen_music[][3] =
 {
-  "Alchemy",                   "Ian Boddy",            "Drive",
-  "The Chase",                 "Propaganda",           "A Secret Wish",
-  "Network 23",                        "Tangerine Dream",      "Exit",
-  "Czardasz",                  "Robert Pieculewicz",   "Czardasz",
-  "21st Century Common Man",   "Tangerine Dream",      "Tyger",
-  "Voyager",                   "The Alan Parsons Project","Pyramid",
-  "Twilight Painter",          "Tangerine Dream",      "Heartbreakers"
+  { "Alchemy",                 "Ian Boddy",            "Drive" },
+  { "The Chase",               "Propaganda",           "A Secret Wish" },
+  { "Network 23",              "Tangerine Dream",      "Exit" },
+  { "Czardasz",                        "Robert Pieculewicz",   "Czardasz" },
+  { "21st Century Common Man", "Tangerine Dream",      "Tyger" },
+  { "Voyager",                 "The Alan Parsons Project","Pyramid" },
+  { "Twilight Painter",                "Tangerine Dream",      "Heartbreakers" }
 };
 static int helpscreen_musicpos;
 
 void DrawHelpScreenElAction(int start)
 {
   int i = 0, j = 0;
-  int frame, delay, graphic;
+  int frame, graphic;
   int xstart = SX+16, ystart = SY+64+2*32, ystep = TILEY+4;
 
   while(helpscreen_action[j] != HA_END)
@@ -355,8 +470,7 @@ void DrawHelpScreenElAction(int start)
       helpscreen_frame[i-start] = helpscreen_action[j++]-1;
     }
 
-    delay = helpscreen_action[j++];
-    helpscreen_delay[i-start] = delay;
+    helpscreen_delay[i-start] = helpscreen_action[j++] - 1;
 
     if (helpscreen_action[j] == HA_NEXT)
     {
@@ -372,15 +486,15 @@ void DrawHelpScreenElAction(int start)
     }
     j++;
 
-    DrawGraphicExtHiRes(drawto,gc,xstart,ystart+(i-start)*ystep,
-                       graphic+frame);
+    DrawGraphicExt(drawto, gc, xstart, ystart+(i-start)*ystep, graphic+frame);
     i++;
   }
 
-  redraw_tiles += 28;
   for(i=2;i<16;i++)
-    redraw[0][i] = redraw[1][i] = TRUE;
-  redraw_mask |= REDRAW_TILES;
+  {
+    MarkTileDirty(0,i);
+    MarkTileDirty(1,i);
+  }
 }
 
 void DrawHelpScreenElText(int start)
@@ -390,9 +504,7 @@ void DrawHelpScreenElText(int start)
   char text[FULL_SXSIZE/FONT2_XSIZE+10];
 
   ClearWindow();
-  DrawText(SX+16, SY+8,  "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
-  DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
-          FS_SMALL,FC_RED);
+  DrawHeadline();
 
   sprintf(text,"The game elements:");
   DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
@@ -418,9 +530,7 @@ void DrawHelpScreenMusicText(int num)
 
   FadeSounds();
   ClearWindow();
-  DrawText(SX+16, SY+8,  "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
-  DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
-          FS_SMALL,FC_RED);
+  DrawHeadline();
 
   sprintf(text,"The game background music loops:");
   DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
@@ -452,23 +562,52 @@ void DrawHelpScreenMusicText(int num)
   PlaySoundLoop(background_loop[num]);
 }
 
-void DrawHelpScreenRegistrationText()
+void DrawHelpScreenCreditsText()
 {
   int ystart = 150, ystep = 30;
   char text[FULL_SXSIZE/FONT2_XSIZE+10];
 
   FadeSounds();
   ClearWindow();
-  DrawText(SX+16, SY+8,  "ROCKS'N'DIAMONDS",FS_BIG,FC_YELLOW);
-  DrawText(SX+25+16, SY+46, "Copyright ^1995 by Holger Schemel",
-          FS_SMALL,FC_RED);
+  DrawHeadline();
 
-  sprintf(text,"Registration information:");
+  sprintf(text,"Program information:");
   DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+100,
           text,FS_SMALL,FC_GREEN);
 
-  sprintf(text,"Unregistered version");
+  sprintf(text,"This game is Freeware!");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+0*ystep,
+          text,FS_SMALL,FC_YELLOW);
+  sprintf(text,"If you like it, send e-mail to:");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+1*ystep,
+          text,FS_SMALL,FC_YELLOW);
+  sprintf(text,"aeglos@valinor.owl.de");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+2*ystep,
+          text,FS_SMALL,FC_RED);
+  sprintf(text,"or SnailMail to:");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+3*ystep,
+          text,FS_SMALL,FC_YELLOW);
+  sprintf(text,"Holger Schemel");
   DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep,
+          text,FS_SMALL,FC_RED);
+  sprintf(text,"Sennehof 28");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep+20,
+          text,FS_SMALL,FC_RED);
+  sprintf(text,"33659 Bielefeld");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep+40,
+          text,FS_SMALL,FC_RED);
+  sprintf(text,"Germany");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+4*ystep+60,
+          text,FS_SMALL,FC_RED);
+
+  sprintf(text,"If you have created new levels,");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+7*ystep,
+          text,FS_SMALL,FC_YELLOW);
+  sprintf(text,"send them to me to include them!");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+8*ystep,
+          text,FS_SMALL,FC_YELLOW);
+  sprintf(text,":-)");
+  DrawText(SX+(SXSIZE-strlen(text)*FONT2_XSIZE)/2,SY+ystart+9*ystep,
           text,FS_SMALL,FC_YELLOW);
 
   sprintf(text,"Press any key or button for main menu");
@@ -520,7 +659,7 @@ void HandleHelpScreen(int button)
     else if (helpscreen_state==num_helpscreen_els_pages+num_bg_loops-1)
     {
       helpscreen_state++;
-      DrawHelpScreenRegistrationText();
+      DrawHelpScreenCreditsText();
     }
     else
     {
@@ -531,7 +670,7 @@ void HandleHelpScreen(int button)
   }
   else
   {
-    if (DelayReached(&hs_delay,3))
+    if (DelayReached(&hs_delay,GAME_FRAME_DELAY * 2))
     {
       if (helpscreen_state<num_helpscreen_els_pages)
        DrawHelpScreenElAction(helpscreen_state*MAX_HELPSCREEN_ELS);
@@ -544,15 +683,17 @@ void HandleHelpScreen(int button)
 
 void CheckCheat()
 {
-  int old_handicap = player.handicap;
+  int old_handicap = local_player->handicap;
 
-  if (!strcmp(player.alias_name,"Artsoft"))
-    player.handicap = MAX(0,leveldir[leveldir_nr].num_ready-1);
+#if 0
+  if (!strcmp(local_player->alias_name,"Artsoft"))
+#endif
+    local_player->handicap = leveldir[leveldir_nr].levels-1;
 
-  if (player.handicap != old_handicap)
+  if (local_player->handicap != old_handicap)
   {
     SavePlayerInfo(PLAYER_LEVEL);
-    level_nr = player.handicap;
+    level_nr = local_player->handicap;
   }
 }
 
@@ -564,11 +705,12 @@ void HandleTypeName(int newxpos, KeySym key)
   if (newxpos)
   {
     xpos = newxpos;
-    DrawText(SX+6*32,SY+ypos*32,player.alias_name,FS_BIG,FC_YELLOW);
+    DrawText(SX+6*32, SY+ypos*32, local_player->alias_name, FS_BIG, FC_YELLOW);
     DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
     return;
   }
 
+#ifndef MSDOS
   if ((key>=XK_A && key<=XK_Z) || (key>=XK_a && key<=XK_z && 
       xpos<MAX_NAMELEN-1))
   {
@@ -576,31 +718,38 @@ void HandleTypeName(int newxpos, KeySym key)
       ascii = 'A'+(char)(key-XK_A);
     if (key>=XK_a && key<=XK_z)
       ascii = 'a'+(char)(key-XK_a);
-    player.alias_name[xpos] = ascii;
-    player.alias_name[xpos+1] = 0;
+#else
+  if((ascii = get_ascii(key)) && xpos<MAX_NAMELEN-1)
+  {
+#endif
+    local_player->alias_name[xpos] = ascii;
+    local_player->alias_name[xpos+1] = 0;
     xpos++;
     DrawTextExt(drawto,gc,SX+6*32,SY+ypos*32,
-               player.alias_name,FS_BIG,FC_YELLOW);
+               local_player->alias_name,FS_BIG,FC_YELLOW);
     DrawTextExt(window,gc,SX+6*32,SY+ypos*32,
-               player.alias_name,FS_BIG,FC_YELLOW);
+               local_player->alias_name,FS_BIG,FC_YELLOW);
     DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
   }
-  else if (key==XK_Delete && xpos>0)
+  else if ((key==XK_Delete || key==XK_BackSpace) && xpos>0)
   {
-    player.alias_name[xpos] = 0;
     xpos--;
+    local_player->alias_name[xpos] = 0;
     DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
     DrawGraphic(xpos+7,ypos,GFX_LEERRAUM);
   }
   else if (key==XK_Return && xpos>0)
   {
-    DrawText(SX+6*32,SY+ypos*32,player.alias_name,FS_BIG,FC_RED);
+    DrawText(SX+6*32,SY+ypos*32,local_player->alias_name,FS_BIG,FC_RED);
     DrawGraphic(xpos+6,ypos,GFX_LEERRAUM);
     SavePlayerInfo(PLAYER_SETUP);
     CheckCheat();
 
     game_status = MAINMENU;
+/*
     DrawMainMenu();
+*/
+
   }
   BackToFront();
 }
@@ -609,6 +758,8 @@ void DrawChooseLevel()
 {
   int i;
 
+  CloseDoor(DOOR_CLOSE_2);
+
   ClearWindow();
   DrawText(SX,SY,"Level Directories",FS_BIG,FC_GREEN);
   for(i=0;i<num_leveldirs;i++)
@@ -619,7 +770,7 @@ void DrawChooseLevel()
 
   FadeToFront();
   InitAnimation();
-  HandleChooseLevel(0,0,0,0,MB_MENU_MARK);
+  HandleChooseLevel(0,0,0,0,MB_MENU_INITIALIZE);
 }
 
 void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
@@ -628,12 +779,21 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
   static int redraw = TRUE;
   int x = (mx+32-SX)/32, y = (my+32-SY)/32;
 
+  if (button == MB_MENU_INITIALIZE)
+  {
+    redraw = TRUE;
+    choice = leveldir_nr + 3;
+  }
+
   if (redraw)
   {
     DrawGraphic(0,choice-1,GFX_KUGEL_ROT);
     redraw = FALSE;
   }
 
+  if (button == MB_MENU_INITIALIZE)
+    return;
+
   if (dx || dy)
   {
     if (dy)
@@ -669,11 +829,14 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
     }
     else
     {
-      player.leveldir_nr = leveldir_nr = y-3;
+      local_player->leveldir_nr = leveldir_nr = y-3;
       LoadPlayerInfo(PLAYER_LEVEL);
       SavePlayerInfo(PLAYER_SETUP);
       CheckCheat();
 
+      TapeErase();
+      LoadLevelTape(level_nr);
+
       game_status = MAINMENU;
       DrawMainMenu();
       redraw = TRUE;
@@ -732,70 +895,56 @@ void HandleHallOfFame(int button)
 void DrawSetupScreen()
 {
   int i;
+  static struct setup
+  {
+    unsigned int bit;
+    char *text, *mode[2];
+    int color[2];
+  } setup[] =
+  {
+    {SETUP_SOUND,      "Sound:",       {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_SOUND_LOOPS,        " Sound Loops:",{"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_SOUND_MUSIC,        " Game Music:", {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_TOONS,      "Toons:",       {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_DIRECT_DRAW,        "Buffered gfx:",{"off","on" },  {FC_BLUE,FC_YELLOW}},
+    {SETUP_SCROLL_DELAY,"Scroll Delay:",{"on", "off"}, {FC_YELLOW,FC_BLUE}},
+    {SETUP_SOFT_SCROLL,        "Soft Scroll.:",{"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_FADING,     "Fading:",      {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_QUICK_DOORS,        "Quick Doors:", {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_AUTO_RECORD,        "Auto-Record:", {"on", "off"},  {FC_YELLOW,FC_BLUE}},
+    {SETUP_2ND_JOYSTICK,"Joystick:",   {"2nd","1st"},  {FC_YELLOW,FC_YELLOW}},
+    {0,                        "Cal. Joystick",{"",   ""},     {0,0}},
+    {0,                        "",             {"",   ""},     {0,0}},
+    {0,                        "Exit",         {"",   ""},     {0,0}},
+    {0,                        "Save and exit",{"",   ""},     {0,0}}
+  };
 
   CloseDoor(DOOR_CLOSE_2);
-
   ClearWindow();
   DrawText(SX+16, SY+16,  "SETUP",FS_BIG,FC_YELLOW);
-  DrawText(SX+32, SY+2*32,"Sound:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+3*32,"Sound loops:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+4*32,"Game music:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+5*32,"Toons:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+6*32,"Buffered gfx:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+7*32,"Fading:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+8*32,"Auto-Record:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+9*32,"Joystick:",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+10*32,"Cal. Joystick",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+12*32,"Exit",FS_BIG,FC_GREEN);
-  DrawText(SX+32, SY+13*32,"Save and exit",FS_BIG,FC_GREEN);
-
-  if (SETUP_SOUND_ON(player.setup))
-    DrawText(SX+14*32, SY+2*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+2*32,"off",FS_BIG,FC_BLUE);
-
-  if (SETUP_SOUND_LOOPS_ON(player.setup))
-    DrawText(SX+14*32, SY+3*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+3*32,"off",FS_BIG,FC_BLUE);
 
-  if (SETUP_SOUND_MUSIC_ON(player.setup))
-    DrawText(SX+14*32, SY+4*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+4*32,"off",FS_BIG,FC_BLUE);
-
-  if (SETUP_TOONS_ON(player.setup))
-    DrawText(SX+14*32, SY+5*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+5*32,"off",FS_BIG,FC_BLUE);
-
-  if (!SETUP_DIRECT_DRAW_ON(player.setup))
-    DrawText(SX+14*32, SY+6*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+6*32,"off",FS_BIG,FC_BLUE);
-
-  if (SETUP_FADING_ON(player.setup))
-    DrawText(SX+14*32, SY+7*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+7*32,"off",FS_BIG,FC_BLUE);
-
-  if (SETUP_RECORD_EACH_GAME_ON(player.setup))
-    DrawText(SX+14*32, SY+8*32,"on",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+8*32,"off",FS_BIG,FC_BLUE);
-
-  if (SETUP_2ND_JOYSTICK_ON(player.setup))
-    DrawText(SX+14*32, SY+9*32,"2nd",FS_BIG,FC_YELLOW);
-  else
-    DrawText(SX+14*32, SY+9*32,"1st",FS_BIG,FC_YELLOW);
+  for(i=SETUP_SCREEN_POS_START;i<=SETUP_SCREEN_POS_END;i++)
+  {
+    int base = i - SETUP_SCREEN_POS_START;
 
-  for(i=2;i<14;i++)
-    if (i!=11)
+    if (i != SETUP_SCREEN_POS_EMPTY)
+    {
       DrawGraphic(0,i,GFX_KUGEL_BLAU);
+      DrawText(SX+32,SY+i*32, setup[base].text, FS_BIG,FC_GREEN);
+    }
+
+    if (i < SETUP_SCREEN_POS_EMPTY)
+    {
+      int setting_bit = setup[base].bit;
+      int setting_pos = ((local_player->setup & setting_bit) != 0 ? 0 : 1);
+      DrawText(SX+14*32, SY+i*32,setup[base].mode[setting_pos],
+              FS_BIG,setup[base].color[setting_pos]);
+    }
+  }
 
   FadeToFront();
   InitAnimation();
-  HandleSetupScreen(0,0,0,0,MB_MENU_MARK);
+  HandleSetupScreen(0,0,0,0,MB_MENU_INITIALIZE);
 }
 
 void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
@@ -803,6 +952,12 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
   static int choice = 3;
   static int redraw = TRUE;
   int x = (mx+32-SX)/32, y = (my+32-SY)/32;
+  int pos_start = SETUP_SCREEN_POS_START + 1;
+  int pos_empty = SETUP_SCREEN_POS_EMPTY + 1;
+  int pos_end   = SETUP_SCREEN_POS_END   + 1;
+
+  if (button == MB_MENU_INITIALIZE)
+    redraw = TRUE;
 
   if (redraw)
   {
@@ -810,6 +965,9 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     redraw = FALSE;
   }
 
+  if (button == MB_MENU_INITIALIZE)
+    return;
+
   if (dx || dy)
   {
     if (dy)
@@ -820,13 +978,13 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     else
       x = y = 0;
 
-    if (y==12)
-      y = (dy>0 ? 13 : 11);
+    if (y == pos_empty)
+      y = (dy>0 ? pos_empty+1 : pos_empty-1);
 
-    if (y<3)
-      y = 3;
-    else if (y>14)
-      y = 14;
+    if (y < pos_start)
+      y = pos_start;
+    else if (y > pos_end)
+      y = pos_end;
   }
 
   if (!mx && !my && !dx && !dy)
@@ -835,7 +993,7 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     y = choice;
   }
 
-  if (x==1 && y>=3 && y<=14 && y!=12)
+  if (x==1 && y>=pos_start && y<=pos_end && y!=pos_empty)
   {
     if (button)
     {
@@ -852,76 +1010,114 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
 
       if (y==3 && sound_status==SOUND_AVAILABLE)
       {
-       if (SETUP_SOUND_ON(player.setup))
+       if (SETUP_SOUND_ON(local_player->setup))
+       {
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+         DrawText(SX+14*32, SY+(yy+1)*32,"off",FS_BIG,FC_BLUE);
+         DrawText(SX+14*32, SY+(yy+2)*32,"off",FS_BIG,FC_BLUE);
+         local_player->setup &= ~SETUP_SOUND_LOOPS;
+         local_player->setup &= ~SETUP_SOUND_MUSIC;
+       }
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_SOUND;
+       local_player->setup ^= SETUP_SOUND;
       }
       else if (y==4 && sound_loops_allowed)
       {
-       if (SETUP_SOUND_LOOPS_ON(player.setup))
+       if (SETUP_SOUND_LOOPS_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
+       {
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_SOUND_LOOPS;
+         DrawText(SX+14*32, SY+(yy-1)*32,"on ",FS_BIG,FC_YELLOW);
+         local_player->setup |= SETUP_SOUND;
+       }
+       local_player->setup ^= SETUP_SOUND_LOOPS;
       }
       else if (y==5 && sound_loops_allowed)
       {
-       if (SETUP_SOUND_MUSIC_ON(player.setup))
+       if (SETUP_SOUND_MUSIC_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
+       {
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_SOUND_MUSIC;
+         DrawText(SX+14*32, SY+(yy-2)*32,"on ",FS_BIG,FC_YELLOW);
+         local_player->setup |= SETUP_SOUND;
+       }
+       local_player->setup ^= SETUP_SOUND_MUSIC;
       }
       else if (y==6)
       {
-       if (SETUP_TOONS_ON(player.setup))
+       if (SETUP_TOONS_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_TOONS;
+       local_player->setup ^= SETUP_TOONS;
       }
       else if (y==7)
       {
-       if (!SETUP_DIRECT_DRAW_ON(player.setup))
+       if (!SETUP_DIRECT_DRAW_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_DIRECT_DRAW;
+       local_player->setup ^= SETUP_DIRECT_DRAW;
       }
       else if (y==8)
       {
-       if (SETUP_FADING_ON(player.setup))
+       if (SETUP_SCROLL_DELAY_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_FADING;
+       local_player->setup ^= SETUP_SCROLL_DELAY;
       }
       else if (y==9)
       {
-       if (SETUP_RECORD_EACH_GAME_ON(player.setup))
+       if (SETUP_SOFT_SCROLL_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_RECORD_EACH_GAME;
+       local_player->setup ^= SETUP_SOFT_SCROLL;
       }
       else if (y==10)
       {
-       if (SETUP_2ND_JOYSTICK_ON(player.setup))
+       if (SETUP_FADING_ON(local_player->setup))
+         DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+       else
+         DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+       local_player->setup ^= SETUP_FADING;
+      }
+      else if (y==11)
+      {
+       if (SETUP_QUICK_DOORS_ON(local_player->setup))
+         DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+       else
+         DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+       local_player->setup ^= SETUP_QUICK_DOORS;
+      }
+      else if (y==12)
+      {
+       if (SETUP_AUTO_RECORD_ON(local_player->setup))
+         DrawText(SX+14*32, SY+yy*32,"off",FS_BIG,FC_BLUE);
+       else
+         DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
+       local_player->setup ^= SETUP_AUTO_RECORD;
+      }
+      else if (y==13)
+      {
+       if (SETUP_2ND_JOYSTICK_ON(local_player->setup))
          DrawText(SX+14*32, SY+yy*32,"1st",FS_BIG,FC_YELLOW);
        else
          DrawText(SX+14*32, SY+yy*32,"2nd",FS_BIG,FC_YELLOW);
-       player.setup ^= SETUP_2ND_JOYSTICK;
+       local_player->setup ^= SETUP_2ND_JOYSTICK;
       }
-      else if (y==11)
+      else if (y==14)
       {
        CalibrateJoystick();
        redraw = TRUE;
       }
-      else if (y==13 || y==14)
+      else if (y==pos_end-1 || y==pos_end)
       {
-        if (y==14)
+        if (y==pos_end)
        {
          SavePlayerInfo(PLAYER_SETUP);
          SaveJoystickData();
@@ -939,447 +1135,445 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     DoAnimation();
 }
 
+void CalibrateJoystick()
+{
+#ifdef __FreeBSD__
+  struct joystick joy_ctrl;
+#else
+  struct joystick_control
+  {
+    int buttons;
+    int x;
+    int y;
+  } joy_ctrl;
+#endif
+
+#ifdef MSDOS
+  char joy_nr[4];
+#endif
+
+  int new_joystick_xleft, new_joystick_xright, new_joystick_xmiddle;
+  int new_joystick_yupper, new_joystick_ylower, new_joystick_ymiddle;
+
+  if (joystick_status==JOYSTICK_OFF)
+    goto error_out;
+
+#ifndef MSDOS
+  ClearWindow();
+  DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+8*32, " THE UPPER LEFT ",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+9*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+#ifdef __FreeBSD__
+  joy_ctrl.b1 = joy_ctrl.b2 = 0;
+#else
+  joy_ctrl.buttons = 0;
+#endif
+  while(Joystick() & JOY_BUTTON);
+#ifdef __FreeBSD__
+  while(!(joy_ctrl.b1||joy_ctrl.b2))
+#else
+  while(!joy_ctrl.buttons)
+#endif
+  {
+    if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+    {
+      joystick_status=JOYSTICK_OFF;
+      goto error_out;
+    }
+    Delay(10);
+  }
+
+  new_joystick_xleft = joy_ctrl.x;
+  new_joystick_yupper = joy_ctrl.y;
+
+  ClearWindow();
+  DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
+  DrawText(SX+32, SY+8*32, "THE LOWER RIGHT",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+9*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+#ifdef __FreeBSD__
+  joy_ctrl.b1 = joy_ctrl.b2 = 0;
+#else
+  joy_ctrl.buttons = 0;
+#endif
+  while(Joystick() & JOY_BUTTON);
+#ifdef __FreeBSD__
+  while(!(joy_ctrl.b1||joy_ctrl.b2))
+#else
+  while(!joy_ctrl.buttons)
+#endif
+  {
+    if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+    {
+      joystick_status=JOYSTICK_OFF;
+      goto error_out;
+    }
+    Delay(10);
+  }
+
+  new_joystick_xright = joy_ctrl.x;
+  new_joystick_ylower = joy_ctrl.y;
+
+  ClearWindow();
+  DrawText(SX+32, SY+16+7*32, "CENTER JOYSTICK",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+16+8*32, "AND PRESS BUTTON",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+#ifdef __FreeBSD__
+  joy_ctrl.b1 = joy_ctrl.b2 = 0;
+#else
+  joy_ctrl.buttons = 0;
+#endif
+  while(Joystick() & JOY_BUTTON);
+#ifdef __FreeBSD__
+  while(!(joy_ctrl.b1||joy_ctrl.b2))
+#else
+  while(!joy_ctrl.buttons)
+#endif
+  {
+    if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+    {
+      joystick_status=JOYSTICK_OFF;
+      goto error_out;
+    }
+    Delay(10);
+  }
+
+  new_joystick_xmiddle = joy_ctrl.x;
+  new_joystick_ymiddle = joy_ctrl.y;
+
+  joystick[setup.joystick_nr].xleft = new_joystick_xleft;
+  joystick[setup.joystick_nr].yupper = new_joystick_yupper;
+  joystick[setup.joystick_nr].xright = new_joystick_xright;
+  joystick[setup.joystick_nr].ylower = new_joystick_ylower;
+  joystick[setup.joystick_nr].xmiddle = new_joystick_xmiddle;
+  joystick[setup.joystick_nr].ymiddle = new_joystick_ymiddle;
+
+  CheckJoystickData();
+
+  DrawSetupScreen();
+  while(Joystick() & JOY_BUTTON);
+  return;
+
+#endif
+  error_out:
+
+#ifdef MSDOS
+  joy_nr[0] = '#';
+  joy_nr[1] = SETUP_2ND_JOYSTICK_ON(local_player->setup)+49;
+  joy_nr[2] = '\0';
+
+  remove_joystick();
+  ClearWindow();
+  DrawText(SX+32, SY+7*32, "CENTER JOYSTICK",FS_BIG,FC_YELLOW);
+  DrawText(SX+16+7*32, SY+8*32, joy_nr, FS_BIG,FC_YELLOW);
+  DrawText(SX+32, SY+9*32, "AND PRESS A KEY",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+  for(clear_keybuf();!keypressed(););
+  install_joystick(JOY_TYPE_2PADS);
+
+  ClearWindow();
+  DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+8*32, " THE UPPER LEFT ",FS_BIG,FC_YELLOW);
+  DrawText(SX+32, SY+9*32, "AND PRESS A KEY",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+  for(clear_keybuf();!keypressed(););
+  calibrate_joystick(SETUP_2ND_JOYSTICK_ON(local_player->setup));
+
+  ClearWindow();
+  DrawText(SX+16, SY+7*32, "MOVE JOYSTICK TO",FS_BIG,FC_YELLOW);
+  DrawText(SX+32, SY+8*32, "THE LOWER RIGHT",FS_BIG,FC_YELLOW);
+  DrawText(SX+32, SY+9*32, "AND PRESS A KEY",FS_BIG,FC_YELLOW);
+  BackToFront();
+
+  for(clear_keybuf();!keypressed(););
+  calibrate_joystick(SETUP_2ND_JOYSTICK_ON(local_player->setup));
+
+  DrawSetupScreen();
+  return;
+#endif
+
+  ClearWindow();
+  DrawText(SX+16, SY+16, "NO JOYSTICK",FS_BIG,FC_YELLOW);
+  DrawText(SX+16, SY+48, " AVAILABLE ",FS_BIG,FC_YELLOW);
+  BackToFront();
+  Delay(3000);
+  DrawSetupScreen();
+}
+
+void HandleGameActions(byte player_action)
+{
+  if (game_status != PLAYING)
+    return;
+
+  if (local_player->LevelSolved)
+    GameWon();
+
+  if (AllPlayersGone && !TAPE_IS_STOPPED(tape))
+    TapeStop();
+
+  GameActions(player_action);
+
+  BackToFront();
+}
+
 void HandleVideoButtons(int mx, int my, int button)
 {
-  if (game_status!=MAINMENU && game_status!=PLAYING)
+  if (game_status != MAINMENU && game_status != PLAYING)
     return;
 
   switch(CheckVideoButtons(mx,my,button))
   {
     case BUTTON_VIDEO_EJECT:
       TapeStop();
-      if (!TAPE_IS_EMPTY(tape))
-       SaveLevelTape(tape.level_nr);
+      if (TAPE_IS_EMPTY(tape))
+      {
+       LoadLevelTape(level_nr);
+       if (TAPE_IS_EMPTY(tape))
+         Request("No tape for this level !",REQ_CONFIRM);
+      }
       else
-       AreYouSure("Tape is empty !",AYS_CONFIRM);
+      {
+       if (tape.changed)
+         SaveLevelTape(tape.level_nr);
+       TapeErase();
+      }
       DrawCompleteVideoDisplay();
       break;
+
     case BUTTON_VIDEO_STOP:
       TapeStop();
       break;
+
     case BUTTON_VIDEO_PAUSE:
       TapeTogglePause();
       break;
+
     case BUTTON_VIDEO_REC:
-      if (tape.pausing)
-       TapeTogglePause();
-      else if (game_status==MAINMENU)
-       TapeInitRecording();
+      if (TAPE_IS_STOPPED(tape))
+      {
+       TapeStartRecording();
+
+       if (options.network)
+         SendToServer_StartPlaying();
+       else
+       {
+         game_status = PLAYING;
+         InitGame();
+       }
+      }
+      else if (tape.pausing)
+      {
+       if (tape.playing)       /* PLAYING -> PAUSING -> RECORDING */
+       {
+         tape.pos[tape.counter].delay = tape.delay_played;
+         tape.playing = FALSE;
+         tape.recording = TRUE;
+         tape.changed = TRUE;
+
+         DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON,0);
+       }
+       else
+         TapeTogglePause();
+      }
       break;
+
     case BUTTON_VIDEO_PLAY:
-      if (tape.pausing)
-       TapeTogglePause();
-      else if (game_status==MAINMENU)
-       TapeInitPlaying();
+      if (TAPE_IS_EMPTY(tape))
+       break;
+
+      if (TAPE_IS_STOPPED(tape))
+      {
+       TapeStartPlaying();
+
+       game_status = PLAYING;
+       InitGame();
+      }
+      else if (tape.playing)
+      {
+       if (tape.pausing)                       /* PAUSE -> PLAY */
+         TapeTogglePause();
+       else if (!tape.fast_forward)            /* PLAY -> FAST FORWARD PLAY */
+       {
+         tape.fast_forward = TRUE;
+         DrawVideoDisplay(VIDEO_STATE_FFWD_ON, 0);
+       }
+       else if (!tape.pause_before_death)      /* FFWD PLAY -> + AUTO PAUSE */
+       {
+         tape.pause_before_death = TRUE;
+         DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, VIDEO_DISPLAY_LABEL_ONLY);
+       }
+       else                                    /* -> NORMAL PLAY */
+       {
+         tape.fast_forward = FALSE;
+         tape.pause_before_death = FALSE;
+         DrawVideoDisplay(VIDEO_STATE_FFWD_OFF | VIDEO_STATE_PAUSE_OFF, 0);
+       }
+      }
       break;
+
     default:
       break;
   }
+
+  BackToFront();
 }
 
 void HandleSoundButtons(int mx, int my, int button)
 {
-  if (game_status!=PLAYING)
+  if (game_status != PLAYING)
     return;
 
   switch(CheckSoundButtons(mx,my,button))
   {
     case BUTTON_SOUND_MUSIC:
-      if (sound_music_on)
+      if (setup.sound_music_on)
       { 
-       sound_music_on = FALSE;
-       player.setup &= ~SETUP_SOUND_MUSIC;
+       setup.sound_music_on = FALSE;
+       local_player->setup &= ~SETUP_SOUND_MUSIC;
        FadeSound(background_loop[level_nr % num_bg_loops]);
        DrawSoundDisplay(BUTTON_SOUND_MUSIC_OFF);
       }
       else if (sound_loops_allowed)
       { 
-       sound_music_on = TRUE;
-       player.setup |= SETUP_SOUND_MUSIC;
+       setup.sound_on = setup.sound_music_on = TRUE;
+       local_player->setup |= (SETUP_SOUND | SETUP_SOUND_MUSIC);
        PlaySoundLoop(background_loop[level_nr % num_bg_loops]);
        DrawSoundDisplay(BUTTON_SOUND_MUSIC_ON);
       }
       else
        DrawSoundDisplay(BUTTON_SOUND_MUSIC_OFF);
       break;
+
     case BUTTON_SOUND_LOOPS:
-      if (sound_loops_on)
+      if (setup.sound_loops_on)
       { 
-       sound_loops_on = FALSE;
-       player.setup &= ~SETUP_SOUND_LOOPS;
+       setup.sound_loops_on = FALSE;
+       local_player->setup &= ~SETUP_SOUND_LOOPS;
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
       }
       else if (sound_loops_allowed)
       { 
-       sound_loops_on = TRUE;
-       player.setup |= SETUP_SOUND_LOOPS;
+       setup.sound_on = setup.sound_loops_on = TRUE;
+       local_player->setup |= (SETUP_SOUND | SETUP_SOUND_LOOPS);
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_ON);
       }
       else
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
       break;
-    case BUTTON_SOUND_SOUND:
-      if (sound_on)
+
+    case BUTTON_SOUND_SIMPLE:
+      if (setup.sound_simple_on)
       { 
-       sound_on = FALSE;
-       player.setup &= ~SETUP_SOUND;
-       DrawSoundDisplay(BUTTON_SOUND_SOUND_OFF);
+       setup.sound_simple_on = FALSE;
+       local_player->setup &= ~SETUP_SOUND;
+       DrawSoundDisplay(BUTTON_SOUND_SIMPLE_OFF);
       }
       else if (sound_status==SOUND_AVAILABLE)
       { 
-       sound_on = TRUE;
-       player.setup |= SETUP_SOUND;
-       DrawSoundDisplay(BUTTON_SOUND_SOUND_ON);
+       setup.sound_on = setup.sound_simple_on = TRUE;
+       local_player->setup |= SETUP_SOUND;
+       DrawSoundDisplay(BUTTON_SOUND_SIMPLE_ON);
       }
       else
-       DrawSoundDisplay(BUTTON_SOUND_SOUND_OFF);
+       DrawSoundDisplay(BUTTON_SOUND_SIMPLE_OFF);
       break;
+
     default:
       break;
   }
+
+  BackToFront();
 }
 
 void HandleGameButtons(int mx, int my, int button)
 {
-  if (game_status!=PLAYING)
+  if (game_status != PLAYING)
     return;
 
   switch(CheckGameButtons(mx,my,button))
   {
     case BUTTON_GAME_STOP:
-      if (AreYouSure("Do you really want to quit the game ?",
-                     AYS_ASK | AYS_STAY_CLOSED))
-      { 
+      if (AllPlayersGone)
+      {
+       CloseDoor(DOOR_CLOSE_1);
        game_status = MAINMENU;
        DrawMainMenu();
+       break;
+      }
+
+      if (Request("Do you really want to quit the game ?",
+                 REQ_ASK | REQ_STAY_CLOSED))
+      { 
+       if (options.network)
+         SendToServer_StopPlaying();
+       else
+       {
+         game_status = MAINMENU;
+         DrawMainMenu();
+       }
       }
       else
        OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
       break;
+
     case BUTTON_GAME_PAUSE:
+      if (options.network)
+      {
+       if (tape.pausing)
+         SendToServer_ContinuePlaying();
+       else
+         SendToServer_PausePlaying();
+      }
+      else
+       TapeTogglePause();
+
+      /*
       if (tape.pausing)
       {
-       tape.pausing = FALSE;
-       DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
+       if (options.network)
+         SendToServer_ContinuePlaying();
+       else
+       {
+         tape.pausing = FALSE;
+         DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
+       }
       }
       else
       {
-       tape.pausing = TRUE;
-       DrawVideoDisplay(VIDEO_STATE_PAUSE_ON,0);
+       if (options.network)
+         SendToServer_PausePlaying();
+       else
+       {
+         tape.pausing = TRUE;
+         DrawVideoDisplay(VIDEO_STATE_PAUSE_ON,0);
+       }
       }
+      */
+
       break;
+
     case BUTTON_GAME_PLAY:
       if (tape.pausing)
       {
-       tape.pausing = FALSE;
-       DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
+       if (options.network)
+         SendToServer_ContinuePlaying();
+       else
+       {
+         tape.pausing = FALSE;
+         DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
+       }
       }
       break;
+
     default:
       break;
   }
-}
-
-int CheckVideoButtons(int mx, int my, int button)
-{
-  int return_code = 0;
-  static int choice = -1;
-  static BOOL pressed = FALSE;
-  static int video_button[5] =
-  {
-    VIDEO_PRESS_EJECT_ON,
-    VIDEO_PRESS_STOP_ON,
-    VIDEO_PRESS_PAUSE_ON,
-    VIDEO_PRESS_REC_ON,
-    VIDEO_PRESS_PLAY_ON
-  };
-
-  if (button)
-  {
-    if (!motion_status)                /* Maustaste neu gedrückt */
-    {
-      if (ON_VIDEO_BUTTON(mx,my))
-      {
-       choice = VIDEO_BUTTON(mx);
-       pressed = TRUE;
-       DrawVideoDisplay(video_button[choice],0);
-      }
-    }
-    else                       /* Mausbewegung bei gedrückter Maustaste */
-    {
-      if ((!ON_VIDEO_BUTTON(mx,my) || VIDEO_BUTTON(mx)!=choice) &&
-         choice>=0 && pressed)
-      {
-       pressed = FALSE;
-       DrawVideoDisplay(video_button[choice]<<1,0);
-      }
-      else if (ON_VIDEO_BUTTON(mx,my) && VIDEO_BUTTON(mx)==choice && !pressed)
-      {
-       pressed = TRUE;
-       DrawVideoDisplay(video_button[choice],0);
-      }
-    }
-  }
-  else                         /* Maustaste wieder losgelassen */
-  {
-    if (ON_VIDEO_BUTTON(mx,my) && VIDEO_BUTTON(mx)==choice && pressed)
-    {
-      DrawVideoDisplay(video_button[choice]<<1,0);
-      return_code = choice+1;
-      choice = -1;
-      pressed = FALSE;
-    }
-    else
-    {
-      choice = -1;
-      pressed = FALSE;
-    }
-  }
 
   BackToFront();
-  return(return_code);
-}
-
-int CheckSoundButtons(int mx, int my, int button)
-{
-  int return_code = 0;
-  static int choice = -1;
-  static BOOL 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);
-
-  if (button)
-  {
-    if (!motion_status)                /* Maustaste neu gedrückt */
-    {
-      if (ON_SOUND_BUTTON(mx,my))
-      {
-       choice = SOUND_BUTTON(mx);
-       pressed = TRUE;
-       DrawSoundDisplay(sound_state[choice] | BUTTON_PRESSED);
-      }
-    }
-    else                       /* Mausbewegung bei gedrückter Maustaste */
-    {
-      if ((!ON_SOUND_BUTTON(mx,my) || SOUND_BUTTON(mx)!=choice) &&
-         choice>=0 && pressed)
-      {
-       pressed = FALSE;
-       DrawSoundDisplay(sound_state[choice] | BUTTON_RELEASED);
-      }
-      else if (ON_SOUND_BUTTON(mx,my) && SOUND_BUTTON(mx)==choice && !pressed)
-      {
-       pressed = TRUE;
-       DrawSoundDisplay(sound_state[choice] | BUTTON_PRESSED);
-      }
-    }
-  }
-  else                         /* Maustaste wieder losgelassen */
-  {
-    if (ON_SOUND_BUTTON(mx,my) && SOUND_BUTTON(mx)==choice && pressed)
-    {
-      DrawSoundDisplay(sound_state[choice] | BUTTON_RELEASED);
-      return_code = 1<<choice;
-      choice = -1;
-      pressed = FALSE;
-    }
-    else
-    {
-      choice = -1;
-      pressed = FALSE;
-    }
-  }
-
-  BackToFront();
-  return(return_code);
-}
-
-int CheckGameButtons(int mx, int my, int button)
-{
-  int return_code = 0;
-  static int choice = -1;
-  static BOOL pressed = FALSE;
-  int game_state[3] =
-  {
-    BUTTON_GAME_STOP,
-    BUTTON_GAME_PAUSE,
-    BUTTON_GAME_PLAY
-  };
-
-  if (button)
-  {
-    if (!motion_status)                /* Maustaste neu gedrückt */
-    {
-      if (ON_GAME_BUTTON(mx,my))
-      {
-       choice = GAME_BUTTON(mx);
-       pressed = TRUE;
-       DrawGameButton(game_state[choice] | BUTTON_PRESSED);
-      }
-    }
-    else                       /* Mausbewegung bei gedrückter Maustaste */
-    {
-      if ((!ON_GAME_BUTTON(mx,my) || GAME_BUTTON(mx)!=choice) &&
-         choice>=0 && pressed)
-      {
-       pressed = FALSE;
-       DrawGameButton(game_state[choice] | BUTTON_RELEASED);
-      }
-      else if (ON_GAME_BUTTON(mx,my) && GAME_BUTTON(mx)==choice && !pressed)
-      {
-       pressed = TRUE;
-       DrawGameButton(game_state[choice] | BUTTON_PRESSED);
-      }
-    }
-  }
-  else                         /* Maustaste wieder losgelassen */
-  {
-    if (ON_GAME_BUTTON(mx,my) && GAME_BUTTON(mx)==choice && pressed)
-    {
-      DrawGameButton(game_state[choice] | BUTTON_RELEASED);
-      return_code = 1<<choice;
-      choice = -1;
-      pressed = FALSE;
-    }
-    else
-    {
-      choice = -1;
-      pressed = FALSE;
-    }
-  }
-
-  BackToFront();
-  return(return_code);
-}
-
-int CheckChooseButtons(int mx, int my, int button)
-{
-  int return_code = 0;
-  static int choice = -1;
-  static BOOL pressed = FALSE;
-  static int choose_button[5] =
-  {
-    BUTTON_OK,
-    BUTTON_NO
-  };
-
-  if (button)
-  {
-    if (!motion_status)                /* Maustaste neu gedrückt */
-    {
-      if (ON_CHOOSE_BUTTON(mx,my))
-      {
-       choice = CHOOSE_BUTTON(mx);
-       pressed = TRUE;
-       DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
-      }
-    }
-    else                       /* Mausbewegung bei gedrückter Maustaste */
-    {
-      if ((!ON_CHOOSE_BUTTON(mx,my) || CHOOSE_BUTTON(mx)!=choice) &&
-         choice>=0 && pressed)
-      {
-       pressed = FALSE;
-       DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
-      }
-      else if (ON_CHOOSE_BUTTON(mx,my) &&CHOOSE_BUTTON(mx)==choice && !pressed)
-      {
-       pressed = TRUE;
-       DrawChooseButton(choose_button[choice] | BUTTON_PRESSED);
-      }
-    }
-  }
-  else                         /* Maustaste wieder losgelassen */
-  {
-    if (ON_CHOOSE_BUTTON(mx,my) && CHOOSE_BUTTON(mx)==choice && pressed)
-    {
-      DrawChooseButton(choose_button[choice] | BUTTON_RELEASED);
-      return_code = choice+1;
-      choice = -1;
-      pressed = FALSE;
-    }
-    else
-    {
-      choice = -1;
-      pressed = FALSE;
-    }
-  }
-
-  BackToFront();
-  return(return_code);
-}
-
-int CheckConfirmButton(int mx, int my, int button)
-{
-  int return_code = 0;
-  static int choice = -1;
-  static BOOL pressed = FALSE;
-
-  if (button)
-  {
-    if (!motion_status)                /* Maustaste neu gedrückt */
-    {
-      if (ON_CONFIRM_BUTTON(mx,my))
-      {
-       choice = 0;
-       pressed = TRUE;
-       DrawConfirmButton(BUTTON_PRESSED);
-      }
-    }
-    else                       /* Mausbewegung bei gedrückter Maustaste */
-    {
-      if (!ON_CONFIRM_BUTTON(mx,my) && choice>=0 && pressed)
-      {
-       pressed = FALSE;
-       DrawConfirmButton(BUTTON_RELEASED);
-      }
-      else if (ON_CONFIRM_BUTTON(mx,my) && !pressed)
-      {
-       pressed = TRUE;
-       DrawConfirmButton(BUTTON_PRESSED);
-      }
-    }
-  }
-  else                         /* Maustaste wieder losgelassen */
-  {
-    if (ON_CONFIRM_BUTTON(mx,my) && pressed)
-    {
-      DrawConfirmButton(BUTTON_RELEASED);
-      return_code = BUTTON_CONFIRM;
-      choice = -1;
-      pressed = FALSE;
-    }
-    else
-    {
-      choice = -1;
-      pressed = FALSE;
-    }
-  }
-
-  BackToFront();
-  return(return_code);
-}
-
-void DrawCompleteVideoDisplay()
-{
-  XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-           DOOR_GFX_PAGEX3,DOOR_GFX_PAGEY2, VXSIZE,VYSIZE, VX,VY);
-  XCopyArea(display,pix[PIX_DOOR],drawto,gc,
-           DOOR_GFX_PAGEX4+VIDEO_CONTROL_XPOS,
-           DOOR_GFX_PAGEY2+VIDEO_CONTROL_YPOS,
-           VIDEO_CONTROL_XSIZE,VIDEO_CONTROL_YSIZE,
-           VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
-
-  DrawVideoDisplay(VIDEO_ALL_OFF,0);
-  if (tape.date && tape.length)
-  {
-    DrawVideoDisplay(VIDEO_STATE_DATE_ON,tape.date);
-    DrawVideoDisplay(VIDEO_STATE_TIME_ON,0);
-  }
-
-  XCopyArea(display,drawto,pix[PIX_DB_DOOR],gc,
-           VX,VY, VXSIZE,VYSIZE, DOOR_GFX_PAGEX1,DOOR_GFX_PAGEY2);
 }