From e2cd03822f28a4866f98fb0893a73b02bd60ce03 Mon Sep 17 00:00:00 2001
From: whiteshark0 <whiteshark0@b956fd51-792f-4845-bead-9b4dfca2ff2c>
Date: Thu, 5 Apr 2007 14:37:58 +0000
Subject: Added Playlist Support Working correct with Standard Mode Only for
 now Now working on Playlist Support for Party Mode

git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@59 b956fd51-792f-4845-bead-9b4dfca2ff2c
---
 Game/Code/Classes/UPliki.pas            |   3 +
 Game/Code/Screens/UScreenSong.pas       |  32 ++++-
 Game/Code/Screens/UScreenSongJumpto.pas |  21 +--
 Game/Code/Screens/UScreenSongMenu.pas   | 242 +++++++++++++++++++++++++++++---
 Game/Code/UltraStar.dpr                 |  33 ++---
 5 files changed, 270 insertions(+), 61 deletions(-)

(limited to 'Game')

diff --git a/Game/Code/Classes/UPliki.pas b/Game/Code/Classes/UPliki.pas
index 475a3752..f7692990 100644
--- a/Game/Code/Classes/UPliki.pas
+++ b/Game/Code/Classes/UPliki.pas
@@ -22,6 +22,7 @@ var
   CoversPath:       string;
   LanguagesPath:    string;
   PluginPath:       string;
+  PlayListPath:     string;
 
   Plik:       TextFile;   // all procedures in this unit operates on this file
   PlikC:      char;
@@ -49,6 +50,8 @@ begin
   //Modi Loader
   PluginPath := GamePath + 'Plugins\';
 
+  PlaylistPath := GamePath + 'Playlists\';
+
   DecimalSeparator := ',';
 end;
 
diff --git a/Game/Code/Screens/UScreenSong.pas b/Game/Code/Screens/UScreenSong.pas
index 694ecc39..6a1df197 100644
--- a/Game/Code/Screens/UScreenSong.pas
+++ b/Game/Code/Screens/UScreenSong.pas
@@ -314,12 +314,26 @@ begin
         begin
           if Length(Songs.Song) > 0 then begin
             if not CatSongs.Song[Interaction].Main then begin // clicked on Song
-              ScreenSongMenu.MenuShow(SM_Main);
+              if CatSongs.CatNumShow = -3 then
+                ScreenSongMenu.MenuShow(SM_Playlist)
+              else
+                ScreenSongMenu.MenuShow(SM_Main);
+            end
+            else
+            begin
+              ScreenSongMenu.MenuShow(SM_Playlist_Load);
             end;
           end;
         end;
 
-      SDLK_J: //Show SongMenu
+      SDLK_P: //Show Playlist Menu
+        begin
+          if Length(Songs.Song) > 0 then begin
+              ScreenSongMenu.MenuShow(SM_Playlist_Load);
+          end;
+        end;
+
+      SDLK_J: //Show Jumpto Menu
         begin
           if Length(Songs.Song) > 0 then
           begin
@@ -699,6 +713,8 @@ begin
     end
     else if (CatSongs.CatNumShow = -2) then
       Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS)
+    else if (CatSongs.CatNumShow = -3) then
+      Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS)
     else if (Ini.Tabs_at_startup = 1) then
       Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].CatNumber) + '/' + IntToStr(CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber)
     else
@@ -1144,8 +1160,18 @@ begin
     UpdateLCD;
   end;
 
+  //Playlist Mode
+  if (Mode = 0) then
+  begin
+    //If Playlist Shown -> Select Next automatically
+    if (CatSongs.CatNumShow = -3) then
+    begin
+      SelectNext;
+      ChangeMusic;
+    end;
+  end
   //Party Mode
-  if (Mode = 1) then
+  else if (Mode = 1) then
   begin
     SelectRandomSong;
   end;
diff --git a/Game/Code/Screens/UScreenSongJumpto.pas b/Game/Code/Screens/UScreenSongJumpto.pas
index c2107507..123146c7 100644
--- a/Game/Code/Screens/UScreenSongJumpto.pas
+++ b/Game/Code/Screens/UScreenSongJumpto.pas
@@ -8,10 +8,6 @@ uses
 type
   TScreenSongJumpto = class(TMenu)
     private
-      Songsfound: String;
-      NoSongsfound: String;
-      CatText: String;
-
       //For ChangeMusic
       LastPlayed: Integer;
       VisibleBool: Boolean;
@@ -157,13 +153,6 @@ var
   I:    integer;
 begin
   inherited Create;
