removed redundant code
[rocksndiamonds.git] / src / screens.c
index fe814ec765b5ddeea6e2e19e25f03cc21369a1e4..403e4247a0b33e878a9d956b36ad938238dc817f 100644 (file)
@@ -248,10 +248,12 @@ static void execSetupTouch(void);
 static void execSetupArtwork(void);
 static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 
+static void DrawChoosePlayerName(void);
 static void DrawChooseLevelSet(void);
 static void DrawChooseLevelNr(void);
 static void DrawInfoScreen(void);
 static void DrawSetupScreen(void);
+static void DrawTypeName(void);
 
 static void DrawInfoScreen_NotAvailable(char *, char *);
 static void DrawInfoScreen_HelpAnim(int, int, boolean);
@@ -326,6 +328,9 @@ static TreeInfo *transparency_current = NULL;
 static TreeInfo *grid_sizes[2][2] = { { NULL, NULL }, { NULL, NULL } };
 static TreeInfo *grid_size_current[2][2] = { { NULL, NULL }, { NULL, NULL } };
 
+static TreeInfo *player_name = NULL;
+static TreeInfo *player_name_current = NULL;
+
 static TreeInfo *level_number = NULL;
 static TreeInfo *level_number_current = NULL;
 
@@ -540,7 +545,9 @@ static int align_yoffset = 0;
 #define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&               \
                                 (s) <= GAME_MODE_SETUP ? (s) :         \
                                 (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
-                                GAME_MODE_MAIN : GAME_MODE_DEFAULT)
+                                GAME_MODE_MAIN :                       \
+                                (s) == GAME_MODE_PSEUDO_TYPENAMES ?    \
+                                GAME_MODE_NAMES : GAME_MODE_DEFAULT)
 
 // (there are no draw offset definitions needed for INFO_MODE_TITLE)
 #define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_TITLE &&              \
@@ -680,6 +687,8 @@ static char *main_text_title_1                      = NULL;
 static char *main_text_title_2                 = NULL;
 static char *main_text_title_3                 = NULL;
 
+extern char debug_xsn_mode[];
+
 struct MainControlInfo
 {
   int nr;
@@ -928,10 +937,10 @@ static int getTitleSound(struct TitleControlInfo *tci)
   int sound_local = base + nr;
 
 #if 0
-  printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n",
-        nr, initial, is_image,
-        sound_global, getSoundListEntry(sound_global)->filename,
-        sound_local, getSoundListEntry(sound_local)->filename);
+  Debug("screens:getTitleSound", "%d, %d, %d: %d ['%s'], %d ['%s']",
+       nr, initial, is_image,
+       sound_global, getSoundListEntry(sound_global)->filename,
+       sound_local, getSoundListEntry(sound_local)->filename);
 #endif
 
   if (!strEqual(getSoundListEntry(sound_local)->filename, UNDEFINED_FILENAME))
@@ -958,10 +967,10 @@ static int getTitleMusic(struct TitleControlInfo *tci)
   int music_local = base + nr;
 
 #if 0
-  printf("::: %d, %d, %d: %d ['%s'], %d ['%s']\n",
-        nr, initial, is_image,
-        music_global, getMusicListEntry(music_global)->filename,
-        music_local, getMusicListEntry(music_local)->filename);
+  Debug("screens:getTitleMusic", "%d, %d, %d: %d ['%s'], %d ['%s']",
+       nr, initial, is_image,
+       music_global, getMusicListEntry(music_global)->filename,
+       music_local, getMusicListEntry(music_local)->filename);
 #endif
 
   if (!strEqual(getMusicListEntry(music_local)->filename, UNDEFINED_FILENAME))
@@ -1326,10 +1335,11 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y)
   int rect_y = ALIGNED_TEXT_YPOS(rect);
 
 #if 0
