rnd-19981021-1
[rocksndiamonds.git] / src / screens.c
index f689f1a00baa32f7bcdadc342a753751f2a72d05..ad05d1a610becd58fa93050d1098ff7034dea37e 100644 (file)
@@ -215,10 +215,10 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
       }
       else if (y==8)
       {
-       if (autorecord_on)
+       if (setup.autorecord_on)
          TapeStartRecording();
 
-       if (network)
+       if (options.network)
          SendToServer_StartPlaying();
        else
        {
@@ -1112,7 +1112,12 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
       }
       else if (y==14)
       {
+       /*
        CalibrateJoystick();
+       */
+
+       CustomizeKeyboard();
+
        redraw = TRUE;
       }
       else if (y==pos_end-1 || y==pos_end)
@@ -1135,6 +1140,120 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     DoAnimation();
 }
 
+void CustomizeKeyboard( /* int player_nr */ )
+{
+  int player_nr = 0;
+
+  int i;
+  boolean finished = FALSE;
+  static struct SetupKeyboardInfo custom_key;
+  static struct
+  {
+    KeySym *keysym;
+    char *text;
+  } customize_step[] =
+  {
+    { &custom_key.left,  "Move Left"  },
+    { &custom_key.right, "Move Right" },
+    { &custom_key.up,    "Move Up"    },
+    { &custom_key.down,  "Move Down"  },
+    { &custom_key.snap,  "Snap Field" },
+    { &custom_key.bomb,  "Place Bomb" }
+  };
+
+  custom_key = setup.key_input[player_nr];
+
+  ClearWindow();
+  DrawText(SX+16, SY+16, "Keyboard Input", FS_BIG, FC_YELLOW);
+
+  BackToFront();
+  InitAnimation();
+
+  i = 0;
+  DrawText(SX, SY+(2+2*i)*32, customize_step[i].text, FS_BIG, FC_GREEN);
+  DrawText(SX, SY+(2+2*i+1)*32, "Key:", FS_BIG, FC_GREEN);
+  DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+          getKeySymName(*customize_step[i].keysym), FS_BIG, FC_BLUE);
+
+  while(!finished)
+  {
+    if (XPending(display))     /* got event from X server */
+    {
+      XEvent event;
+
+      XNextEvent(display, &event);
+      switch(event.type)
+      {
+       case Expose:
+         HandleExposeEvent((XExposeEvent *) &event);
+         break;
+       case UnmapNotify:
+         SleepWhileUnmapped();
+         break;
+       case KeyPress:
+         {
+           KeySym key = XLookupKeysym((XKeyEvent *)&event,
+                                      ((XKeyEvent *)&event)->state);
+
+           if (key == XK_Escape || (key == XK_Return && i == 6))
+           {
+             finished = TRUE;
+             break;
+           }
+
+           if (key == XK_Return || i == 6)
+             break;
+
+           /* got new key binding */
+           *customize_step[i].keysym = key;
+           DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+                    "            ", FS_BIG, FC_YELLOW);
+           DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+                    getKeySymName(key), FS_BIG, FC_YELLOW);
+
+           i++;
+
+           if (i == 6)
+           {
+             DrawText(SX+16, SY+15*32+16, "Press Enter", FS_BIG, FC_YELLOW);
+             break;
+           }
+
+           /* ask for next key binding */
+           DrawText(SX, SY+(2+2*i)*32,
+                    customize_step[i].text, FS_BIG, FC_GREEN);
+           DrawText(SX, SY+(2+2*i+1)*32, "Key:", FS_BIG, FC_GREEN);
+           DrawText(SX + 5*32, SY+(2+2*i+1)*32,
+                    getKeySymName(*customize_step[i].keysym),
+                    FS_BIG, FC_BLUE);
+         }
+         break;
+       case KeyRelease:
+         key_joystick_mapping = 0;
+         break;
+       case FocusIn:
+       case FocusOut:
+         HandleFocusEvent((XFocusChangeEvent *) &event);
+         break;
+        case ClientMessage:
+         HandleClientMessageEvent((XClientMessageEvent *) &event);
+         break;
+       default:
+         break;
+      }
+    }
+
+    BackToFront();
+    DoAnimation();
+
+    /* don't eat all CPU time */
+    Delay(10);
+  }
+
+  StopAnimation();
+  DrawSetupScreen();
+}
+
 void CalibrateJoystick()
 {
 #ifdef __FreeBSD__
@@ -1152,10 +1271,199 @@ void CalibrateJoystick()
   char joy_nr[4];
 #endif
 
+  int joystick_nr = setup.joy_input[0].joystick_nr;
+  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;
+  int x, y, last_x, last_y, xpos = 8, ypos = 3;
+  boolean check[3][3];
+  int check_remaining = 3 * 3;
+  int joy;
+  int result = -1;
+
+  if (joystick_status == JOYSTICK_OFF)
+    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);
+  DrawText(SX + 16, SY +  9*32, "  IF ALL BALLS  ",FS_BIG,FC_YELLOW);
+  DrawText(SX,      SY + 10*32, "   ARE YELLOW,   ",FS_BIG,FC_YELLOW);
+  DrawText(SX,      SY + 11*32, "  PRESS BUTTON!  ",FS_BIG,FC_YELLOW);
+
+  for(y=0; y<3; y++)
+  {
+    for(x=0; x<3; x++)
+    {
+      check[x][y] = FALSE;
+      DrawGraphic(xpos + x - 1, ypos + y - 1, GFX_KUGEL_BLAU);
+    }
+  }
+
+  joy = Joystick();
+  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);
+
+  BackToFront();
+
+#ifdef __FreeBSD__
+  joy_ctrl.b1 = joy_ctrl.b2 = 0;
+#else
+  joy_ctrl.buttons = 0;
+#endif
+
+  while(Joystick() & JOY_BUTTON);
+
+  InitAnimation();
+
+  while(result < 0)
+  {
+    if (XPending(display))     /* got event from X server */
+    {
+      XEvent event;
+
+      XNextEvent(display, &event);
+      switch(event.type)
+      {
+       case Expose:
+         HandleExposeEvent((XExposeEvent *) &event);
+         break;
+       case UnmapNotify:
+         SleepWhileUnmapped();
+         break;
+       case KeyPress:
+         switch(XLookupKeysym((XKeyEvent *)&event,
+                              ((XKeyEvent *)&event)->state))
+         {
+           case XK_Return:
+             if (check_remaining == 0)
+               result = 1;
+             break;
+           case XK_Escape:
+             result = 0;
+             break;
+         }
+         break;
+       case KeyRelease:
+         key_joystick_mapping = 0;
+         break;
+       case FocusIn:
+       case FocusOut:
+         HandleFocusEvent((XFocusChangeEvent *) &event);
+         break;
+        case ClientMessage:
+         HandleClientMessageEvent((XClientMessageEvent *) &event);
+         break;
+       default:
+         break;
+      }
+    }
+
+    if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+    {
+      joystick_status = JOYSTICK_OFF;
+      goto error_out;
+    }
+
+    new_joystick_xleft  = MIN(new_joystick_xleft,  joy_ctrl.x);
+    new_joystick_xright = MAX(new_joystick_xright, joy_ctrl.x);
+    new_joystick_yupper = MIN(new_joystick_yupper, joy_ctrl.y);
+    new_joystick_ylower = MAX(new_joystick_ylower, joy_ctrl.y);
+
+    new_joystick_xmiddle =
+      new_joystick_xleft + (new_joystick_xright - new_joystick_xleft) / 2;
+    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;
+
+    CheckJoystickData();
+
+    joy = Joystick();
+
+    if (joy & JOY_BUTTON && check_remaining == 0)
+      result = 1;
+
+    x = (joy & JOY_LEFT ? -1 : joy & JOY_RIGHT ? +1 : 0);
+    y = (joy & JOY_UP   ? -1 : joy & JOY_DOWN  ? +1 : 0);
+
+    if (x != last_x || y != last_y)
+    {
+      DrawGraphic(xpos + last_x, ypos + last_y, GFX_KUGEL_GELB);
+      DrawGraphic(xpos + x,      ypos + y,      GFX_KUGEL_ROT);
+
+      last_x = x;
+      last_y = y;
+
+      if (check_remaining > 0 && !check[x+1][y+1])
+      {
+       check[x+1][y+1] = TRUE;
+       check_remaining--;
+      }
+
+#if 0
+      printf("LEFT / MIDDLE / RIGHT == %d / %d / %d\n",
+            joystick[joystick_nr].xleft,
+            joystick[joystick_nr].xmiddle,
+            joystick[joystick_nr].xright);
+      printf("UP / MIDDLE / DOWN == %d / %d / %d\n",
+            joystick[joystick_nr].yupper,
+            joystick[joystick_nr].ymiddle,
+            joystick[joystick_nr].ylower);
+#endif
+    }
+
+    BackToFront();
+    DoAnimation();
+
+    /* don't eat all CPU time */
+    Delay(10);
+  }
+
+  StopAnimation();
+
+  DrawSetupScreen();
+  while(Joystick() & JOY_BUTTON);
+  return;
+
+ error_out:
+
+  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 CalibrateJoystick_OLD()
+{
+#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 joystick_nr = setup.joy_input[0].joystick_nr;
   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)