-  //Translate Texts     //TODO: Port to UTheme (Linebonus and PartyScreens, too
-  IType[0] := Language.Translate('SONG_JUMPTO_TYPE1');
-  IType[1] := Language.Translate('SONG_JUMPTO_TYPE2');
-  IType[2] := Language.Translate('SONG_JUMPTO_TYPE3');
-  SongsFound := Language.Translate('SONG_JUMPTO_SONGSFOUND');
-  NoSongsFound := Language.Translate('SONG_JUMPTO_NOSONGSFOUND');
-  CatText := Language.Translate('SONG_JUMPTO_CATTEXT');
 
   AddBackground(Theme.SongJumpto.Background.Tex);
 
@@ -172,7 +161,7 @@ begin
     AddButtonText(14, 20, '');
 
   SelectType := 0;
-  AddSelectSlide(Theme.SongJumpto.SelectSlideType, SelectType, IType);
+  AddSelectSlide(Theme.SongJumpto.SelectSlideType, SelectType, Theme.SongJumpto.IType);
 
   AddText(Theme.SongJumpto.TextFound);
 
@@ -203,7 +192,7 @@ begin
     SelectType := 0;
 
     Button[0].Text[0].Text := '';
-    Text[0].Text := NoSongsFound;
+    Text[0].Text := Theme.SongJumpto.NoSongsFound;
   end;
 
   //Select Input
@@ -220,15 +209,15 @@ procedure TScreenSongJumpto.SetTextFound(const Count: Cardinal);
 begin
   if (Count = 0) then
   begin
-    Text[0].Text := NoSongsFound;
+    Text[0].Text := Theme.SongJumpto.NoSongsFound;
     ScreenSong.HideCatTL;
   end
   else
   begin
-    Text[0].Text := Format(SongsFound, [Count]);
+    Text[0].Text := Format(Theme.SongJumpto.SongsFound, [Count]);
 
     //Set CatTopLeftText
-    ScreenSong.ShowCatTLCustom(Format(CatText, [Button[0].Text[0].Text]));
+    ScreenSong.ShowCatTLCustom(Format(Theme.SongJumpto.CatText, [Button[0].Text[0].Text]));
   end;
 
 
diff --git a/Game/Code/Screens/UScreenSongMenu.pas b/Game/Code/Screens/UScreenSongMenu.pas
index a5ae2083..849716c4 100644
--- a/Game/Code/Screens/UScreenSongMenu.pas
+++ b/Game/Code/Screens/UScreenSongMenu.pas
@@ -22,7 +22,16 @@ type
 
 const
   SM_Main = 1;
+  
   SM_PlayList = 64 or 1;
+  SM_Playlist_Add = 64 or 2;
+  SM_Playlist_New = 64 or 3;
+
+  SM_Playlist_Del = 64 or 5;
+
+  SM_Playlist_Load = 64 or 8 or 1;
+
+
   SM_Party_Main = 128 or 1;
   SM_Party_Joker = 128 or 2;
 
@@ -33,7 +42,7 @@ var
 
 implementation
 
-uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty;
+uses UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist;
 
 function TScreenSongMenu.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
   function IsVisible: Boolean;
@@ -70,6 +79,23 @@ begin
   Result := true;
   If (PressedDown) Then
   begin // Key Down
+    if (CurMenu = SM_Playlist_New) AND (Interaction=0) then
+    begin
+      case PressedKey of
+        SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL:
+          begin
+            Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text + chr(ScanCode);
+            exit;
+          end;
+
+        SDLK_BACKSPACE:
+          begin
+            Button[Interaction].Text[0].DeleteLastL;
+            exit;
+          end;
+      end;
+    end;
+
     case PressedKey of
       SDLK_Q:
         begin
@@ -87,9 +113,6 @@ begin
           HandleReturn;
         end;
 
-      // Up and Down could be done at the same time,
-      // but I don't want to declare variables inside
-      // functions like this one, called so many times
       SDLK_DOWN:    SelectNext;
       SDLK_UP:      SelectPrev;
 
@@ -179,9 +202,9 @@ begin
         SelectsS[0].Visible := False;
 
         Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
-        Button[1].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
-        Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYMODI');
-        Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+        Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
+        Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
+        Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
       end;
 
     SM_PlayList:
@@ -189,18 +212,111 @@ begin
         CurMenu := sMenu;
         Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST');
 