-  printf("::: insideTextPosRect: (%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d\n",
-        x, y, rect_x, rect_y, rect->x, rect->y, rect->width, rect->height,
-        (x >= rect_x && x < rect_x + rect->width &&
-         y >= rect_y && y < rect_y + rect->height));
+  Debug("screens:insideTextPosRect",
+       "(%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d",
+       x, y, rect_x, rect_y, rect->x, rect->y, rect->width, rect->height,
+       (x >= rect_x && x < rect_x + rect->width &&
+        y >= rect_y && y < rect_y + rect->height));
 #endif
 
   return (x >= rect_x && x < rect_x + rect->width &&
@@ -2075,9 +2085,20 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
        }
        else
        {
-         SetGameStatus(GAME_MODE_PSEUDO_TYPENAME);
+         if (0 && setup.multiple_users)        // (not used yet)
+         {
+           CloseDoor(DOOR_CLOSE_2);
+
+           SetGameStatus(GAME_MODE_NAMES);
+
+           DrawChoosePlayerName();
+         }
+         else
+         {
+           SetGameStatus(GAME_MODE_PSEUDO_TYPENAME);
 
-         HandleTypeName(strlen(setup.player_name), 0);
+           DrawTypeName();
+         }
        }
       }
       else if (pos == MAIN_CONTROL_LEVELS)
@@ -3691,6 +3712,10 @@ static void DrawInfoScreen_Version(void)
 
   DrawTextF(xstart1, ystart, font_head, "Source date");
   DrawTextF(xstart2, ystart, font_text, getSourceDateString());
+  ystart += ystep_line;
+
+  DrawTextF(xstart1, ystart, font_head, "Commit hash");
+  DrawTextF(xstart2, ystart, font_text, getSourceHashString());
   ystart += ystep_para;
 
   DrawTextF(xstart1, ystart, font_head, "Library");
@@ -3953,13 +3978,13 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button)
 // type name functions
 // ============================================================================
 
-void HandleTypeName(int newxpos, Key key)
+static void HandleTypeNameExt(boolean initialize, Key key)
 {
   static char last_player_name[MAX_PLAYER_NAME_LEN + 1];
   struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
   struct TextPosInfo *pos = mci->pos_input;
-  int startx = mSX + ALIGNED_TEXT_XPOS(pos);
-  int starty = mSY + ALIGNED_TEXT_YPOS(pos);
+  int sx = mSX + ALIGNED_TEXT_XPOS(pos);
+  int sy = mSY + ALIGNED_TEXT_YPOS(pos);
   static int xpos = 0;
   int font_nr = pos->font;
   int font_active_nr = FONT_ACTIVE(font_nr);
@@ -3968,15 +3993,15 @@ void HandleTypeName(int newxpos, Key key)
   boolean is_valid_key_char = (key_char != 0 && (key_char != ' ' || xpos > 0));
   boolean is_active = TRUE;
 
-  DrawBackgroundForFont(startx,starty, pos->width, pos->height, font_active_nr);
+  DrawBackgroundForFont(sx, sy, pos->width, pos->height, font_active_nr);
 
-  if (newxpos)
+  if (initialize)
   {
     strcpy(last_player_name, setup.player_name);
 
-    xpos = newxpos;
+    xpos = strlen(setup.player_name);
 
-    StartTextInput(startx, starty, pos->width, pos->height);
+    StartTextInput(sx, sy, pos->width, pos->height);
   }
   else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN)
   {
@@ -3996,37 +4021,45 @@ void HandleTypeName(int newxpos, Key key)
     SaveSetup();
 
     is_active = FALSE;
-
-    SetGameStatus(GAME_MODE_MAIN);
   }
   else if (key == KSYM_Escape)
   {
     strcpy(setup.player_name, last_player_name);
 
     is_active = FALSE;
-
-    SetGameStatus(GAME_MODE_MAIN);
   }
 
   if (is_active)
   {
     pos->width = (strlen(setup.player_name) + 1) * font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
+    sx = mSX + ALIGNED_TEXT_XPOS(pos);
 
-    DrawText(startx, starty, setup.player_name, font_active_nr);
-    DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
+    DrawText(sx, sy, setup.player_name, font_active_nr);
+    DrawText(sx + xpos * font_width, sy, "_", font_active_nr);
   }
   else
   {
+    SetGameStatus(GAME_MODE_MAIN);
+
     pos->width = strlen(setup.player_name) * font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
+    sx = mSX + ALIGNED_TEXT_XPOS(pos);
 
-    DrawText(startx, starty, setup.player_name, font_nr);
+    DrawText(sx, sy, setup.player_name, font_nr);
 
     StopTextInput();
   }
 }
 
+static void DrawTypeName(void)
+{
+  HandleTypeNameExt(TRUE, 0);
+}
+
+void HandleTypeName(Key key)
+{
+  HandleTypeNameExt(FALSE, key);
+}
+
 
 // ============================================================================
 // tree menu functions
@@ -4103,7 +4136,9 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
   // needed if different viewport properties defined for choosing level (set)
   ChangeViewportPropertiesIfNeeded();
 
