rnd-19981108-2
[rocksndiamonds.git] / src / screens.c
index ab56a797895f45dd7832e58624089ee8e1fe4b06..139c6d9ca3f8d89569df3d3d612d19ae6d71bebc 100644 (file)
@@ -24,6 +24,7 @@
 #include "joystick.h"
 #include "cartoons.h"
 #include "network.h"
+#include "init.h"
 
 #ifdef MSDOS
 extern unsigned char get_ascii(KeySym);
@@ -43,6 +44,7 @@ void DrawHeadline()
 void DrawMainMenu()
 {
   int i;
+  char *name_text = (!options.network && setup.team_mode ? "Team:" : "Name:");
 
   FadeSounds();
   GetPlayerConfig();
@@ -50,8 +52,8 @@ void DrawMainMenu()
 
   ClearWindow();
   DrawHeadline();
-  DrawText(SX + 32,    SY + 2*32, "Name:", FS_BIG, FC_GREEN);
-  DrawText(SX + 6*32,  SY + 2*32, local_player->alias_name, FS_BIG, FC_RED);
+  DrawText(SX + 32,    SY + 2*32, name_text, FS_BIG, FC_GREEN);
+  DrawText(SX + 6*32,  SY + 2*32, setup.alias_name, FS_BIG, FC_RED);
   DrawText(SX + 32,    SY + 3*32, "Level:", FS_BIG, FC_GREEN);
   DrawText(SX + 11*32, SY + 3*32, int2str(level_nr,3), FS_BIG,
           (level_nr<leveldir[leveldir_nr].levels ? FC_RED : FC_YELLOW));
@@ -69,11 +71,17 @@ void DrawMainMenu()
   DrawGraphic(10,3,GFX_PFEIL_L);
   DrawGraphic(14,3,GFX_PFEIL_R);
 
-  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",
-          FS_SMALL,FC_BLUE);
+  DrawText(SX+56, SY+326, "A Game by Artsoft Entertainment",
+          FS_SMALL, FC_RED);
+
+  if (leveldir[leveldir_nr].name)
+  {
+    int len = strlen(leveldir[leveldir_nr].name);
+    int lxpos = SX+(SXSIZE-len*FONT4_XSIZE)/2;
+    int lypos = SY+352;
+
+    DrawText(lxpos,lypos,leveldir[leveldir_nr].name,FS_SMALL,FC_SPECIAL2);
+  }
 
   FadeToFront();
   InitAnimation();
@@ -81,7 +89,7 @@ void DrawMainMenu()
 
   TapeStop();
   if (TAPE_IS_EMPTY(tape))
-    LoadLevelTape(level_nr);
+    LoadTape(level_nr);
   DrawCompleteVideoDisplay();
 
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
@@ -151,9 +159,6 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
     level_nr = new_level_nr;
 
-    if (level_nr > local_player->handicap)
-      level_nr = local_player->handicap;
-
     DrawTextExt(drawto,gc,SX+11*32,SY+3*32,
                int2str(level_nr,3), FS_BIG,FC_RED);
     DrawTextExt(window,gc,SX+11*32,SY+3*32,
@@ -163,7 +168,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
     DrawMicroLevel(MICROLEV_XPOS,MICROLEV_YPOS);
 
     TapeErase();
-    LoadLevelTape(level_nr);
+    LoadTape(level_nr);
     DrawCompleteVideoDisplay();
 
     /* needed because DrawMicroLevel() takes some time */
@@ -187,14 +192,14 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       if (y==3)
       {
        game_status = TYPENAME;
-       HandleTypeName(strlen(local_player->alias_name),0);
+       HandleTypeName(strlen(setup.alias_name),0);
       }
       else if (y==4)
       {
        if (num_leveldirs)
        {
          game_status = CHOOSELEVEL;
-         SavePlayerInfo(PLAYER_LEVEL);
+         SaveLevelSetup();
          DrawChooseLevel();
        }
       }
@@ -217,7 +222,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y==8)
       {
-       if (setup.autorecord_on)
+       if (setup.autorecord)
          TapeStartRecording();
 
        if (options.network)
@@ -235,13 +240,12 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y==10)
       {
-       SavePlayerInfo(PLAYER_LEVEL);
+       SaveLevelSetup();
         if (Request("Do you really want to quit ?", REQ_ASK | REQ_STAY_CLOSED))
          game_status = EXITGAME;
       }
 
