X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fsfs%2FsfsPlainFS.pas;h=84409bdc588f801f6b316eafd7cb83381bdb2afa;hb=fd5ef4c3c2e4c56f7b1547318b430a5d10b6860e;hp=54438f08835a69a935a33fab3f37c1e49870a752;hpb=2fdb1deb5facdcfadb85ab28050bc02451cf7ba8;p=d2df-sdl.git diff --git a/src/sfs/sfsPlainFS.pas b/src/sfs/sfsPlainFS.pas index 54438f0..84409bd 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,9 +59,11 @@ type procedure ALLReadDirectory (); procedure Dune2ReadDirectory (); procedure MAXReadDirectory (); - procedure SINReadDirectory (); + {$ENDIF} procedure ReadDirectory (); override; + + public function OpenFileByIndex (const index: Integer): TStream; override; end; @@ -74,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; @@ -90,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; @@ -104,6 +122,7 @@ begin (dofs+fcnt*16 > st.Size) then exit; result := true; end; +{$ENDIF} function PAKCheckMagic (st: TStream): Boolean; var @@ -135,6 +154,7 @@ begin result := true; end; +{$IFDEF SFS_PLAINFS_FULL} function GRPCheckMagic (st: TStream): Boolean; var sign: packed array [0..11] of Char; @@ -219,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; @@ -244,6 +266,7 @@ begin Dec(fcnt); end; end; +{$ENDIF} procedure TSFSPlainVolume.PAKReadDirectory (); var @@ -289,6 +312,7 @@ begin end; end; +{$IFDEF SFS_PLAINFS_FULL} procedure TSFSPlainVolume.GRPReadDirectory (); var fcnt: LongWord; @@ -384,7 +408,7 @@ begin if c <> f then begin // link can't be linked to itself - if SFSStrComp(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) = 0 then break; + if SFSStrEqu(TSFSExtFileInfo(fFiles[c]).fName, fi.fLink) then break; end; Inc(c); end; @@ -592,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; @@ -665,20 +691,24 @@ end; function TSFSPlainVolumeFactory.IsMyVolumePrefix (const prefix: TSFSString): Boolean; begin result := - (SFSStrComp(prefix, 'pak') = 0) or - //(SFSStrComp(prefix, 'wad') = 0) or // sorry - (SFSStrComp(prefix, 'wad2') = 0) or - (SFSStrComp(prefix, 'grp') = 0) or - (SFSStrComp(prefix, 'spe') = 0) or - (SFSStrComp(prefix, 'spec') = 0) or - (SFSStrComp(prefix, 'quake') = 0) or - (SFSStrComp(prefix, 'doom') = 0) or - (SFSStrComp(prefix, 'duke3d') = 0) or - (SFSStrComp(prefix, 'abuse') = 0) or - (SFSStrComp(prefix, 'allegro') = 0) or - (SFSStrComp(prefix, 'dune2') = 0) or - (SFSStrComp(prefix, 'max') = 0) or - (SFSStrComp(prefix, 'sin') = 0); + SFSStrEqu(prefix, 'pak') or + 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, 'doom') or + SFSStrEqu(prefix, 'duke3d') or + SFSStrEqu(prefix, 'abuse') or + SFSStrEqu(prefix, 'allegro') or + SFSStrEqu(prefix, 'dune2') or + SFSStrEqu(prefix, 'max') + {$ENDIF} + ; end; procedure TSFSPlainVolumeFactory.Recycle (vol: TSFSVolume); @@ -691,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 @@ -721,6 +754,6 @@ var initialization pakf := TSFSPlainVolumeFactory.Create(); SFSRegisterVolumeFactory(pakf); -finalization - SFSUnregisterVolumeFactory(pakf); +//finalization +// SFSUnregisterVolumeFactory(pakf); end.