-  if (game_status == GAME_MODE_LEVELNR)
+  if (game_status == GAME_MODE_NAMES)
+    SetMainBackgroundImage(IMG_BACKGROUND_NAMES);
+  else if (game_status == GAME_MODE_LEVELNR)
     SetMainBackgroundImage(IMG_BACKGROUND_LEVELNR);
   else if (game_status == GAME_MODE_LEVELS)
     SetMainBackgroundImage(IMG_BACKGROUND_LEVELS);
@@ -4545,6 +4580,65 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   }
 }
 
+void DrawChoosePlayerName(void)
+{
+  int i;
+
+  FadeMenuSoundsAndMusic();
+
+  if (player_name != NULL)
+  {
+    freeTreeInfo(player_name);
+
+    player_name = NULL;
+  }
+
+  for (i = 0; i < MAX_PLAYER_NAMES; i++)
+  {
+    boolean team_mode = (!network.enabled && setup.team_mode);
+    int tree_type = (team_mode ? TREE_TYPE_PLAYER_TEAM : TREE_TYPE_PLAYER_NAME);
+    TreeInfo *ti = newTreeInfo_setDefaults(tree_type);
+    char identifier[32], name[MAX_PLAYER_NAME_LEN + 1];
+    int value = i;
+
+    ti->node_top = &player_name;
+    ti->sort_priority = 10000 + value;
+    ti->color = FC_RED;
+
+    if (strEqual(global.user_names[i], EMPTY_PLAYER_NAME))
+      ti->color = FC_BLUE;
+
+    snprintf(identifier, sizeof(identifier), "%d", value);
+    snprintf(name, sizeof(name), "%s", global.user_names[i]);
+
+    setString(&ti->identifier, identifier);
+    setString(&ti->name, name);
+    setString(&ti->name_sorting, name);
+
+    pushTreeInfo(&player_name, ti);
+  }
+
+  // sort player entries by player number
+  sortTreeInfo(&player_name);
+
+  // set current player entry to selected player entry
+  player_name_current =
+    getTreeInfoFromIdentifier(player_name, i_to_a(user.nr));
+
+  // if that fails, set current player name to first available name
+  if (player_name_current == NULL)
+    player_name_current = player_name;
+
+  DrawChooseTree(&player_name_current);
+
+  PlayMenuSoundsAndMusic();
+}
+
+void HandleChoosePlayerName(int mx, int my, int dx, int dy, int button)
+{
+  HandleChooseTree(mx, my, dx, dy, button, &player_name_current);
+}
+
 void DrawChooseLevelSet(void)
 {
   FadeMenuSoundsAndMusic();
@@ -5951,10 +6045,10 @@ static void execSetupTouch(void)
 static void execSetupArtwork(void)
 {
 #if 0
-  printf("::: '%s', '%s', '%s'\n",
-        artwork.gfx_current->subdir,
-        artwork.gfx_current->fullpath,
-        artwork.gfx_current->basepath);
+  Debug("screens:execSetupArtwork", "'%s', '%s', '%s'",
+       artwork.gfx_current->subdir,
+       artwork.gfx_current->fullpath,
+       artwork.gfx_current->basepath);
 #endif
 
   setup.graphics_set = artwork.gfx_current->identifier;
@@ -6289,6 +6383,7 @@ static struct TokenInfo setup_info_game[] =
   { TYPE_PLAYER,       &setup.network_player_nr,"Preferred Network Player:" },
   { TYPE_TEXT_INPUT,   execGadgetNetworkServer, "Network Server Hostname:" },
   { TYPE_STRING,       &network_server_text,   ""                      },
+  { TYPE_SWITCH,       &setup.multiple_users,  "Multiple Users/Teams:" },
   { TYPE_YES_NO,       &setup.input_on_focus,  "Only Move Focussed Player:" },
   { TYPE_SWITCH,       &setup.time_limit,      "Time Limit:"           },
   { TYPE_SWITCH,       &setup.handicap,        "Handicap:"             },
@@ -6386,6 +6481,7 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_SWITCH,       &setup.show_titlescreen,"Show Title Screens:"   },
   { TYPE_SWITCH,       &setup.toons,           "Show Menu Animations:" },
   { TYPE_SWITCH,       &setup.small_game_graphics, "Small Game Graphics:" },
+  { TYPE_YES_NO_AUTO,  &setup.debug.xsn_mode,  debug_xsn_mode          },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
@@ -6756,6 +6852,10 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
 
     if (startx + font_xoffset < text_startx + text_width + text_font_xoffset)
     {
+      // when using narrow font, left-shifting text "auto" not needed
+      if (type & TYPE_YES_NO_AUTO)
+       xpos += 1;
+
       xpos += 1;
       startx = mSX + xpos * 32;
 
@@ -7542,7 +7642,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
   Event event;
   int alpha = 200, alpha_step = -1;
   int alpha_ticks = 0;
-  char mapping[4096], temp[4096];
+  char mapping[4096], temp[256];
   int font_name = MENU_SETUP_FONT_TITLE;
   int font_info = MENU_SETUP_FONT_TEXT;
   int spacing_name = menu.line_spacing_setup[SETUP_MODE_INPUT];
@@ -7605,9 +7705,9 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
 
 #if DEBUG_JOYSTICKS
   // print info about the joystick we are watching
-  Error(ERR_DEBUG, "watching joystick %d: (%s)\n",
+  Debug("joystick", "watching joystick %d: (%s)",
        SDL_JoystickInstanceID(joystick), name);
-  Error(ERR_DEBUG, "joystick has %d axes, %d hats, %d balls, and %d buttons\n",
+  Debug("joystick", "joystick has %d axes, %d hats, %d balls, and %d buttons",
        SDL_JoystickNumAxes(joystick), SDL_JoystickNumHats(joystick),
        SDL_JoystickNumBalls(joystick), SDL_JoystickNumButtons(joystick));
 #endif
@@ -7864,7 +7964,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
   if (success)
   {
 #if DEBUG_JOYSTICKS
-    Error(ERR_DEBUG, "New game controller mapping:\n\n%s\n\n", mapping);
+    Debug("joystick", "New game controller mapping:\n\n%s\n\n", mapping);
 #endif
 
     // activate mapping for this game
@@ -8713,7 +8813,7 @@ static void CreateScreenMenubuttons(void)
                      GDI_END);
 
     if (gi == NULL)
-      Error(ERR_EXIT, "cannot create gadget");
+      Fail("cannot create gadget");
 
     screen_gadget[id] = gi;
   }
@@ -8781,7 +8881,7 @@ static void CreateScreenScrollbuttons(void)
                      GDI_END);
 
     if (gi == NULL)
-      Error(ERR_EXIT, "cannot create gadget");
+      Fail("cannot create gadget");
 
     screen_gadget[id] = gi;
   }
@@ -8862,7 +8962,7 @@ static void CreateScreenScrollbars(void)
                      GDI_END);
 
     if (gi == NULL)