-      if (!button)
-       redraw = TRUE;
+      redraw = TRUE;
     }
   }
   BackToFront();
@@ -683,22 +687,6 @@ void HandleHelpScreen(int button)
   BackToFront();
 }
 
-void CheckCheat()
-{
-  int old_handicap = local_player->handicap;
-
-#if 0
-  if (!strcmp(local_player->alias_name,"Artsoft"))
-#endif
-    local_player->handicap = leveldir[leveldir_nr].levels-1;
-
-  if (local_player->handicap != old_handicap)
-  {
-    SavePlayerInfo(PLAYER_LEVEL);
-    level_nr = local_player->handicap;
-  }
-}
-
 void HandleTypeName(int newxpos, KeySym key)
 {
   static int xpos = 0, ypos = 2;
@@ -707,7 +695,7 @@ void HandleTypeName(int newxpos, KeySym key)
   if (newxpos)
   {
     xpos = newxpos;
-    DrawText(SX+6*32, SY+ypos*32, local_player->alias_name, FS_BIG, FC_YELLOW);
+    DrawText(SX+6*32, SY+ypos*32, setup.alias_name, FS_BIG, FC_YELLOW);
     DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
     return;
   }
@@ -724,35 +712,31 @@ void HandleTypeName(int newxpos, KeySym key)
   if((ascii = get_ascii(key)) && xpos<MAX_NAMELEN-1)
   {
 #endif
-    local_player->alias_name[xpos] = ascii;
-    local_player->alias_name[xpos+1] = 0;
+    setup.alias_name[xpos] = ascii;
+    setup.alias_name[xpos+1] = 0;
     xpos++;
     DrawTextExt(drawto,gc,SX+6*32,SY+ypos*32,
-               local_player->alias_name,FS_BIG,FC_YELLOW);
+               setup.alias_name,FS_BIG,FC_YELLOW);
     DrawTextExt(window,gc,SX+6*32,SY+ypos*32,
-               local_player->alias_name,FS_BIG,FC_YELLOW);
+               setup.alias_name,FS_BIG,FC_YELLOW);
     DrawGraphic(xpos+6,ypos,GFX_KUGEL_ROT);
   }
   else if ((key==XK_Delete || key==XK_BackSpace) && xpos>0)
   {
     xpos--;
-    local_player->alias_name[xpos] = 0;
+    setup.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,local_player->alias_name,FS_BIG,FC_RED);
+    DrawText(SX+6*32,SY+ypos*32,setup.alias_name,FS_BIG,FC_RED);
     DrawGraphic(xpos+6,ypos,GFX_LEERRAUM);
-    SavePlayerInfo(PLAYER_SETUP);
-    CheckCheat();
 
+    SaveSetup();
     game_status = MAINMENU;
-/*
-    DrawMainMenu();
-*/
-
   }
+
   BackToFront();
 }
 
@@ -831,19 +815,21 @@ void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
     }
     else
     {
-      local_player->leveldir_nr = leveldir_nr = y-3;
-      LoadPlayerInfo(PLAYER_LEVEL);
-      SavePlayerInfo(PLAYER_SETUP);
-      CheckCheat();
+      leveldir_nr = y-3;
+      level_nr =
+       getLastPlayedLevelOfLevelSeries(leveldir[leveldir_nr].filename);
+
+      SaveLevelSetup();
 
       TapeErase();
-      LoadLevelTape(level_nr);
+      LoadTape(level_nr);
 
       game_status = MAINMENU;
       DrawMainMenu();
       redraw = TRUE;
     }
   }
+
   BackToFront();
 
   if (game_status==CHOOSELEVEL)
@@ -863,7 +849,7 @@ void DrawHallOfFame(int pos)
   DrawText(SX+64,SY+10,"Hall Of Fame",FS_BIG,FC_YELLOW);
   sprintf(txt,"HighScores of Level %d",level_nr);
   DrawText(SX+256-strlen(txt)*7,SY+48,txt,FS_SMALL,FC_RED);