+        Button[0].Visible := True;
+        Button[1].Visible := True;
+        Button[2].Visible := True;
+        Button[3].Visible := True;
+        SelectsS[0].Visible := False;
+
+        Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
+        Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
+        Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_DEL');
+        Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
+      end;
+
+    SM_Playlist_Add:
+      begin
+        CurMenu := sMenu;
+        Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_ADD');
+
+        Button[0].Visible := True;
+        Button[1].Visible := False;
+        Button[2].Visible := False;
+        Button[3].Visible := True;
+        SelectsS[0].Visible := True;
+
+        Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_NEW');
+        Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_EXISTING');
+
+        SetLength(ISelections, Length(PlaylistMan.Playlists));
+        PlaylistMan.GetNames(ISelections);
+
+        if (Length(ISelections)>=1) then
+        begin
+          UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
+        end
+        else
+        begin
+          Button[3].Visible := False;
+          SelectsS[0].Visible := False;
+          Button[2].Visible := True;
+          Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
+        end;
+      end;
+
+    SM_Playlist_New:
+      begin
+        CurMenu := sMenu;
+        Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_NEW');
+
+        Button[0].Visible := True;
+        Button[1].Visible := False;
+        Button[2].Visible := True;
+        Button[3].Visible := True;
+        SelectsS[0].Visible := False;
+
+        Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_UNNAMED');
+        Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_CREATE');
+        Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+      end;
+
+    SM_PlayList_Del:
+      begin
+        CurMenu := sMenu;
+        Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_Del');
+
         Button[0].Visible := True;
         Button[1].Visible := False;
         Button[2].Visible := False;
         Button[3].Visible := True;
         SelectsS[0].Visible := False;
 
-        Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
-        Button[1].Text[0].Text := '';
-        Button[2].Text[0].Text := '';
+        Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
         Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
       end;
 
+    SM_Playlist_Load:
+      begin
+        CurMenu := sMenu;
+        Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_LOAD');
+
+        Button[0].Visible := False;
+        Button[1].Visible := False;
+        Button[2].Visible := False;
+        Button[3].Visible := True;
+        SelectsS[0].Visible := True;
+
+        Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_LOAD');
+
+        SetLength(ISelections, Length(PlaylistMan.Playlists));
+        PlaylistMan.GetNames(ISelections);
+
+        if (Length(ISelections)>=1) then
+        begin
+          UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
+          Interaction := 4;
+        end
+        else
+        begin
+          Button[3].Visible := False;
+          SelectsS[0].Visible := False;
+          Button[2].Visible := True;
+          Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
+          Interaction := 3;
+        end;
+      end;
+
+
     SM_Party_Main:
       begin
         CurMenu := sMenu;
@@ -242,21 +358,24 @@ begin
   Case CurMenu of
     SM_Main:
       begin
-        Visible := False;
         Case Interaction of
           0: //Button 1
             begin
               ScreenSong.StartSong;
+              Visible := False;
             end;
 
           1: //Button 2
             begin
-              ScreenSong.OpenEditor;
+              //Select New Players then Sing:
+
+              Visible := False;
             end;
 
           2: //Button 3
             begin
-              //Todo: Add SingleRound Modi Support
+              //Show add to Playlist Menu
+              MenuShow(SM_Playlist_Add);
             end;
 
           3: //SelectSlide 3
@@ -266,7 +385,8 @@ begin
 
           4: //Button 4
             begin
-              //Cancel... (Do Nothing)
+              ScreenSong.OpenEditor;
+              Visible := False;
             end;
         end;
       end;
@@ -277,17 +397,21 @@ begin
         Case Interaction of
           0: //Button 1
             begin
-              //
+              ScreenSong.StartSong;
+              Visible := False;
             end;
 
           1: //Button 2
             begin
-              //
+              //Select New Players then Sing:
+
+              Visible := False;
             end;
 
           2: //Button 3
             begin
-              //Todo
+              //Show add to Playlist Menu
+              MenuShow(SM_Playlist_Del);
             end;
 
           3: //SelectSlide 3
@@ -297,7 +421,89 @@ begin
 
           4: //Button 4
             begin