-      Error(ERR_EXIT, "cannot create gadget");
+      Fail("cannot create gadget");
 
     screen_gadget[id] = gi;
   }
@@ -8908,7 +9008,7 @@ static void CreateScreenTextInputGadgets(void)
                      GDI_END);
 
     if (gi == NULL)
-      Error(ERR_EXIT, "cannot create gadget");
+      Fail("cannot create gadget");
 
     screen_gadget[id] = gi;
   }
@@ -9048,7 +9148,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       break;
 
     case SCREEN_CTRL_ID_SCROLL_UP:
-      if (game_status == GAME_MODE_LEVELS)
+      if (game_status == GAME_MODE_NAMES)
+       HandleChoosePlayerName(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+      else if (game_status == GAME_MODE_LEVELS)
        HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELNR)
        HandleChooseLevelNr(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
@@ -9059,7 +9161,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       break;
 
     case SCREEN_CTRL_ID_SCROLL_DOWN:
-      if (game_status == GAME_MODE_LEVELS)
+      if (game_status == GAME_MODE_NAMES)
+       HandleChoosePlayerName(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+      else if (game_status == GAME_MODE_LEVELS)
        HandleChooseLevelSet(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELNR)
        HandleChooseLevelNr(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
@@ -9070,7 +9174,9 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       break;
 
     case SCREEN_CTRL_ID_SCROLL_VERTICAL:
-      if (game_status == GAME_MODE_LEVELS)
+      if (game_status == GAME_MODE_NAMES)
+       HandleChoosePlayerName(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);
+      else if (game_status == GAME_MODE_LEVELS)
        HandleChooseLevelSet(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);
       else if (game_status == GAME_MODE_LEVELNR)
        HandleChooseLevelNr(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);