-  for(y=0;y<MAX_SCORE_ENTRIES;y++)
+  for(y=0; y<15; y++)
   {
     DrawText(SX,SY+64+y*32,".................",FS_BIG,
             (y==pos ? FC_RED : FC_GREEN));
@@ -899,26 +885,25 @@ void DrawSetupScreen()
   int i;
   static struct setup
   {
-    unsigned int bit;
-    char *text, *mode[2];
-    int color[2];
-  } setup[] =
+    boolean *value;
+    char *text;
+  } setup_info[] =
   {
-    {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}},
-    {0,                        "Input Devices",{"",   ""},     {0,0}},
-    {0,                        "",             {"",   ""},     {0,0}},
-    {0,                        "",             {"",   ""},     {0,0}},
-    {0,                        "Exit",         {"",   ""},     {0,0}},
-    {0,                        "Save and exit",{"",   ""},     {0,0}}
+    { &setup.sound,            "Sound:",       },
+    { &setup.sound_loops,      " Sound Loops:" },
+    { &setup.sound_music,      " Game Music:"  },
+    { &setup.toons,            "Toons:"        },
+    { &setup.double_buffering, "Buffered gfx:" },
+    { &setup.scroll_delay,     "Scroll Delay:" },
+    { &setup.soft_scrolling,   "Soft Scroll.:" },
+    { &setup.fading,           "Fading:"       },
+    { &setup.quick_doors,      "Quick Doors:"  },
+    { &setup.autorecord,       "Auto-Record:"  },
+    { &setup.team_mode,                "Team-Mode:"    },
+    { NULL,                    "Input Devices" },
+    { NULL,                    ""              },
+    { NULL,                    "Exit"          },
+    { NULL,                    "Save and exit" }
   };
 
   CloseDoor(DOOR_CLOSE_2);
@@ -932,15 +917,15 @@ void DrawSetupScreen()
     if (!(i >= SETUP_SCREEN_POS_EMPTY1 && i <= SETUP_SCREEN_POS_EMPTY2))
     {
       DrawGraphic(0,i,GFX_KUGEL_BLAU);
-      DrawText(SX+32,SY+i*32, setup[base].text, FS_BIG,FC_GREEN);
+      DrawText(SX+32,SY+i*32, setup_info[base].text, FS_BIG,FC_GREEN);
     }
 
-    if (i < SETUP_SCREEN_POS_EMPTY1)
+    if (setup_info[base].value)
     {
-      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]);
+      int setting_value = *setup_info[base].value;
+
+      DrawText(SX+14*32, SY+i*32, (setting_value ? "on" : "off"),
+              FS_BIG, (setting_value ? FC_YELLOW : FC_BLUE));
     }
   }
 
@@ -1014,99 +999,108 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
 
       if (y==3 && sound_status==SOUND_AVAILABLE)
       {
-       if (SETUP_SOUND_ON(local_player->setup))
+       if (setup.sound)
        {
          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;
+         setup.sound_loops = FALSE;
+         setup.sound_music = FALSE;
        }
        else
          DrawText(SX+14*32, SY+yy*32,"on ",FS_BIG,FC_YELLOW);
-       local_player->setup ^= SETUP_SOUND;
+       setup.sound = !setup.sound;
       }
       else if (y==4 && sound_loops_allowed)
       {
-       if (SETUP_SOUND_LOOPS_ON(local_player->setup))
+       if (setup.sound_loops)
          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);
          DrawText(SX+14*32, SY+(yy-1)*32,"on ",FS_BIG,FC_YELLOW);
-         local_player->setup |= SETUP_SOUND;
+         setup.sound = TRUE;
        }
-       local_player->setup ^= SETUP_SOUND_LOOPS;
+       setup.sound_loops = !setup.sound_loops;
       }
       else if (y==5 && sound_loops_allowed)
       {
-       if (SETUP_SOUND_MUSIC_ON(local_player->setup))
+       if (setup.sound_music)
          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);
          DrawText(SX+14*32, SY+(yy-2)*32,"on ",FS_BIG,FC_YELLOW);
-         local_player->setup |= SETUP_SOUND;
+         setup.sound = TRUE;
        }
