aboutsummaryrefslogblamecommitdiffstats
path: root/Game/Code/Classes/ULyrics.pas
blob: 6f374d1e34fb338528595c51e99a62ae135344fb (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12


              
                                        







                      
                                            




















                                                                                                                                                                                
                            
















                                             






                                      













                                                                   
                                                        
                                                            





                                                


                                       


       

                     



                                     















                                        


































                                              



                                                           
                                         


                                                           



                                 

                                                   
                                    


                                                    



                                   





                                                           
                                   


                                             




                           



                                                   
                                  


                                              
































                                            
                                                         

















                                                                      









                                                   






                                  
                                                  



                 




                                                              
                                                                                                       




                                                               
                         
                 





                        


                      
              

















                                                      
                         


                 
                      






















                                       

                                    











                                       

                                   
                                                                           
                                                              

                              
                                          


               
                       







                                                
                                                              












                                        
                
                                                               
       
                                                                                        













                                                                                                                                                   
                                                              











                                        
                                                              
                                                                                                             






















                                                 
unit ULyrics;

interface
uses SysUtils, gl, glext, UMusic, UIni;

type
  TWord = record
      X:      real;
      Y:      real;
      Size:   real;
      Width:  real;
      Text:   string;
      Color:  integer; //0=normal, 1=golden
      ColR:   real;
      ColG:   real;
      ColB:   real;
      Scale:  real;
      Done:   real;
      FontStyle:  integer;
      Italic:     boolean;
      Selected:   boolean;
  end;

  TLyric = class
    private
      AlignI:         integer;
      XR:             real;
      YR:             real;
      SizeR:          real;
      SelectedI:      integer;
      ScaleR:         real;
      StyleI:         integer;          // 0 - one selection, 1 - long selection, 2 - one selection with fade to normal text, 3 - long selection with fade with color from left
      FontStyleI:     integer;          // font number
      Word:           array of TWord;
      Alpha:          real;
      procedure SetX(Value: real);
      procedure SetY(Value: real);
      function GetClientX: real;
      procedure SetAlign(Value: integer);
      function GetSize: real;
      procedure SetSize(Value: real);
      procedure SetSelected(Value: integer);
      procedure SetDone(Value: real);
      procedure SetScale(Value: real);
      procedure SetStyle(Value: integer);
      procedure SetFStyle(Value: integer);
      procedure Refresh;
      procedure DrawNormal(W: integer);
      procedure DrawPlain(W: integer);
      procedure DrawScaled(W: integer);
      procedure DrawSlide(W: integer);
    public
      ColR:     array [0..1] of real;
      ColG:     array [0..1] of real;
      ColB:     array [0..1] of real;
      ColSR:    array [0..1] of real;
      ColSG:    array [0..1] of real;
      ColSB:    array [0..1] of real;

      Italic:   boolean;
      Text:     string;   // LCD

    published
      property X: real write SetX;
      property Y: real write SetY;
      property ClientX: real read GetClientX;
      property Align: integer write SetAlign;
      property Size: real read GetSize write SetSize;
      property Selected: integer read SelectedI write SetSelected;
      property Done: real write SetDone;
      property Scale: real write SetScale;
      property Style: integer write SetStyle;
      property FontStyle: integer write SetFStyle;
      procedure AddWord(Text: string; Golden: boolean);
      procedure AddCzesc(CP, NrCzesci: integer); //AddLine?
      procedure ChangeCurText(Text: String);

      function SelectedLetter: integer;  // LCD
      function SelectedLength: integer;  // LCD

      procedure Clear;
      procedure Draw();
      procedure SetAlpha(alpha: real);
      function GetAlpha: real;

  end;

{var
  Lyric:    TLyric;}

implementation
uses TextGL, UGraphic, UDrawTexture;

procedure TLyric.SetAlpha(alpha: real);
begin
  Self.Alpha := alpha;

  if (Self.Alpha>1) then
    Self.Alpha := 1;

  if (Self.Alpha<0) then
    Self.Alpha := 0;
end;

function TLyric.GetAlpha: real;
begin
  Result := Alpha;
end;

procedure TLyric.SetX(Value: real);
begin
  XR := Value;
end;

procedure TLyric.SetY(Value: real);
begin
  YR := Value;
end;

function TLyric.GetClientX: real;
begin
  Result := Word[0].X;
end;

procedure TLyric.SetAlign(Value: integer);
begin
  AlignI := Value;
//  if AlignInt = 0 then beep;
end;

function TLyric.GetSize: real;
begin
  Result := SizeR;
end;

procedure TLyric.SetSize(Value: real);
begin
  SizeR := Value;
end;

procedure TLyric.SetSelected(Value: integer);
var
  W:  integer;
begin
  if (StyleI = 0) or (StyleI = 2) or (StyleI = 4) then
  begin
    if (SelectedI > -1) and (SelectedI <= High(Word)) then
    begin
      Word[SelectedI].Selected := false;
      Word[SelectedI].ColR := ColR[Word[SelectedI].Color];
      Word[SelectedI].ColG := ColG[Word[SelectedI].Color];
      Word[SelectedI].ColB := ColB[Word[SelectedI].Color];
      Word[SelectedI].Done := 0;
    end;

    SelectedI := Value;
    if (Value > -1) and (Value <= High(Word)) then
    begin
      Word[Value].Selected := true;
      Word[Value].ColR := ColSR[Word[Value].Color];
      Word[Value].ColG := ColSG[Word[Value].Color];
      Word[Value].ColB := ColSB[Word[Value].Color];
      Word[Value].Scale := ScaleR;
    end;
  end;

  if (StyleI = 1) or (StyleI = 3) then
  begin
    if (SelectedI > -1) and (SelectedI <= High(Word)) then
    begin
      for W := SelectedI to High(Word) do
      begin
        Word[W].Selected := false;
        Word[W].ColR := ColR[Word[W].Color];
        Word[W].ColG := ColG[Word[W].Color];
        Word[W].ColB := ColB[Word[W].Color];
        Word[W].Done := 0;
      end;
    end;

    SelectedI := Value;
    if (Value > -1) and (Value <= High(Word)) then
    begin
      for W := 0 to Value do
      begin
        Word[W].Selected := true;
        Word[W].ColR := ColSR[Word[W].Color];
        Word[W].ColG := ColSG[Word[W].Color];
        Word[W].ColB := ColSB[Word[W].Color];
        Word[W].Scale := ScaleR;
        Word[W].Done := 1;
      end;
    end;
  end;

  Refresh;
end;

procedure TLyric.SetDone(Value: real);
var
  W:    integer;
begin
  W := SelectedI;
  if W > -1 then
    Word[W].Done := Value;
end;

procedure TLyric.SetScale(Value: real);
begin
  ScaleR := Value;
end;

procedure TLyric.SetStyle(Value: integer);
begin
  StyleI := Value;
end;

procedure TLyric.SetFStyle(Value: integer);
begin
  FontStyleI := Value;
end;

procedure TLyric.AddWord(Text: string; Golden: boolean);
var
  WordNum:    integer;
begin
  WordNum := Length(Word);
  SetLength(Word, WordNum + 1);
  if WordNum = 0 then begin
    Word[WordNum].X := XR;
  end else begin
    Word[WordNum].X := Word[WordNum - 1].X + Word[WordNum - 1].Width;
  end;

  Word[WordNum].Y := YR;
  Word[WordNum].Size := SizeR;
  Word[WordNum].FontStyle := FontStyleI; // new
  SetFontStyle(FontStyleI);
  SetFontSize(SizeR);
  Word[WordNum].Width := glTextWidth(pchar(Text));
  Word[WordNum].Text := Text;

  if not Golden or (Ini.LyricsGolden=0) then
    Word[WordNum].Color := 0
  else
    Word[WordNum].Color := 1;

  Word[WordNum].ColR := ColR[Word[WordNum].Color];
  Word[WordNum].ColG := ColG[Word[WordNum].Color];
  Word[WordNum].ColB := ColB[Word[WordNum].Color];
  
  Word[WordNum].Scale := 1;
  Word[WordNum].Done := 0;
  Word[WordNum].Italic := Italic;

  Refresh;
end;

procedure TLyric.AddCzesc(CP, NrCzesci: integer);
var
  N:    integer;
begin
  Clear;
  if (Length(Czesci[CP].Czesc[NrCzesci].Nuta)>0) then
  begin
    for N := 0 to Czesci[CP].Czesc[NrCzesci].HighNut do
    begin
      Italic := Czesci[CP].Czesc[NrCzesci].Nuta[N].FreeStyle;
      AddWord(Czesci[CP].Czesc[NrCzesci].Nuta[N].Tekst, Czesci[CP].Czesc[NrCzesci].Nuta[N].Wartosc=2);
      Text := Text + Czesci[CP].Czesc[NrCzesci].Nuta[N].Tekst;
    end;
  end else
  begin
    Italic := false;
    AddWord(' ', false);
    Text := ' ';
  end;
  Selected := -1;
end;

procedure TLyric.Clear;
begin
  SetLength(Word, 0);
  Text := '';
  SelectedI := -1;
  Alpha := 1;
end;

procedure TLyric.Refresh;
var
  W:          integer;
  TotWidth:   real;
begin
  if AlignI = 1 then begin
    TotWidth := 0;
    for W := 0 to High(Word) do
      TotWidth := TotWidth + Word[W].Width;

    Word[0].X := XR - TotWidth / 2;
    for W := 1 to High(Word) do
      Word[W].X := Word[W - 1].X + Word[W - 1].Width;
  end;
end;

procedure TLyric.Draw();
var
  W:    integer;
begin
  glEnable(GL_BLEND);
  case StyleI of
    0:
      begin
        for W := 0 to High(Word) do
          DrawNormal(W);
      end;
    1:
      begin
        for W := 0 to High(Word) do
          DrawPlain(W);
      end;
    2: // zoom
      begin
        for W := 0 to High(Word) do
          if not Word[W].Selected then
            DrawNormal(W);

        for W := 0 to High(Word) do
          if Word[W].Selected then
            DrawScaled(W);
      end;
    3: // slide
      begin
        for W := 0 to High(Word) do
        begin
          if not Word[W].Selected then
            DrawNormal(W)
          else
            DrawSlide(W);
        end;
      end;
    4: // ball
      begin
        for W := 0 to High(Word) do
          DrawNormal(W);

        for W := 0 to High(Word) do
          if Word[W].Selected then
          begin
            Tex_Ball.X := (Word[W].X - 10) + Word[W].Done * Word[W].Width;
            Tex_Ball.Y := YR -12 - 10*sin(Word[W].Done * pi);
            Tex_Ball.W := 20;
            Tex_Ball.H := 20;
            DrawTexture(Tex_Ball, Alpha);
          end;
      end;
  end; // case
  glDisable(GL_BLEND);
end;

procedure TLyric.DrawNormal(W: integer);
begin
  SetFontStyle(Word[W].FontStyle);
  SetFontPos(Word[W].X+ 10*ScreenX, Word[W].Y);
  SetFontSize(Word[W].Size);
  SetFontItalic(Word[W].Italic);
  glColor4f(Word[W].ColR, Word[W].ColG, Word[W].ColB, Alpha);
  glPrint(pchar(Word[W].Text));
end;

procedure TLyric.DrawPlain(W: integer);
var
  D:    real;
begin
  D := Word[W].Done; // przyrost

  SetFontStyle(Word[W].FontStyle);
  SetFontPos(Word[W].X, Word[W].Y);
  SetFontSize(Word[W].Size);
  SetFontItalic(Word[W].Italic);
  if D = 0 then
    glColor4f(Word[W].ColR, Word[W].ColG, Word[W].ColB, Alpha)
  else
    glColor4f(ColSR[Word[W].Color], ColSG[Word[W].Color], ColSB[Word[W].Color], Alpha);

  glPrint(pchar(Word[W].Text));
end;

procedure TLyric.DrawScaled(W: integer);
var
  D:    real;
begin
  // previous plus dynamic scaling effect
  D := 1-Word[W].Done; // przyrost
  SetFontStyle(Word[W].FontStyle);
  SetFontPos(Word[W].X - D * Word[W].Width * (Word[W].Scale - 1) / 2 + (D+1)*10*ScreenX, Word[W].Y - D * 1.5 * Word[W].Size *(Word[W].Scale - 1));
  SetFontSize(Word[W].Size + D * (Word[W].Size * Word[W].Scale - Word[W].Size));
  SetFontItalic(Word[W].Italic);
  glColor4f(Word[W].ColR, Word[W].ColG, Word[W].ColB, Alpha);
  glPrint(pchar(Word[W].Text))
end;

procedure TLyric.DrawSlide(W: integer);
var
  D:    real;
begin
  D := Word[W].Done; // przyrost
  SetFontStyle(Word[W].FontStyle);
  SetFontPos(Word[W].X, Word[W].Y);
  SetFontSize(Word[W].Size);
  SetFontItalic(Word[W].Italic);
  glColor4f(Word[W].ColR, Word[W].ColG, Word[W].ColB, Alpha);
  glPrintDone(pchar(Word[W].Text), D, ColR[Word[W].Color], ColG[Word[W].Color], ColB[Word[W].Color], Alpha);
end;

function TLyric.SelectedLetter;  // LCD
var
  W:    integer;
begin
  Result := 1;

  for W := 0 to SelectedI-1 do
    Result := Result + Length(Word[W].Text);
end;

function TLyric.SelectedLength: integer;  // LCD
begin
  Result := Length(Word[SelectedI].Text);
end;

procedure TLyric.ChangeCurText(Text: String);
begin
  Word[Selected].Text := Text;
end;

end.