-              //
+              ScreenSong.OpenEditor;
+              Visible := False;
+            end;
+        end;
+      end;
+
+    SM_Playlist_Add:
+      begin
+        Case Interaction of
+          0: //Button 1
+            begin
+              MenuShow(SM_Playlist_New);
+            end;
+
+          3: //SelectSlide 3
+            begin
+              //Dummy
+            end;
+
+          4: //Button 4
+            begin
+              PlaylistMan.AddItem(ScreenSong.Interaction, SelectValue);
+              Visible := False;
+            end;
+        end;
+      end;
+
+      SM_Playlist_New:
+      begin
+        Case Interaction of
+          0: //Button 1
+            begin
+              //Nothing, Button for Entering Name
+            end;
+
+          2: //Button 3
+            begin
+              //Create Playlist and Add Song
+              PlaylistMan.AddItem(
+              ScreenSong.Interaction,
+              PlaylistMan.AddPlaylist(Button[0].Text[0].Text));
+              Visible := False;
+            end;
+
+          3: //SelectSlide 3
+            begin
+              //Cancel -> Go back to Add screen
+              MenuShow(SM_Playlist_Add);
+            end;
+
+          4: //Button 4
+            begin
+              Visible := False;
+            end;
+        end;
+      end;
+
+    SM_PlayList_Del:
+      begin
+        Visible := False;
+        Case Interaction of
+          0: //Button 1
+            begin
+              //Delete
+              PlayListMan.DelItem(PlayListMan.GetIndexbySongID(ScreenSong.Interaction));
+              Visible := False;
+            end;
+
+          4: //Button 4
+            begin
+              MenuShow(SM_Playlist);
+            end;
+        end;
+      end;
+
+    SM_Playlist_Load:
+      begin
+        Case Interaction of
+          4: //Button 4
+            begin
+              //Load Playlist
+              PlaylistMan.SetPlayList(SelectValue);
+              Visible := False;
             end;
         end;
       end;
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
index 65a01257..66638832 100644
--- a/Game/Code/UltraStar.dpr
+++ b/Game/Code/UltraStar.dpr
@@ -6,9 +6,6 @@ program UltraStar;
 {$R 'UltraStar.res' 'UltraStar.rc'}
 
 uses
-  //------------------------------
-  //Includes - Menu System
-  //------------------------------
   UDisplay in 'Menu\UDisplay.pas',
   UMenu in 'Menu\UMenu.pas',
   UMenuStatic in 'Menu\UMenuStatic.pas',
@@ -18,10 +15,6 @@ uses
   UMenuSelect in 'Menu\UMenuSelect.pas',
   UMenuSelectSlide in 'Menu\UMenuSelectSlide.pas',
   UDrawTexture in 'Menu\UDrawTexture.pas',
-
-  //------------------------------
-  //Includes - Classes
-  //------------------------------
   UGraphic in 'Classes\UGraphic.pas',
   UTexture in 'Classes\UTexture.pas',
   UMusic in 'Classes\UMusic.pas',
@@ -49,10 +42,6 @@ uses
   UGraphicClasses in 'Classes\UGraphicClasses.pas',
   UDLLManager in 'Classes\UDLLManager.pas',
   UParty in 'Classes\UParty.pas',
-
-  //------------------------------
-  //Includes - Screens
-  //------------------------------
   UScreenLoading in 'Screens\UScreenLoading.pas',
   UScreenWelcome in 'Screens\UScreenWelcome.pas',
   UScreenMain in 'Screens\UScreenMain.pas',
@@ -76,28 +65,17 @@ uses
   UScreenTop5 in 'Screens\UScreenTop5.pas',
   UScreenSongMenu in 'Screens\UScreenSongMenu.pas',
   UScreenSongJumpto in 'Screens\UScreenSongJumpto.pas',
-
-  //------------------------------
-  //Includes - Screens PartyMode
-  //------------------------------
   UScreenSingModi in 'Screens\UScreenSingModi.pas',
   UScreenPartyNewRound in 'Screens\UScreenPartyNewRound.pas',
   UScreenPartyScore in 'Screens\UScreenPartyScore.pas',
   UScreenPartyPlayer in 'Screens\UScreenPartyPlayer.pas',
   UScreenPartyOptions in 'Screens\UScreenPartyOptions.pas',
   UScreenPartyWin in 'Screens\UScreenPartyWin.pas',
-
-  //------------------------------
-  //Includes - Modi SDK
-  //------------------------------
   ModiSDK in '..\..\Modis\SDK\ModiSDK.pas',
-
-  //------------------------------
-  //Includes - Delphi
-  //------------------------------
   Windows,
   SDL,
-  SysUtils;
+  SysUtils,
+  UPlaylist in 'Classes\UPlaylist.pas';
 
 const
   Version = 'UltraStar Deluxe V 0.90 Beta';
@@ -265,6 +243,13 @@ begin
   Log.BenchmarkEnd(1);
   Log.LogBenchmark('Loading DataBase System', 1);
 
+  //Playlist Manager
+  Log.BenchmarkStart(1);
+  Log.LogStatus('Playlist Manager', 'Initialization');
+  PlaylistMan := TPlaylistManager.Create;
+  Log.BenchmarkEnd(1);
+  Log.LogBenchmark('Loading Playlist Manager', 1);
+
   //GoldenStarsTwinkleMod
   Log.BenchmarkStart(1);
   Log.LogStatus('Effect Manager', 'Initialization');
-- 
cgit v1.2.3