-       local_player->setup ^= SETUP_SOUND_MUSIC;
+       setup.sound_music = !setup.sound_music;
       }
       else if (y==6)
       {
-       if (SETUP_TOONS_ON(local_player->setup))
+       if (setup.toons)
          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_TOONS;
+       setup.toons = !setup.toons;
       }
       else if (y==7)
       {
-       if (!SETUP_DIRECT_DRAW_ON(local_player->setup))
+       if (setup.double_buffering)
          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_DIRECT_DRAW;
+       setup.double_buffering = !setup.double_buffering;
+       setup.direct_draw = !setup.double_buffering;
       }
       else if (y==8)
       {
-       if (SETUP_SCROLL_DELAY_ON(local_player->setup))
+       if (setup.scroll_delay)
          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_SCROLL_DELAY;
+       setup.scroll_delay = !setup.scroll_delay;
       }
       else if (y==9)
       {
-       if (SETUP_SOFT_SCROLL_ON(local_player->setup))
+       if (setup.soft_scrolling)
          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_SOFT_SCROLL;
+       setup.soft_scrolling = !setup.soft_scrolling;
       }
       else if (y==10)
       {
-       if (SETUP_FADING_ON(local_player->setup))
+       if (setup.fading)
          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;
+       setup.fading = !setup.fading;
       }
       else if (y==11)
       {
-       if (SETUP_QUICK_DOORS_ON(local_player->setup))
+       if (setup.quick_doors)
          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;
+       setup.quick_doors = !setup.quick_doors;
       }
       else if (y==12)
       {
-       if (SETUP_AUTO_RECORD_ON(local_player->setup))
+       if (setup.autorecord)
          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;
+       setup.autorecord = !setup.autorecord;
       }
       else if (y==13)
