X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fsfs%2FsfsPlainFS.pas;h=81eb440964a7459bea276e1f401de216d221a0e1;hb=2c514f6c21866e5434865d550238e62979c7add2;hp=c96dbf954a4ac62f67afe58c53bbe68601553524;hpb=fc715be74194fb63ae846d2972dab82ebf589b99;p=d2df-sdl.git diff --git a/src/sfs/sfsPlainFS.pas b/src/sfs/sfsPlainFS.pas index c96dbf9..81eb440 100644 --- a/src/sfs/sfsPlainFS.pas +++ b/src/sfs/sfsPlainFS.pas @@ -18,6 +18,7 @@ // file type. // undefine this and file type will be directory name. {.$DEFINE SFS_PLAIN_FS_DEBUG_ALLEGRO} +{.$DEFINE SFS_PLAINFS_FULL} {$MODE DELPHI} {.$R-} unit sfsPlainFS; @@ -28,17 +29,29 @@ uses SysUtils, Classes, Contnrs, sfs; - type TSFSPlainVolumeType = - (sfspvNone, sfspvWAD, sfspvPAK, sfspvGRP, sfspvSPE, sfspvWAD2, sfspvALL, - sfspvDune2, sfspvMAX, sfspvSIN); + (sfspvNone, + sfspvPAK, + sfspvSIN + {$IFDEF SFS_PLAINFS_FULL} + ,sfspvWAD, + sfspvGRP, + sfspvSPE, + sfspvWAD2, + sfspvALL, + sfspvDune2, + sfspvMAX + {$ENDIF} + ); TSFSPlainVolume = class (TSFSVolume) protected fType: TSFSPlainVolumeType; procedure PAKReadDirectory (); + procedure SINReadDirectory (); + {$IFDEF SFS_PLAINFS_FULL} procedure WADReadDirectory (); procedure GRPReadDirectory (); procedure SPEReadDirectory (); @@ -46,7 +59,7 @@ type procedure ALLReadDirectory (); procedure Dune2ReadDirectory (); procedure MAXReadDirectory (); - procedure SINReadDirectory (); + {$ENDIF} procedure ReadDirectory (); override; @@ -76,11 +89,13 @@ type fLink: TSFSString; end; +{$IFDEF SFS_PLAINFS_FULL} TAllegroProperty = class name: TSFSString; ofs: Int64; size: Integer; end; +{$ENDIF} function ReadMD (st: TStream): Integer; @@ -92,6 +107,7 @@ begin result := (buf[0] shl 24) or (buf[1] shl 16) or (buf[2] shl 8) or buf[3]; end; +{$IFDEF SFS_PLAINFS_FULL} function WADCheckMagic (st: TStream): Boolean; var sign: packed array [0..3] of Char; @@ -106,6 +122,7 @@ begin (dofs+fcnt*16 > st.Size) then exit; result := true; end; +{$ENDIF} function PAKCheckMagic (st: TStream): Boolean; var @@ -137,6 +154,7 @@ begin result := true; end; +{$IFDEF SFS_PLAINFS_FULL} function GRPCheckMagic (st: TStream): Boolean; var sign: packed array [0..11] of Char; @@ -221,9 +239,11 @@ begin (dofs+fcnt > st.Size) then exit; result := true; end; +{$ENDIF} { TSFSPlainVolume } +{$IFDEF SFS_PLAINFS_FULL} procedure TSFSPlainVolume.WADReadDirectory (); var fcnt: LongWord; @@ -246,6 +266,7 @@ begin Dec(fcnt); end; end; +{$ENDIF} procedure TSFSPlainVolume.PAKReadDirectory (); var @@ -291,6 +312,7 @@ begin end; end; +{$IFDEF SFS_PLAINFS_FULL} procedure TSFSPlainVolume.GRPReadDirectory (); var fcnt: LongWord; @@ -594,20 +616,22 @@ begin Dec(fcnt, 16); end; end; - +{$ENDIF} procedure TSFSPlainVolume.ReadDirectory (); begin case fType of - sfspvWAD: WADReadDirectory(); sfspvPAK: PAKReadDirectory(); + sfspvSIN: SINReadDirectory(); + {$IFDEF SFS_PLAINFS_FULL} + sfspvWAD: WADReadDirectory(); sfspvGRP: GRPReadDirectory(); sfspvSPE: SPEReadDirectory(); sfspvWAD2: WAD2ReadDirectory(); sfspvALL: ALLReadDirectory(); sfspvDune2: Dune2ReadDirectory(); sfspvMAX: MAXReadDirectory(); - sfspvSIN: SINReadDirectory(); + {$ENDIF} else raise ESFSError.Create('invalid plain SFS'); end; end; @@ -668,19 +692,23 @@ function TSFSPlainVolumeFactory.IsMyVolumePrefix (const prefix: TSFSString): Boo begin result := SFSStrEqu(prefix, 'pak') or - //SFSStrEqu(prefix, 'wad') or // sorry + SFSStrEqu(prefix, 'sin') or + SFSStrEqu(prefix, 'quake') + {$IFDEF SFS_PLAINFS_FULL} + or + SFSStrEqu(prefix, 'wad') or // sorry SFSStrEqu(prefix, 'wad2') or SFSStrEqu(prefix, 'grp') or SFSStrEqu(prefix, 'spe') or SFSStrEqu(prefix, 'spec') or - SFSStrEqu(prefix, 'quake') or SFSStrEqu(prefix, 'doom') or SFSStrEqu(prefix, 'duke3d') or SFSStrEqu(prefix, 'abuse') or SFSStrEqu(prefix, 'allegro') or SFSStrEqu(prefix, 'dune2') or - SFSStrEqu(prefix, 'max') or - SFSStrEqu(prefix, 'sin'); + SFSStrEqu(prefix, 'max') + {$ENDIF} + ; end; procedure TSFSPlainVolumeFactory.Recycle (vol: TSFSVolume); @@ -693,15 +721,18 @@ var vt: TSFSPlainVolumeType; begin vt := sfspvNone; - if WADCheckMagic(st) then vt := sfspvWAD - else if PAKCheckMagic(st) then vt := sfspvPAK + if PAKCheckMagic(st) then vt := sfspvPAK + else if SINCheckMagic(st) then vt := sfspvSIN + {$IFDEF SFS_PLAINFS_FULL} + else if WADCheckMagic(st) then vt := sfspvWAD else if GRPCheckMagic(st) then vt := sfspvGRP else if SPECheckMagic(st) then vt := sfspvSPE else if WAD2CheckMagic(st) then vt := sfspvWAD2 //else if ALLCheckMagic(st) then vt := sfspvALL else if MAXCheckMagic(st) then vt := sfspvMAX - else if SINCheckMagic(st) then vt := sfspvSIN; - //else if Dune2CheckMagic(st) then vt := sfspvDune2; // this must be the last! + //else if Dune2CheckMagic(st) then vt := sfspvDune2 // this must be the last! + {$ENDIF} + ; if vt <> sfspvNone then begin