+ 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();
+
+ DrawChooseTree(&leveldir_current);
+
+ PlayMenuSoundsAndMusic();
+}
+
+void HandleChooseLevelSet(int mx, int my, int dx, int dy, int button)
+{
+ HandleChooseTree(mx, my, dx, dy, button, &leveldir_current);
+}
+
+void DrawChooseLevelNr(void)
+{
+ int i;
+
+ FadeMenuSoundsAndMusic();
+
+ if (level_number != NULL)
+ {
+ freeTreeInfo(level_number);
+
+ level_number = NULL;
+ }
+
+ for (i = leveldir_current->first_level; i <= leveldir_current->last_level;i++)
+ {
+ TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_LEVEL_NR);
+ char identifier[32], name[64];
+ int value = i;
+
+ // temporarily load level info to get level name
+ LoadLevelInfoOnly(i);
+
+ ti->node_top = &level_number;
+ ti->sort_priority = 10000 + value;
+ ti->color = (level.no_level_file ? FC_BLUE :
+ LevelStats_getSolved(i) ? FC_GREEN :
+ LevelStats_getPlayed(i) ? FC_YELLOW : FC_RED);
+
+ snprintf(identifier, sizeof(identifier), "%d", value);
+ snprintf(name, sizeof(name), "%03d: %s", value,