+      {
+       if (setup.team_mode)
+         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);
+       setup.team_mode = !setup.team_mode;
+      }
+      else if (y==14)
       {
        game_status = SETUPINPUT;
        DrawSetupInputScreen();
@@ -1116,8 +1110,12 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
       {
         if (y==pos_end)
        {
-         SavePlayerInfo(PLAYER_SETUP);
+         SaveSetup();
+
+         /*
          SaveJoystickData();
+         */
+
        }
 
        game_status = MAINMENU;
@@ -1153,6 +1151,45 @@ void DrawSetupInputScreen()
   HandleSetupInputScreen(0,0,0,0,MB_MENU_INITIALIZE);
 }
 
+static int getJoystickNrFromDeviceName(char *device_name)
+{
+  char c;
+  int joystick_nr = 0;
+
+  if (device_name == NULL || device_name[0] == '\0')
+    return 0;
+
+  c = device_name[strlen(device_name) - 1];
+
+  if (c >= '0' && c <= '9')
+    joystick_nr = (int)(c - '0');
+
+  if (joystick_nr < 0 || joystick_nr >= MAX_PLAYERS)
+    joystick_nr = 0;
+
+  return joystick_nr;
+}
+
+static void setJoystickDeviceToNr(char *device_name, int device_nr)
+{
+  if (device_name == NULL)
+    return;
+
+  if (device_nr < 0 || device_nr >= MAX_PLAYERS)
+    device_nr = 0;
+
+  if (strlen(device_name) > 1)
+  {
+    char c1 = device_name[strlen(device_name) - 1];
+    char c2 = device_name[strlen(device_name) - 2];
+
+    if (c1 >= '0' && c1 <= '9' && !(c2 >= '0' && c2 <= '9'))
+      device_name[strlen(device_name) - 1] = '0' + (char)(device_nr % 10);
+  }
+  else
+    strcpy(device_name, joystick_device_name[device_nr]);
+}
+
 static void drawPlayerSetupInputInfo(int player_nr)
 {
   int i;
@@ -1170,6 +1207,13 @@ static void drawPlayerSetupInputInfo(int player_nr)
     { &custom_key.snap,  "Button 1"       },
     { &custom_key.bomb,  "Button 2"       }
   };
+  static char *joystick_name[MAX_PLAYERS] =
+  {
+    "Joystick1",
+    "Joystick2",
+    "Joystick3",
+    "Joystick4"
+  };
 
   custom_key = setup.input[player_nr].key;
 
@@ -1178,9 +1222,10 @@ static void drawPlayerSetupInputInfo(int player_nr)
 
   if (setup.input[player_nr].use_joystick)
   {
+    char *device_name = setup.input[player_nr].joy.device_name;
+
     DrawText(SX+8*32, SY+3*32,
-            (setup.input[player_nr].joystick_nr == 0 ?
-             "Joystick1" : "Joystick2"),
+            joystick_name[getJoystickNrFromDeviceName(device_name)],
             FS_BIG, FC_YELLOW);
     DrawText(SX+32, SY+4*32, "Calibrate", FS_BIG, FC_GREEN);
   }
@@ -1282,7 +1327,7 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
   {
     static long delay = 0;
 
-    if (!DelayReached(&delay,150))
+    if (!DelayReached(&delay, 150))
       goto out;
 
     player_nr = (player_nr + (x == 11 ? -1 : +1) + MAX_PLAYERS) % MAX_PLAYERS;
@@ -1305,6 +1350,33 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
     {
       if (y == 4)
       {
+       char *device_name = setup.input[player_nr].joy.device_name;
+
+       if (!setup.input[player_nr].use_joystick)
+       {
+         int new_device_nr = (dx >= 0 ? 0 : MAX_PLAYERS - 1);
+
+         setJoystickDeviceToNr(device_name, new_device_nr);
+         setup.input[player_nr].use_joystick = TRUE;
+       }
+       else
+       {
+         int device_nr = getJoystickNrFromDeviceName(device_name);
+         int new_device_nr = device_nr + (dx >= 0 ? +1 : -1);
+
+         if (new_device_nr < 0 || new_device_nr >= MAX_PLAYERS)
+           setup.input[player_nr].use_joystick = FALSE;
+         else
+           setJoystickDeviceToNr(device_name, new_device_nr);
+       }
+
+
+       /*
+       InitJoysticks();
+       */
+
+
+#if 0
        int one_joystick_nr       = (dx >= 0 ? 0 : 1);
        int the_other_joystick_nr = (dx >= 0 ? 1 : 0);
 
@@ -1320,13 +1392,17 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
          setup.input[player_nr].use_joystick = TRUE;
          setup.input[player_nr].joystick_nr = one_joystick_nr;
        }
+#endif
 
        drawPlayerSetupInputInfo(player_nr);
       }
       else if (y == 5)
       {
        if (setup.input[player_nr].use_joystick)
-         CalibrateJoystick(setup.input[player_nr].joystick_nr);
+       {
+         InitJoysticks();
+         CalibrateJoystick(player_nr);
+       }
        else
          CustomizeKeyboard(player_nr);
 
@@ -1334,6 +1410,8 @@ void HandleSetupInputScreen(int mx, int my, int dx, int dy, int button)
       }
       else if (y == pos_end)
       {
+       InitJoysticks();
+
        game_status = SETUP;
        DrawSetupScreen();
        redraw = TRUE;
@@ -1475,7 +1553,7 @@ void CustomizeKeyboard(int player_nr)
   DrawSetupInputScreen();
 }
 
-void CalibrateJoystick(int joystick_nr)
+void CalibrateJoystick(int player_nr)
 {
 #ifdef __FreeBSD__
   struct joystick joy_ctrl;
@@ -1492,6 +1570,7 @@ void CalibrateJoystick(int joystick_nr)
   char joy_nr[4];
 #endif
 
+  int joystick_fd = stored_player[player_nr].joystick_fd;
   int new_joystick_xleft = 128, new_joystick_xright = 128;
   int new_joystick_yupper = 128, new_joystick_ylower = 128;
   int new_joystick_xmiddle, new_joystick_ymiddle;
@@ -1504,6 +1583,9 @@ void CalibrateJoystick(int joystick_nr)
   if (joystick_status == JOYSTICK_OFF)
     return;
 
+  if (!setup.input[player_nr].use_joystick || joystick_fd < 0)
+    return;
+
   ClearWindow();
   DrawText(SX,      SY +  6*32, " ROTATE JOYSTICK ",FS_BIG,FC_YELLOW);
   DrawText(SX,      SY +  7*32, "IN ALL DIRECTIONS",FS_BIG,FC_YELLOW);
@@ -1520,7 +1602,7 @@ void CalibrateJoystick(int joystick_nr)
     }
   }
 
-  joy = Joystick();
+  joy = Joystick(player_nr);
   last_x = (joy & JOY_LEFT ? -1 : joy & JOY_RIGHT ? +1 : 0);
   last_y = (joy & JOY_UP   ? -1 : joy & JOY_DOWN  ? +1 : 0);
   DrawGraphic(xpos + last_x, ypos + last_y, GFX_KUGEL_ROT);
@@ -1533,7 +1615,7 @@ void CalibrateJoystick(int joystick_nr)
   joy_ctrl.buttons = 0;
 #endif
 
-  while(Joystick() & JOY_BUTTON);
+  while(Joystick(player_nr) & JOY_BUTTON);
 
   InitAnimation();
 
@@ -1575,7 +1657,7 @@ void CalibrateJoystick(int joystick_nr)
       }
     }
 