+  if (joystick_status == JOYSTICK_OFF)
     goto error_out;
 
 #ifndef MSDOS
@@ -1172,7 +1480,7 @@ void CalibrateJoystick()
 #endif
   while(Joystick() & JOY_BUTTON);
 #ifdef __FreeBSD__
-  while(!(joy_ctrl.b1||joy_ctrl.b2))
+  while(!(joy_ctrl.b1 || joy_ctrl.b2))
 #else
   while(!joy_ctrl.buttons)
 #endif
@@ -1201,7 +1509,7 @@ void CalibrateJoystick()
 #endif
   while(Joystick() & JOY_BUTTON);
 #ifdef __FreeBSD__
-  while(!(joy_ctrl.b1||joy_ctrl.b2))
+  while(!(joy_ctrl.b1 || joy_ctrl.b2))
 #else
   while(!joy_ctrl.buttons)
 #endif
@@ -1229,7 +1537,7 @@ void CalibrateJoystick()
 #endif
   while(Joystick() & JOY_BUTTON);
 #ifdef __FreeBSD__
-  while(!(joy_ctrl.b1||joy_ctrl.b2))
+  while(!(joy_ctrl.b1 || joy_ctrl.b2))
 #else
   while(!joy_ctrl.buttons)
 #endif
@@ -1359,7 +1667,7 @@ void HandleVideoButtons(int mx, int my, int button)
       {
        TapeStartRecording();
 
-       if (network)
+       if (options.network)
          SendToServer_StartPlaying();
        else
        {
@@ -1432,16 +1740,16 @@ void HandleSoundButtons(int mx, int my, int button)
   switch(CheckSoundButtons(mx,my,button))
   {
     case BUTTON_SOUND_MUSIC:
-      if (sound_music_on)
+      if (setup.sound_music_on)
       { 
-       sound_music_on = FALSE;
+       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_on = sound_music_on = TRUE;
+       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);
@@ -1451,15 +1759,15 @@ void HandleSoundButtons(int mx, int my, int button)
       break;
 
     case BUTTON_SOUND_LOOPS:
-      if (sound_loops_on)
+      if (setup.sound_loops_on)
       { 
-       sound_loops_on = FALSE;
+       setup.sound_loops_on = FALSE;
        local_player->setup &= ~SETUP_SOUND_LOOPS;
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_OFF);
       }
       else if (sound_loops_allowed)
       { 
-       sound_on = sound_loops_on = TRUE;
+       setup.sound_on = setup.sound_loops_on = TRUE;
        local_player->setup |= (SETUP_SOUND | SETUP_SOUND_LOOPS);
        DrawSoundDisplay(BUTTON_SOUND_LOOPS_ON);
       }
@@ -1468,15 +1776,15 @@ void HandleSoundButtons(int mx, int my, int button)
       break;
 
     case BUTTON_SOUND_SIMPLE:
-      if (sound_simple_on)
+      if (setup.sound_simple_on)
       { 
-       sound_simple_on = FALSE;
+       setup.sound_simple_on = FALSE;
        local_player->setup &= ~SETUP_SOUND;
        DrawSoundDisplay(BUTTON_SOUND_SIMPLE_OFF);
       }
       else if (sound_status==SOUND_AVAILABLE)
       { 
-       sound_on = sound_simple_on = TRUE;
+       setup.sound_on = setup.sound_simple_on = TRUE;
        local_player->setup |= SETUP_SOUND;
        DrawSoundDisplay(BUTTON_SOUND_SIMPLE_ON);
       }
@@ -1510,7 +1818,7 @@ void HandleGameButtons(int mx, int my, int button)
       if (Request("Do you really want to quit the game ?",
                  REQ_ASK | REQ_STAY_CLOSED))
       { 
-       if (network)
+       if (options.network)
          SendToServer_StopPlaying();
        else
        {
@@ -1523,7 +1831,7 @@ void HandleGameButtons(int mx, int my, int button)
       break;
 
     case BUTTON_GAME_PAUSE:
-      if (network)
+      if (options.network)
       {
        if (tape.pausing)
          SendToServer_ContinuePlaying();
@@ -1536,7 +1844,7 @@ void HandleGameButtons(int mx, int my, int button)
       /*
       if (tape.pausing)
       {
-       if (network)
+       if (options.network)
          SendToServer_ContinuePlaying();
        else
        {
@@ -1546,7 +1854,7 @@ void HandleGameButtons(int mx, int my, int button)
       }
       else
       {
-       if (network)
+       if (options.network)
          SendToServer_PausePlaying();
        else
        {
@@ -1561,7 +1869,7 @@ void HandleGameButtons(int mx, int my, int button)
     case BUTTON_GAME_PLAY:
       if (tape.pausing)
       {
-       if (network)
+       if (options.network)
          SendToServer_ContinuePlaying();
        else
        {