--- oup/current/Global/RawList.pas 2007/03/23 00:58:09 118 +++ oup/current/Global/RawList.pas 2007/04/03 15:43:53 169 @@ -29,7 +29,7 @@ var implementation uses - Template, ConnectionManager, Access_OniArchive, Classes, SysUtils; + Template, ConnectionManager, Access_OniArchive, Classes, SysUtils, Math; function AGDB(ConnectionID, FileID: Integer): TRawDataList; @@ -141,45 +141,41 @@ var baselink, lastlink: Integer; links: Integer; Data: TStream; + read: Integer; + char: Byte; + foundzeros: Byte; begin + SetLength(Result, 0); + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $18, 4, @baselink); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links); if links > 0 then begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + (links - 1) * 4, 4, @lastlink); -// SetLength(Data, lastlink + 1024); Data := nil; TAccess_OniArchive(ConManager.Connection[ConnectionID]).LoadRawOffset( False, baselink, lastlink + 1024, Data); -// TOniDataDat(connection).LoadRawOffset(False, baselink, lastlink + 1024, Data); - // connection.LoadRawFile(fileid,$1C,baselink,lastlink+1024,False,@data[0]); - raise ENotImplemented.Create('RawList.SUBT'); - end; -{ - k := 0; - for j := 0 to 1024 do - begin - if (Data[lastlink + j] = $00) or (j = 1024) then + Data.Seek(lastlink, soFromBeginning); + + foundzeros := 0; + repeat + read := Data.Read(char, 1); + if (read > 0) and (char = 0) then begin - if j < 1024 then - begin - if k = 0 then - begin - k := 1; - end - else - begin - SetLength(Result, 1); - Result[0].src_offset := $18; - Result[0].raw_addr := baselink; - Result[0].raw_size := lastlink + j; - Break; - end; - end; + Inc(foundzeros); end; + until (read = 0) or (foundzeros = 2); + + if foundzeros = 2 then + begin + SetLength(Result, 1); + Result[0].SrcID := FileID; + Result[0].SrcOffset := $18; + Result[0].RawAddr := baselink; + Result[0].RawSize := Data.Position; + Result[0].LocSep := False; end; end; -} end; @@ -195,7 +191,7 @@ var templ: Integer; Data: TByteData; offset: Word; - frame_count: Byte; + frame_count: Integer; begin SetLength(Result, 13); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $16C, 2, @frames); @@ -208,7 +204,10 @@ begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @link); Result[1].SrcOffset := $10; Result[1].RawAddr := link; - Result[1].RawSize := frames * 8; + if link > 0 then + Result[1].RawSize := frames * 8 + else + Result[1].RawSize := 0; {attacks} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $182, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $14, 4, @link); @@ -226,7 +225,7 @@ begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @link); Result[4].SrcOffset := $1C; Result[4].RawAddr := link; - Result[4].RawSize := tempb * 8; + Result[4].RawSize := tempb * 12; {shortcut} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $185, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20, 4, @link); @@ -312,7 +311,21 @@ var storetype: Byte; datasize: Integer; mipmap: Byte; - bpp: Byte; + + function GetImgSize(w,h, storetype: Integer): Integer; + begin + case storetype of + 0, 1, 2: + Result := w*h*2; + 8: + Result := w*h*4; + 9: + Result := Max(1, w div 4) * Max(1, h div 4) * 8; + else + Result := -1; + end; + end; + begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $88, SizeOf(mipmap), @mipmap); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8C, SizeOf(x), @x); @@ -322,26 +335,14 @@ begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $A0, 4, @link_mac); - case storetype of - 0, 1, 2: - bpp := 16; -// datasize := x * y * 2; - 8: - bpp := 32; -// datasize := x * y * 4; - 9: - bpp := 4; -// datasize := x * y div 2; - end; - - datasize := (x * y * bpp) div 8; + datasize := GetImgSize(x, y, storetype); if (mipmap and $01) > 0 then begin repeat - x := x div 2; - y := y div 2; - datasize := (datasize + x * y * bpp) div 8; - until (x = 1) or (y = 1); + x := Max(x div 2, 1); + y := Max(y div 2, 1); + datasize := datasize + GetImgSize(x, y, storetype); + until (x = 1) and (y = 1); end; SetLength(Result, 1); @@ -422,7 +423,7 @@ end; initialization RawLists := TRawLists.Create; - RawLists.InsertRawListHandler('AGDB',False,AGDB); + RawLists.InsertRawListHandler('AGDB', False, AGDB); RawLists.InsertRawListHandler('AKVA', True, AKVA); RawLists.InsertRawListHandler('BINA', True, BINA); RawLists.InsertRawListHandler('OSBD', True, OSBD);