-    if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+    if (read(joystick_fd, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
     {
       joystick_status = JOYSTICK_OFF;
       goto error_out;
@@ -1591,16 +1673,16 @@ void CalibrateJoystick(int joystick_nr)
     new_joystick_ymiddle =
       new_joystick_yupper + (new_joystick_ylower - new_joystick_yupper) / 2;
 
-    joystick[joystick_nr].xleft = new_joystick_xleft;
-    joystick[joystick_nr].yupper = new_joystick_yupper;
-    joystick[joystick_nr].xright = new_joystick_xright;
-    joystick[joystick_nr].ylower = new_joystick_ylower;
-    joystick[joystick_nr].xmiddle = new_joystick_xmiddle;
-    joystick[joystick_nr].ymiddle = new_joystick_ymiddle;
+    setup.input[player_nr].joy.xleft = new_joystick_xleft;
+    setup.input[player_nr].joy.yupper = new_joystick_yupper;
+    setup.input[player_nr].joy.xright = new_joystick_xright;
+    setup.input[player_nr].joy.ylower = new_joystick_ylower;
+    setup.input[player_nr].joy.xmiddle = new_joystick_xmiddle;
+    setup.input[player_nr].joy.ymiddle = new_joystick_ymiddle;
 
     CheckJoystickData();
 
-    joy = Joystick();
+    joy = Joystick(player_nr);
 
     if (joy & JOY_BUTTON && check_remaining == 0)
       result = 1;
@@ -1624,13 +1706,13 @@ void CalibrateJoystick(int joystick_nr)
 
 #if 0
       printf("LEFT / MIDDLE / RIGHT == %d / %d / %d\n",
-            joystick[joystick_nr].xleft,
-            joystick[joystick_nr].xmiddle,
-            joystick[joystick_nr].xright);
+            setup.input[player_nr].joy.xleft,
+            setup.input[player_nr].joy.xmiddle,
+            setup.input[player_nr].joy.xright);
       printf("UP / MIDDLE / DOWN == %d / %d / %d\n",
-            joystick[joystick_nr].yupper,
-            joystick[joystick_nr].ymiddle,
-            joystick[joystick_nr].ylower);
+            setup.input[player_nr].joy.yupper,
+            setup.input[player_nr].joy.ymiddle,
+            setup.input[player_nr].joy.ylower);
 #endif
     }
 
@@ -1644,7 +1726,7 @@ void CalibrateJoystick(int joystick_nr)
   StopAnimation();
 
   DrawSetupInputScreen();
-  while(Joystick() & JOY_BUTTON);
+  while(Joystick(player_nr) & JOY_BUTTON);
   return;
 
   error_out:
@@ -1657,6 +1739,10 @@ void CalibrateJoystick(int joystick_nr)
   DrawSetupInputScreen();
 }
 
+
+
+#if 0
+
 void CalibrateJoystick_OLD()
 {
 #ifdef __FreeBSD__
@@ -1768,12 +1854,12 @@ void CalibrateJoystick_OLD()
   new_joystick_xmiddle = joy_ctrl.x;
   new_joystick_ymiddle = joy_ctrl.y;
 
-  joystick[joystick_nr].xleft = new_joystick_xleft;
-  joystick[joystick_nr].yupper = new_joystick_yupper;
-  joystick[joystick_nr].xright = new_joystick_xright;
-  joystick[joystick_nr].ylower = new_joystick_ylower;
-  joystick[joystick_nr].xmiddle = new_joystick_xmiddle;
-  joystick[joystick_nr].ymiddle = new_joystick_ymiddle;
+  setup.input[player_nr].joy.xleft = new_joystick_xleft;
+  setup.input[player_nr].joy.yupper = new_joystick_yupper;
+  setup.input[player_nr].joy.xright = new_joystick_xright;
+  setup.input[player_nr].joy.ylower = new_joystick_ylower;
+  setup.input[player_nr].joy.xmiddle = new_joystick_xmiddle;
+  setup.input[player_nr].joy.ymiddle = new_joystick_ymiddle;
 
   CheckJoystickData();
 
@@ -1829,6 +1915,10 @@ void CalibrateJoystick_OLD()
   DrawSetupScreen();
 }
 
