www.pudn.com > SiegeOfAvalon.rar > GameText.pas


unit GameText; 
{******************************************************************************} 
{                                                                              } 
{               Siege Of Avalon : Open Source Edition                          } 
{               -------------------------------------                          } 
{                                                                              } 
{ Portions created by Digital Tome L.P. Texas USA are                          } 
{ Copyright ©1999-2000 Digital Tome L.P. Texas USA                             } 
{ All Rights Reserved.                                                         } 
{                                                                              } 
{ Portions created by Team SOAOS are                                           } 
{ Copyright (C) 2003 - Team SOAOS.                                             } 
{                                                                              } 
{                                                                              } 
{ Contributor(s)                                                               } 
{ --------------                                                               } 
{ Dominique Louis                             } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{ You may retrieve the latest version of this file at the SOAOS project page : } 
{   http://www.sourceforge.com/projects/soaos                                  } 
{                                                                              } 
{ The contents of this file maybe used with permission, subject to             } 
{ the GNU Lesser General Public License Version 2.1 (the "License"); you may   } 
{ not use this file except in compliance with the License. You may             } 
{ obtain a copy of the License at                                              } 
{ http://www.opensource.org/licenses/lgpl-license.php                          } 
{                                                                              } 
{ Software distributed under the License is distributed on an                  } 
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               } 
{ implied. See the License for the specific language governing                 } 
{ rights and limitations under the License.                                    } 
{                                                                              } 
{ Description                                                                  } 
{ -----------                                                                  } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{ Requires                                                                     } 
{ --------                                                                     } 
{   DirectX Runtime libraris on Win32                                          } 
{   They are available from...                                                 } 
{   http://www.microsoft.com.                                                  } 
{                                                                              } 
{ Programming Notes                                                            } 
{ -----------------                                                            } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{                                                                              } 
{ Revision History                                                             } 
{ ----------------                                                             } 
{   July    13 2003 - DL : Initial Upload to CVS                               } 
{                                                                              } 
{******************************************************************************} 
 
{$INCLUDE Anigrp30cfg.inc} 
 
interface 
 
uses 
{$IFDEF DirectX} 
{$IFDEF DX5} 
  DirectX, 
{$ELSE} 
  DirectDraw, 
{$ENDIF} 
  DXUtil, 
  DXEffects, 
{$ENDIF} 
  Windows, 
  Forms, 
  Classes, 
  Graphics, 
  SysUtils, 
  Anigrp30, 
  Logfile; 
   
type 
  Alphabet = record 
    sx : integer; 
    sy : integer; 
    sw : integer; 
    sh : integer; 
    AdjPrev : integer; //How much to adjust for previous char 
    AdjNext : integer; //How much to adjust for next char 
    AdjTop : integer; 
  end; 
 
  TGameText = class( TObject ) 
  private 
    DXSurface : IDirectDrawSurface; 
    DXDarkSurface : IDirectDrawSurface; 
    DXTinySurface : IDirectDrawSurface; 
    DX13Surface : IDirectDrawSurface; 
    DXGoldSurface : IDirectDrawSurface; 
    DXMegaTinySurface : IDirectDrawSurface; 
    Letter : array[ 32..255 ] of Alphabet; 
    DarkLetter : array[ 32..255 ] of Alphabet; 
    TinyLetter : array[ 32..255 ] of Alphabet; 
    F13Letter : array[ 32..255 ] of Alphabet; 
    MegaTinyLetter : array[ 32..255 ] of Alphabet; 
    procedure LoadText; 
  public 
    constructor Create; 
    destructor Destroy; override; 
    procedure PlotText( Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotDarkText( Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotDarkText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotTinyText( Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotTinyText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    function PlotTinyTextBlock( Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
    procedure PlotMegaTinyText( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotF13Text( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    procedure PlotF13TextCentered( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ); 
    function PlotTextCentered( Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
    function PlotTextCentered2( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
    function PlotDarkTextCentered( Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
    function PlotDarkTextCentered2( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
    function PlotTextBlock( Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
    procedure PlotGoldText( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
    function PlotGoldTextCentered( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
    function PlotGoldTextBlock( Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
    function TextBlockHeight( Sentence : string; X, X2, Y : integer ) : integer; 
    procedure BreakTextIntoAStringList( const Sentence : string; const daList : TStringList; x1, x2 : integer ); 
    function PlotF13Block( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
    procedure LoadFontGraphic( ScreenName : string ); 
    procedure LoadDarkFontGraphic( ScreenName : string ); 
    procedure LoadTinyFontGraphic; 
    procedure UnLoadTinyFontGraphic; 
    procedure Load13Graphic; 
    procedure UnLoad13Graphic; 
    procedure LoadMegaTinyFontGraphic; 
    procedure UnLoadMegaTinyFontGraphic; 
    procedure LoadGoldFontGraphic; 
    procedure UnLoadGoldFontGraphic; 
    function TextLength( Sentence : string ) : integer; 
    function TinyTextLength( Sentence : string ) : integer; 
    procedure PlotSquishedText( Sentence : string; X, Y, Alpha : integer ); 
    function PlotTextBlockAroundBox( Sentence : string; X, X2, Y, Alpha : integer; cRect : TRect ) : integer; 
 
  end; 
 
implementation 
uses 
  AniDemo; 
{ TGameText } 
 
constructor TGameText.Create; 
const 
  FailName : string = 'TGameText.Create'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    LoadText; 
    LoadFontGraphic( 'Inventory' ); 
    LoadDarkFontGraphic( 'Inventory' ); 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
destructor TGameText.Destroy; 
const 
  FailName : string = 'TGameText.destroy'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
    if assigned( DXSurface ) then 
      DXSurface := nil; 
    if assigned( DXDarkSurface ) then 
      DXDarkSurface := nil; 
    if assigned( DXTinySurface ) then 
      DXTinySurface := nil; 
    if assigned( DXMegaTinySurface ) then 
      DXMegaTinySurface := nil; 
    if assigned( DX13Surface ) then 
      DX13Surface := nil; 
    if assigned( DXGoldSurface ) then 
      DXGoldSurface := nil; 
    inherited; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
procedure TGameText.LoadFontGraphic( ScreenName : string ); 
var 
  BM : TBitmap; 
const 
  FailName : string = 'TGameText.LoadOfntGraphic'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    if assigned( DXSurface ) then 
      DXSurface := nil; 
    BM := TBitmap.create; 
    if Lowercase( Screenname ) = 'inventory' then 
      BM.LoadFromFile( InterfacePath + 'fntInvFont.bmp' ) 
    else if Lowercase( Screenname ) = 'statistics' then 
      BM.LoadFromFile( InterfacePath + 'fntStatFont.bmp' ) 
    else if Lowercase( Screenname ) = 'createchar' then 
      BM.LoadFromFile( InterfacePath + 'fntGoldFont.bmp' ); 
 
    DXSurface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
    BM.free; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.LoadFontGraphic 
 
procedure TGameText.LoadDarkFontGraphic( ScreenName : string ); 
var 
  BM : TBitmap; 
const 
  FailName : string = 'TGameText.LoadDarkFontGraphic'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    if assigned( DXDarkSurface ) then 
      exit; 
    BM := TBitmap.create; 
    BM.LoadFromFile( InterfacePath + 'fntBoldFont.bmp' ); 
    DXDarkSurface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
    BM.free; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.LoadDarkFontGraphic 
 
procedure TGameText.LoadTinyFontGraphic( ); 
var 
  BM : TBitmap; 
begin 
  if assigned( DXTinySurface ) then 
    exit; 
  BM := TBitmap.create; 
  BM.LoadFromFile( InterfacePath + 'fntTinyFont.bmp' ); 
  DXTinySurface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
  BM.free; 
 
end; //TGameText.LoadTinyFontGraphic 
 
procedure TGameText.UnloadTinyFontGraphic( ); 
begin; 
  if assigned( DXTinySurface ) then 
    DXTinySurface := nil; 
 
end; //TGameText.UnloadTinyFontGraphic 
 
procedure TGameText.Load13Graphic( ); 
var 
  BM : TBitmap; 
begin 
  if assigned( DX13Surface ) then 
    exit; 
  BM := TBitmap.create; 
  BM.LoadFromFile( InterfacePath + 'fnt13.bmp' ); 
  DX13Surface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
  BM.free; 
 
end; //TGameText.Load13Graphic 
 
procedure TGameText.Unload13Graphic( ); 
begin; 
  if assigned( DX13Surface ) then 
    DX13Surface := nil; 
 
end; //TGameText.Unload13Graphic 
 
procedure TGameText.LoadMegaTinyFontGraphic( ); 
var 
  BM : TBitmap; 
begin 
  if assigned( DXMegaTinySurface ) then 
    exit; 
  BM := TBitmap.create; 
  BM.LoadFromFile( InterfacePath + 'fntMegaTinyFont.bmp' ); 
  DXMegaTinySurface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
  BM.free; 
 
end; //TGameText.LoadMegaTinyFontGraphic 
 
procedure TGameText.UnloadMegaTinyFontGraphic( ); 
begin; 
  if assigned( DXMegaTinySurface ) then 
    DXMegaTinySurface := nil; 
 
end; //TGameText.UnloadTinyFontGraphic 
 
 
procedure TGameText.LoadText; 
var 
  F : TextFile; 
  i : integer; 
const 
  FailName : string = 'TGameText.LoadText'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
 
    if FileExists( InterfacePath + 'fntAlphaCoords.dat' ) then 
    begin 
      AssignFile( F, InterfacePath + 'fntAlphaCoords.dat' ); 
      Reset( F ); 
      i := 32; 
      while not Eof( F ) do 
      begin 
        Read( F, Letter[ i ].sx, Letter[ i ].sy, Letter[ i ].sw, Letter[ i ].sh, Letter[ i ].AdjPrev, Letter[ i ].AdjNext, Letter[ i ].AdjTop ); 
        i := i + 1; 
        if i > 255 then 
          break; 
      end; 
      CloseFile( F ); 
    end 
    else 
    begin 
      AssignFile( F, InterfacePath + 'fnterror.txt' ); 
      Rewrite( F ); 
      write( F, 'Didnt find file AlphaCoords.dat' ); 
      CloseFile( F ); 
    end; 
  //And Now the Dark Font 
    if FileExists( InterfacePath + 'fntDarkAlphaCoords.dat' ) then 
    begin 
      AssignFile( F, InterfacePath + 'fntDarkAlphaCoords.dat' ); 
      Reset( F ); 
      i := 32; 
      while not Eof( F ) do 
      begin 
        Read( F, DarkLetter[ i ].sx, DarkLetter[ i ].sy, DarkLetter[ i ].sw, DarkLetter[ i ].sh, DarkLetter[ i ].AdjPrev, DarkLetter[ i ].AdjNext, DarkLetter[ i ].AdjTop ); 
        i := i + 1; 
        if i > 255 then 
          break; 
      end; 
      CloseFile( F ); 
    end 
    else 
    begin 
      AssignFile( F, InterfacePath + 'fnterror.txt' ); 
      Rewrite( F ); 
      write( F, 'Didnt find file DarkAlphaCoords' ); 
      CloseFile( F ); 
    end; 
  //And Now the Tiny Font 
    if FileExists( InterfacePath + 'fntTinyCoords.dat' ) then 
    begin 
      AssignFile( F, InterfacePath + 'fntTinyCoords.dat' ); 
      Reset( F ); 
      i := 32; 
      while not Eof( F ) do 
      begin 
        Read( F, TinyLetter[ i ].sx, TinyLetter[ i ].sy, TinyLetter[ i ].sw, TinyLetter[ i ].sh, TinyLetter[ i ].AdjPrev, TinyLetter[ i ].AdjNext, TinyLetter[ i ].AdjTop ); 
        i := i + 1; 
        if i > 255 then 
          break; 
      end; 
      CloseFile( F ); 
    end 
    else 
    begin 
      AssignFile( F, InterfacePath + 'fnterror.txt' ); 
      Rewrite( F ); 
      write( F, 'Didnt find file TinyCoords' ); 
      CloseFile( F ); 
    end; 
 
  //And Now the Mega Tiny Font 
    if FileExists( InterfacePath + 'fntMegaTinyCoords.dat' ) then 
    begin 
      AssignFile( F, InterfacePath + 'fntMegaTinyCoords.dat' ); 
      Reset( F ); 
      i := 32; 
      while not Eof( F ) do 
      begin 
        Read( F, MegaTinyLetter[ i ].sx, MegaTinyLetter[ i ].sy, MegaTinyLetter[ i ].sw, MegaTinyLetter[ i ].sh, MegaTinyLetter[ i ].AdjPrev, MegaTinyLetter[ i ].AdjNext, MegaTinyLetter[ i ].AdjTop ); 
        i := i + 1; 
        if i > 255 then 
          break; 
      end; 
      CloseFile( F ); 
    end 
    else 
    begin 
      AssignFile( F, InterfacePath + 'fnterror.txt' ); 
      Rewrite( F ); 
      write( F, 'Didnt find file MegaTinyCoords' ); 
      CloseFile( F ); 
    end; 
  //And Now the 13 Tiny Font 
    if FileExists( InterfacePath + 'fnt13Coords.dat' ) then 
    begin 
      AssignFile( F, InterfacePath + 'fnt13Coords.dat' ); 
      Reset( F ); 
      i := 32; 
      while not Eof( F ) do 
      begin 
        Read( F, F13Letter[ i ].sx, F13Letter[ i ].sy, F13Letter[ i ].sw, F13Letter[ i ].sh, F13Letter[ i ].AdjPrev, F13Letter[ i ].AdjNext, F13Letter[ i ].AdjTop ); 
        i := i + 1; 
        if i > 255 then 
          break; 
      end; 
      CloseFile( F ); 
    end 
    else 
    begin 
      AssignFile( F, InterfacePath + 'fnterror.txt' ); 
      Rewrite( F ); 
      write( F, 'Didnt find file fnt13Coords' ); 
      CloseFile( F ); 
    end; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.LoadText 
 
procedure TGameText.PlotDarkText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PLotDarkText'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
  //i := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      DrawAlpha( DX, Rect( X + XStart + DarkLetter[ j ].AdjPrev, Y + DarkLetter[ j ].AdjTop, X + XStart + DarkLetter[ j ].sw + DarkLetter[ j ].AdjPrev, Y + DarkLetter[ j ].AdjTop + DarkLetter[ j ].sh ), Rect( DarkLetter[ j ].sx, DarkLetter[ j ].sy, DarkLetter[ j ].sx + DarkLetter[ j ].sw, DarkLetter[ j ].sy + DarkLetter[ j ].sh ), DXDarkSurface, true, Alpha ); 
     //DrawMult(DX,Rect(X+XStart+ Letter[j].AdjPrev,Y,X+XStart+Letter[j].sw+ Letter[j].AdjPrev,Y+Letter[j].sh),Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh), DXSurface,true,220); 
 
      XStart := XStart + DarkLetter[ j ].sw + DarkLetter[ j ].AdjPrev + DarkLetter[ j ].AdjNext; 
      XStart := XStart - 1; 
     //i:=i+1; 
    end; //end for 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotDarkText 
 
procedure TGameText.PlotTinyText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotTinyText'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
  //i := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      DrawAlpha( DX, Rect( X + XStart + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop, X + XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop + TinyLetter[ j ].sh ), Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DXTinySurface, true, Alpha ); 
     //DrawMult(lpDDSBack,Rect(X+XStart+ Letter[j].AdjPrev,Y,X+XStart+Letter[j].sw+ Letter[j].AdjPrev,Y+Letter[j].sh),Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh), DXSurface,true,220); 
 
      XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
     //i:=i+1; 
    end; //end for 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotTinyText 
 
procedure TGameText.PlotTinyText( Sentence : string; X, Y, Alpha : integer ); 
begin 
  PlotTinyText2( lpDDSBack, Sentence, X, Y, Alpha ); 
end; 
 
procedure TGameText.PlotMegaTinyText( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotMegaTinyText'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      DrawAlpha( DX, Rect( X + XStart + MegaTinyLetter[ j ].AdjPrev, Y + MegaTinyLetter[ j ].AdjTop, X + XStart + MegaTinyLetter[ j ].sw + MegaTinyLetter[ j ].AdjPrev, Y + MegaTinyLetter[ j ].AdjTop + MegaTinyLetter[ j ].sh ), Rect( MegaTinyLetter[ j ].sx, MegaTinyLetter[ j ].sy, MegaTinyLetter[ j ].sx + MegaTinyLetter[ j ].sw, MegaTinyLetter[ j ].sy + MegaTinyLetter[ j ].sh ), DXMegaTinySurface, true, Alpha ); 
      XStart := XStart + MegaTinyLetter[ j ].sw + MegaTinyLetter[ j ].AdjPrev + MegaTinyLetter[ j ].AdjNext; 
    end; //end for 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotMegaTinyText 
 
procedure TGameText.PlotF13Text( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotF13Text'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      DrawAlpha( DX, Rect( X + XStart + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop, X + XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop + F13Letter[ j ].sh ), Rect( F13Letter[ j ].sx, F13Letter[ j ].sy, F13Letter[ j ].sx + F13Letter[ j ].sw, F13Letter[ j ].sy + F13Letter[ j ].sh ), DX13Surface, true, Alpha ); 
      XStart := XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev + F13Letter[ j ].AdjNext; 
    end; //end for 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotF13Text 
 
 
procedure TGameText.PlotText( Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.Plottext'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
     //WrapperBltFast( lpDDSBack, X+XStart,Y,DXSurface,Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx + Letter[j].sw, Letter[j].sy+Letter[j].sh),DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT); 
      if Alpha > 0 then 
        DrawAlpha( lpDDSBack, Rect( X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
      else 
        WrapperBltFast( lpDDSBack, X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
     //i=i+1; 
    end; //wend 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotText 
 
procedure TGameText.PlotText2( DX : IDirectDrawSurface; Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotText2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotText2 
 
procedure TGameText.PlotSquishedText( Sentence : string; X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotSquishedText'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
     //WrapperBltFast( lpDDSBack, X+XStart,Y,DXSurface,Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx + Letter[j].sw, Letter[j].sy+Letter[j].sh),DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT); 
      if Alpha > 0 then 
        DrawAlpha( lpDDSBack, Rect( X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
      else 
        WrapperBltFast( lpDDSBack, X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext - 1; 
     //i=i+1; 
    end; //wend 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotSquishedText 
 
 
function TGameText.PlotTextCentered( Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
  TheLength : integer; 
  ThereWasRoom : boolean; 
const 
  FailName : string = 'TGameText.PlotTextCentered'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := false; 
  try 
 
    TheLength := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
 
    ThereWasRoom := True; 
    XStart := ( ( X2 - X ) - TheLength ) div 2; //center the line of text 
    if XStart < X then 
    begin //there wasn't enough space for the entire line 
      ThereWasRoom := false; 
    end; 
 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( lpDDSBack, Rect( X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
      else 
        WrapperBltFast( lpDDSBack, X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
 
    Result := ThereWasRoom; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotTextCentered 
 
 
function TGameText.PlotTextCentered2( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
  TheLength : integer; 
  ThereWasRoom : boolean; 
const 
  FailName : string = 'TGameText.PlotTextCentered2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := false; 
  try 
 
    TheLength := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
 
    ThereWasRoom := True; 
    XStart := ( ( X2 - X ) - TheLength ) div 2; //center the line of text 
    if XStart < X then 
    begin //there wasn't enough space for the entire line 
      ThereWasRoom := false; 
    end; 
 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
 
    Result := ThereWasRoom; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotTextCentered2 
 
function TGameText.PlotDarkTextCentered2( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
  TheLength : integer; 
  ThereWasRoom : boolean; 
const 
  FailName : string = 'TGameText.PlotDarktextCentered2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := false; 
  try 
 
    TheLength := 0; 
 
    for i := 1 to length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      TheLength := TheLength + DarkLetter[ j ].sw + DarkLetter[ j ].AdjPrev + DarkLetter[ j ].AdjNext - 1; 
    end; //wend 
 
    ThereWasRoom := True; 
    XStart := ( ( X2 - X ) - TheLength ) div 2; //center the line of text 
    if XStart < X then 
    begin //there wasn't enough space for the entire line 
      ThereWasRoom := false; 
    end; 
 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + DarkLetter[ j ].AdjPrev, Y + DarkLetter[ j ].AdjTop, X + XStart + DarkLetter[ j ].sw + DarkLetter[ j ].AdjPrev, Y + DarkLetter[ j ].AdjTop + DarkLetter[ j ].sh ), Rect( DarkLetter[ j ].sx, DarkLetter[ j ].sy, DarkLetter[ j ].sx + DarkLetter[ j ].sw, DarkLetter[ j ].sy + DarkLetter[ j ].sh ), DXDarkSurface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + DarkLetter[ j ].AdjPrev, Y + DarkLetter[ j ].AdjTop, DXDarkSurface, Rect( DarkLetter[ j ].sx, DarkLetter[ j ].sy, DarkLetter[ j ].sx + DarkLetter[ j ].sw, DarkLetter[ j ].sy + DarkLetter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + DarkLetter[ j ].sw + DarkLetter[ j ].AdjPrev + DarkLetter[ j ].AdjNext - 1; 
    end; //wend 
 
    Result := ThereWasRoom; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotDarkTextCentered 
 
function TGameText.PlotTextBlock( Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  NL : integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace, PrevLastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
const 
  FailName : string = 'TGameText.PlotTextBlock'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    PrevLastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > PrevLastSpace ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
          LastSpace := PrevLastSpace; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
    NL := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
        if Alpha > 0 then 
          DrawAlpha( lpDDSBack, Rect( X + XStart + Letter[ j ].AdjPrev, Y + k * 22 + NL * 22 + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh + k * 22 + NL * 22 ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
        else 
          WrapperBltFast( lpDDSBack, X + XStart + Letter[ j ].AdjPrev, Y + k * 22 + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
        XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotTextBlock 
 
function TGameText.TextBlockHeight( Sentence : string; X, X2, Y : integer ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  //NL: integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace, PrevLastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
const 
  FailName : string = 'TGameText.PlotTextBlock'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    PrevLastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > PrevLastSpace ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
          LastSpace := PrevLastSpace; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
  //NL:=0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        //NL:=NL+1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
      //  if Alpha > 0 then 
      //     DrawAlpha(lpDDSBack,Rect(X+XStart+Letter[j].AdjPrev,Y+k*22+NL*22,X+XStart+Letter[j].sw+Letter[j].AdjPrev,Y+Letter[j].sh+k*22+NL*22),Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh), DXSurface,true,Alpha) 
      //  else 
      //     WrapperBltFast( lpDDSBack, X+XStart+Letter[j].AdjPrev,Y+k*22,DXSurface,Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh),DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT); 
        XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.TextBlockHeight 
 
 
function TGameText.PlotF13Block( DX : IDirectDrawSurface; Sentence : string; X, X2, Y, Alpha : integer ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  NL : integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace, PrevLastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
const 
  FailName : string = 'TGameText.Plotf13block'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    PrevLastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev + F13Letter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > PrevLastSpace ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
          LastSpace := PrevLastSpace; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
    NL := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
        if Alpha > 0 then 
          DrawAlpha( DX, Rect( X + XStart + F13Letter[ j ].AdjPrev, Y + k * 13 + NL * 13 + F13Letter[ j ].AdjTop, X + XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop + F13Letter[ j ].sh + k * 13 + NL * 13 ), Rect( F13Letter[ j ].sx, F13Letter[ j ].sy, F13Letter[ j ].sx + F13Letter[ j ].sw, F13Letter[ j ].sy + F13Letter[ j ].sh ), DX13Surface, true, Alpha ) 
        else 
          WrapperBltFast( DX, X + XStart + F13Letter[ j ].AdjPrev, Y + k * 13 + F13Letter[ j ].AdjTop, DX13Surface, Rect( F13Letter[ j ].sx, F13Letter[ j ].sy, F13Letter[ j ].sx + F13Letter[ j ].sw, F13Letter[ j ].sy + F13Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
        XStart := XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev + F13Letter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotF13Block 
 
function TGameText.PlotTextBlockAroundBox( Sentence : string; X, X2, Y, Alpha : integer; cRect : TRect ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  NL : integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace : integer; 
  LineBreak : array[ 0..500 ] of integer; 
  rRect : TRect; 
const 
  FailName : string = 'TGameText.PlotTextAroundBlock'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
 
    NL := 0; 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if ( j = 13 ) then 
      begin 
        i := i + 1; 
        TheLength := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else if ( TheLength = 0 ) and IntersectRect( rRect, cRect, rect( X + TheLength, K * 22 + NL * 22 + Y, X + TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext, K * 22 + NL * 22 + Y + 22 ) ) then 
      begin 
        while IntersectRect( rRect, cRect, rect( X + TheLength, K * 22 + NL * 22 + Y, X + TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext, K * 22 + NL * 22 + Y + 22 ) ) and ( TheLength < ( X2 - X ) ) do 
        begin 
          TheLength := TheLength + 1; 
        end; 
        i := i + 1; 
      end 
      else if IntersectRect( rRect, cRect, rect( X + TheLength, K * 22 + NL * 22 + Y, X + TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext, K * 22 + NL * 22 + 22 + Y ) ) then 
      begin 
        LineBreak[ k ] := LastSpace; 
        k := k + 1; 
        TheLength := 0; 
        i := LastSpace + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > 0 ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
    NL := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
        //if XStart < 300 then begin 
        while IntersectRect( rRect, cRect, rect( X + XStart, K * 22 + NL * 22 + Y, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext, K * 22 + NL * 22 + Y + 22 ) ) and ( XStart < X2 ) do 
        begin 
          XStart := XStart + 1; 
        end; 
        //end; 
        if Alpha > 0 then 
          DrawAlpha( lpDDSBack, Rect( X + XStart + Letter[ j ].AdjPrev, Y + k * 22 + NL * 22 + Letter[ j ].AdjTop, X + XStart + Letter[ j ].sw + Letter[ j ].AdjPrev, Y + Letter[ j ].AdjTop + Letter[ j ].sh + k * 22 + NL * 22 ), Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DXSurface, true, Alpha ) 
        else 
          WrapperBltFast( lpDDSBack, X + XStart + Letter[ j ].AdjPrev, Y + k * 22 + Letter[ j ].AdjTop, DXSurface, Rect( Letter[ j ].sx, Letter[ j ].sy, Letter[ j ].sx + Letter[ j ].sw, Letter[ j ].sy + Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
        XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.PlotTextBlockAroundBox 
 
function TGameText.TextLength( Sentence : string ) : integer; 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.TextLength'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
     //if Alpha > 0 then 
     //   DrawAlpha(lpDDSBack,Rect(X+XStart+ Letter[j].AdjPrev,Y,X+XStart+Letter[j].sw+ Letter[j].AdjPrev,Y+Letter[j].sh),Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh), DXSurface,true,Alpha) 
     //else 
     //   WrapperBltFast( lpDDSBack, X+XStart+Letter[j].AdjPrev, Y, DXSurface,Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh),DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT); 
      XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
    end; //wend 
 
    Result := XStart; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.TextLength 
 
function TGameText.TinyTextLength( Sentence : string ) : integer; 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.TinyTextlength'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
    end; //wend 
 
    Result := XStart; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; //TGameText.TinyTextLength 
 
 
procedure TGameText.BreakTextIntoAStringList( const Sentence : string; const daList : TStringList; X1, X2 : integer ); 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  //NL: integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
  daString : string; 
const 
  FailName : string = 'TGameText.BreakTextIntoAStringList'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
//Result:=0; 
  try 
 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X1 ) ) and ( LastSpace > 0 ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    daString := ''; 
    XStart := 0; 
    k := 0; 
  //NL:=0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        daList.add( daString ); 
        XStart := 0; 
        //NL:=NL+1; 
        daString := ''; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        daList.add( daString ); 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
        daString := ''; 
      end 
      else 
      begin 
       // if Alpha > 0 then 
       //    DrawAlpha(lpDDSBack,Rect(X+XStart+Letter[j].AdjPrev,Y+k*22+NL*22,X+XStart+Letter[j].sw+Letter[j].AdjPrev,Y+Letter[j].sh+k*22+NL*22),Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh), DXSurface,true,Alpha) 
       // else 
       //    WrapperBltFast( lpDDSBack, X+XStart+Letter[j].AdjPrev,Y+k*22,DXSurface,Rect(Letter[j].sx,Letter[j].sy,Letter[j].sx+Letter[j].sw,Letter[j].sy+Letter[j].sh),DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT); 
        daString := daString + chr( j ); 
        XStart := XStart + Letter[ j ].sw + Letter[ j ].AdjPrev + Letter[ j ].AdjNext; 
      end; 
    end; //endfor 
    daList.add( daString ); 
  //Result:=k+1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
 
end; //BreakTextIntoAStringList 
 
function TGameText.PlotDarkTextCentered( Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
begin 
  result := PlotDarkTextCentered2( lpDDSBack, Sentence, X, X2, Y, Alpha ); 
end; 
 
procedure TGameText.PlotDarkText( Sentence : string; 
  X, Y, Alpha : integer ); 
begin 
  PlotDarkText2( lpDDSBack, Sentence, X, Y, Alpha ); 
end; 
 
procedure TGameText.PlotF13TextCentered( DX : IDirectDrawSurface; 
  Sentence : string; X, X2, Y, Alpha : integer ); 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
  TheLength : integer; 
const 
  FailName : string = 'TGameText.PlotTextCentered2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    TheLength := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      TheLength := TheLength + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev + F13Letter[ j ].AdjNext; 
    end; //wend 
 
    XStart := ( ( X2 - X ) - TheLength ) div 2; //center the line of text 
 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop, X + XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop + F13Letter[ j ].sh ), Rect( F13Letter[ j ].sx, F13Letter[ j ].sy, F13Letter[ j ].sx + F13Letter[ j ].sw, F13Letter[ j ].sy + F13Letter[ j ].sh ), DX13Surface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + F13Letter[ j ].AdjPrev, Y + F13Letter[ j ].AdjTop, DXSurface, Rect( F13Letter[ j ].sx, F13Letter[ j ].sy, F13Letter[ j ].sx + F13Letter[ j ].sw, F13Letter[ j ].sy + F13Letter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + F13Letter[ j ].sw + F13Letter[ j ].AdjPrev + F13Letter[ j ].AdjNext; 
    end; //wend 
 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
procedure TGameText.LoadGoldFontGraphic; 
var 
  BM : TBitmap; 
begin 
  if assigned( DXGoldSurface ) then 
    exit; 
  BM := TBitmap.create; 
  BM.LoadFromFile( InterfacePath + 'fntTinyGold.bmp' ); 
  DXGoldSurface := DDGetImage( lpDD, BM, $00FFFF00, false ); 
  BM.free; 
end; 
 
procedure TGameText.PlotGoldText( DX : IDirectDrawSurface; Sentence : string; 
  X, Y, Alpha : integer ); 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
const 
  FailName : string = 'TGameText.PlotText2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  try 
 
    XStart := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop, X + XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop + TinyLetter[ j ].sh ), Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DXGoldSurface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop, DXGoldSurface, Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
    end; //wend 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
function TGameText.PlotGoldTextBlock( Sentence : string; X, X2, Y, 
  Alpha : integer ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  NL : integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace, PrevLastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
const 
  FailName : string = 'TGameText.PlotTextBlock'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    PrevLastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > PrevLastSpace ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
          LastSpace := PrevLastSpace; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
    NL := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
        if Alpha > 0 then 
          DrawAlpha( lpDDSBack, Rect( X + XStart + TinyLetter[ j ].AdjPrev, Y + k * 22 + NL * 22 + TinyLetter[ j ].AdjTop, X + XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop + TinyLetter[ j ].sh + k * 22 + NL * 22 ), Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DXGoldSurface, true, Alpha ) 
        else 
          WrapperBltFast( lpDDSBack, X + XStart + TinyLetter[ j ].AdjPrev, Y + k * 22 + TinyLetter[ j ].AdjTop, DXGoldSurface, Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
        XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
function TGameText.PlotGoldTextCentered( DX : IDirectDrawSurface; 
  Sentence : string; X, X2, Y, Alpha : integer ) : boolean; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  XStart : integer; 
  TheLength : integer; 
  ThereWasRoom : boolean; 
const 
  FailName : string = 'TGameText.PlotTextCentered2'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := false; 
  try 
 
    TheLength := 0; 
  //while (Sentence[i] <> #0) do begin 
    for i := 1 to length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      TheLength := TheLength + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
    end; //wend 
 
    ThereWasRoom := True; 
    XStart := ( ( X2 - X ) - TheLength ) div 2; //center the line of text 
    if XStart < X then 
    begin //there wasn't enough space for the entire line 
      ThereWasRoom := false; 
    end; 
 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if Alpha > 0 then 
        DrawAlpha( DX, Rect( X + XStart + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop, X + XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop + TinyLetter[ j ].sh ), Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DXGoldSurface, true, Alpha ) 
      else 
        WrapperBltFast( DX, X + XStart + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop, DXGoldSurface, Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
      XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
    end; //wend 
 
    Result := ThereWasRoom; 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
procedure TGameText.UnLoadGoldFontGraphic; 
begin 
  if assigned( DXGoldSurface ) then 
    DXGoldSurface := nil; 
end; 
 
function TGameText.PlotTinyTextBlock( Sentence : string; X, X2, Y, 
  Alpha : integer ) : integer; 
//Plots a line of text centered between X and X2 
var 
  i : integer; 
  j : integer; 
  k : integer; 
  NL : integer; 
  XStart : integer; 
  TheLength : integer; 
  LastSpace, PrevLastSpace : integer; 
  LineBreak : array[ 0..50 ] of integer; 
const 
  FailName : string = 'TGameText.PlotTextBlock'; 
begin 
{$IFDEF DODEBUG} 
  if ( CurrDbgLvl >= DbgLvlSevere ) then 
    Log.LogEntry( FailName ); 
{$ENDIF} 
  Result := 0; 
  try 
    i := 1; 
    k := 0; 
    TheLength := 0; 
    LastSpace := 0; 
    PrevLastSpace := 0; 
    LineBreak[ 0 ] := 9999; //in case there are no line breaks, we initalize to an absurdly high number 
  //for i:=0 to Length(Sentence)-1 do begin 
    while i <= Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
 
      if j = 13 then 
      begin 
        //debugPlot(j); 
        i := i + 1; 
        TheLength := 0; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
        i := i + 1; 
      end 
      else 
      begin 
        if ( j = 32 ) then 
        begin //if its a space or linefeed 
          LastSpace := i; 
        end; 
        TheLength := TheLength + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
        if ( TheLength > ( X2 - X ) ) and ( LastSpace > PrevLastSpace ) then 
        begin //time to break the line - if we havent had a space yet, we jsut keep going to avoid a lockup 
          LineBreak[ k ] := LastSpace; 
          k := k + 1; 
          TheLength := 0; 
          i := LastSpace + 1; 
          LastSpace := PrevLastSpace; 
        end 
        else 
          i := i + 1; 
      end; 
 
    end; //wend 
    LineBreak[ k ] := 9999; //set the last linebreak absurdly high - we have to initialize this last break 
 
    XStart := 0; 
    k := 0; 
    NL := 0; 
    for i := 1 to Length( Sentence ) do 
    begin 
      j := integer( Sentence[ i ] ); 
      if j = 13 then 
      begin 
        XStart := 0; 
        NL := NL + 1; 
      end 
      else if ( j < 32 ) or ( j > 255 ) then 
      begin 
      end 
      else if i = LineBreak[ k ] then 
      begin //we've hit a space at a line break 
        k := k + 1; //so inc the index to the next break, and skip this space plot 
        XStart := 0; 
      end 
      else 
      begin 
        if Alpha > 0 then 
          DrawAlpha( lpDDSBack, Rect( X + XStart + TinyLetter[ j ].AdjPrev, Y + k * 18 + NL * 18 + TinyLetter[ j ].AdjTop, X + XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev, Y + TinyLetter[ j ].AdjTop + TinyLetter[ j ].sh + k * 18 + NL * 18 ), Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DXTinySurface, true, Alpha ) 
        else 
          WrapperBltFast( lpDDSBack, X + XStart + TinyLetter[ j ].AdjPrev, Y + k * 18 + TinyLetter[ j ].AdjTop, DXTinySurface, Rect( TinyLetter[ j ].sx, TinyLetter[ j ].sy, TinyLetter[ j ].sx + TinyLetter[ j ].sw, TinyLetter[ j ].sy + TinyLetter[ j ].sh ), DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT ); 
        XStart := XStart + TinyLetter[ j ].sw + TinyLetter[ j ].AdjPrev + TinyLetter[ j ].AdjNext; 
      end; 
    end; //endfor 
 
    Result := k + 1; //return the number of lines we run through 
  except 
    on E : Exception do 
      Log.log( FailName + E.Message ); 
  end; 
end; 
 
end.