+#endif
+
+
+
 void HandleGameActions()
 {
   if (game_status != PLAYING)
@@ -1856,14 +1946,14 @@ void HandleVideoButtons(int mx, int my, int button)
       TapeStop();
       if (TAPE_IS_EMPTY(tape))
       {
-       LoadLevelTape(level_nr);
+       LoadTape(level_nr);
        if (TAPE_IS_EMPTY(tape))
          Request("No tape for this level !",REQ_CONFIRM);
       }
       else
       {
        if (tape.changed)
-         SaveLevelTape(tape.level_nr);
+         SaveTape(tape.level_nr);
        TapeErase();
       }
       DrawCompleteVideoDisplay();
@@ -1955,17 +2045,15 @@ void HandleSoundButtons(int mx, int my, int button)
   switch(CheckSoundButtons(mx,my,button))
   {
     case BUTTON_SOUND_MUSIC:
-      if (setup.sound_music_on)
+      if (setup.sound_music)
       { 
-       setup.sound_music_on = FALSE;
-       local_player->setup &= ~SETUP_SOUND_MUSIC;
+       setup.sound_music = FALSE;
        FadeSound(background_loop[level_nr % num_bg_loops]);
        DrawSoundDisplay(BUTTON_SOUND_MUSIC_OFF);
       }
       else if (sound_loops_allowed)
       { 
-       setup.sound_on = setup.sound_music_on = TRUE;
-       local_player->setup |= (SETUP_SOUND | SETUP_SOUND_MUSIC);
+       setup.sound = setup.sound_music = TRUE;
        PlaySoundLoop(background_loop[level_nr % num_bg_loops]);
        DrawSoundDisplay(BUTTON_SOUND_MUSIC_ON);
       }
@@ -1974,16 +2062,14 @@ void HandleSoundButtons(int mx, int my, int button)
       break;
 
     case BUTTON_SOUND_LOOPS:
-      if (setup.sound_loops_on)
+      if (setup.sound_loops)
       { 
-       setup.sound_loops_on = FALSE;
-       local_player->setup &= ~SETUP_SOUND_LOOPS;
+       setup.sound_loops = FALSE;
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
       }
       else if (sound_loops_allowed)
       { 
-       setup.sound_on = setup.sound_loops_on = TRUE;
-       local_player->setup |= (SETUP_SOUND | SETUP_SOUND_LOOPS);
+       setup.sound = setup.sound_loops = TRUE;
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_ON);
       }
       else
@@ -1991,16 +2077,14 @@ void HandleSoundButtons(int mx, int my, int button)
       break;
 
     case BUTTON_SOUND_SIMPLE:
-      if (setup.sound_simple_on)
+      if (setup.sound_simple)
       { 
-       setup.sound_simple_on = FALSE;
-       local_player->setup &= ~SETUP_SOUND;
+       setup.sound_simple = FALSE;
        DrawSoundDisplay(BUTTON_SOUND_SIMPLE_OFF);
       }
       else if (sound_status==SOUND_AVAILABLE)
       { 
-       setup.sound_on = setup.sound_simple_on = TRUE;
-       local_player->setup |= SETUP_SOUND;
+       setup.sound = setup.sound_simple = TRUE;
        DrawSoundDisplay(BUTTON_SOUND_SIMPLE_ON);
       }
       else
@@ -2055,30 +2139,6 @@ void HandleGameButtons(int mx, int my, int button)
       }
       else
        TapeTogglePause();
-
-      /*
-      if (tape.pausing)
-      {
-       if (options.network)
-         SendToServer_ContinuePlaying();
-       else
-       {
-         tape.pausing = FALSE;
-         DrawVideoDisplay(VIDEO_STATE_PAUSE_OFF,0);
-       }
-      }
-      else
-      {
-       if (options.network)
-         SendToServer_PausePlaying();
-       else
-       {
-         tape.pausing = TRUE;
-         DrawVideoDisplay(VIDEO_STATE_PAUSE_ON,0);
-       }
-      }
-      */
-
       break;
 
     case BUTTON_GAME_PLAY: