--- oup/rewrite/Global/RawList.pas 2007/01/22 23:05:45 97 +++ oup/current/Global/RawList.pas 2007/05/12 13:22:11 177 @@ -1,21 +1,21 @@ unit RawList; - interface - -uses TypeDefs, ConnectionManager; +uses TypeDefs; type THandler = function(ConnectionID, FileID: Integer): TRawDataList; - TRawListHandlers = record + TRawListHandler = record Ext: String[4]; needed: Boolean; Handler: THandler; end; + TRawListHandlers = array of TRawListHandler; TRawLists = class private FRawListHandlers: TRawListHandlers; public + property RawListHandlers: TRawListHandlers read FRawListHandlers; procedure InsertRawListHandler(ext: String; needed: Boolean; handler: THandler); function GetRawList(ConnectionID, FileID: Integer): TRawDataList; function GetRawInfo(ConnectionID, FileID, DatOffset: Integer): TRawDataInfo; @@ -24,12 +24,12 @@ type var RawLists: TRawLists; - + implementation uses - Template; + Template, ConnectionManager, Access_OniArchive, Classes, SysUtils, Math; function AGDB(ConnectionID, FileID: Integer): TRawDataList; @@ -38,19 +38,16 @@ var links: Integer; i: Integer; begin - if not connection.OSisMac then + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links); + links := links * 2; + SetLength(Result, links); + for i := 0 to links - 1 do begin - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links); - links := links * 2; - SetLength(Result, links); - for i := 0 to links - 1 do - begin - Result[i].src_offset := $20 + i * 4; - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * 4, 4, @link); - Result[i].raw_addr := link; - Result[i].raw_size := 32; - Result[i].loc_sep := False; - end; + Result[i].SrcOffset := $20 + i * 4; + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * 4, 4, @link); + Result[i].RawAddr := link; + Result[i].RawSize := 32; + Result[i].LocSep := False; end; end; @@ -63,19 +60,16 @@ var links: Integer; i: Integer; begin - if not connection.OSisMac then + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links); + SetLength(Result, links); + for i := 0 to links - 1 do begin - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @links); - SetLength(Result, links); - for i := 0 to links - 1 do - begin - Result[i].src_offset := $20 + i * $74 + $24; - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link); - Result[i].raw_addr := link; - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link); - Result[i].raw_size := link; - Result[i].loc_sep := False; - end; + Result[i].SrcOffset := $20 + i * $74 + $24; + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $24, 4, @link); + Result[i].RawAddr := link; + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20 + i * $74 + $28, 4, @link); + Result[i].RawSize := link; + Result[i].LocSep := False; end; end; @@ -90,10 +84,10 @@ begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, 4, @datasize); SetLength(Result, 1); - Result[0].src_offset := $0C; - Result[0].raw_addr := link; - Result[0].raw_size := datasize; - Result[0].loc_sep := connection.OSisMac; + Result[0].SrcOffset := $0C; + Result[0].RawAddr := link; + Result[0].RawSize := datasize; + Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN); end; @@ -107,10 +101,10 @@ begin ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $08, 4, @datasize); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link); SetLength(Result, 1); - Result[0].src_offset := $0C; - Result[0].raw_addr := link; - Result[0].raw_size := datasize; - Result[0].loc_sep := connection.OSisMac; + Result[0].SrcOffset := $0C; + Result[0].RawAddr := link; + Result[0].RawSize := datasize; + Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN); end; @@ -122,21 +116,21 @@ var datasize: Integer; begin SetLength(Result, 1); - if not connection.OSisMac then + if ConManager.Connection[ConnectionID].DataOS in [DOS_MACBETA, DOS_MAC] then begin - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $40, 4, @datasize); - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $44, 4, @link); - Result[0].src_offset := $44; + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @datasize); + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $14, 4, @link); + Result[0].SrcOffset := $14; end else begin - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @datasize); - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $14, 4, @link); - Result[0].src_offset := $14; + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $40, 4, @datasize); + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $44, 4, @link); + Result[0].SrcOffset := $44; end; - Result[0].raw_addr := link; - Result[0].raw_size := datasize; - Result[0].loc_sep := False; + Result[0].RawAddr := link; + Result[0].RawSize := datasize; + Result[0].LocSep := False; end; @@ -146,39 +140,40 @@ function SUBT(ConnectionID, FileID: Inte var baselink, lastlink: Integer; links: Integer; - j, k: Integer; - Data: TByteData; + 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); - TOniDataDat(connection).LoadRawOffset(False, - baselink, lastlink + 1024, Data); - // connection.LoadRawFile(fileid,$1C,baselink,lastlink+1024,False,@data[0]); - k := 0; - for j := 0 to 1024 do - begin - if (Data[lastlink + j] = $00) or (j = 1024) then + Data := nil; + TAccess_OniArchive(ConManager.Connection[ConnectionID]).LoadRawOffset( + False, baselink, lastlink + 1024, Data); + 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; @@ -196,81 +191,87 @@ 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); - {y-pos} - ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link); - Result[0].src_offset := $0C; - Result[0].raw_addr := link; - Result[0].raw_size := frames * 4; {x-z-pos} + ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $0C, 4, @link); + Result[0].SrcOffset := $0C; + Result[0].RawAddr := link; + if link > 0 then + Result[0].RawSize := frames * 4 + else + Result[0].RawSize := 0; + {y-pos} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $10, 4, @link); - Result[1].src_offset := $10; - Result[1].raw_addr := link; - Result[1].raw_size := frames * 8; + Result[1].SrcOffset := $10; + Result[1].RawAddr := link; + 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); - Result[2].src_offset := $14; - Result[2].raw_addr := link; - Result[2].raw_size := tempb * 32; + Result[2].SrcOffset := $14; + Result[2].RawAddr := link; + Result[2].RawSize := tempb * 32; {damage} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $183, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $18, 4, @link); - Result[3].src_offset := $18; - Result[3].raw_addr := link; - Result[3].raw_size := tempb * 8; + Result[3].SrcOffset := $18; + Result[3].RawAddr := link; + Result[3].RawSize := tempb * 8; {motionblur} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $184, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $1C, 4, @link); - Result[4].src_offset := $1C; - Result[4].raw_addr := link; - Result[4].raw_size := tempb * 8; + Result[4].SrcOffset := $1C; + Result[4].RawAddr := link; + Result[4].RawSize := tempb * 12; {shortcut} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $185, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $20, 4, @link); - Result[5].src_offset := $20; - Result[5].raw_addr := link; - Result[5].raw_size := tempb * 8; + Result[5].SrcOffset := $20; + Result[5].RawAddr := link; + Result[5].RawSize := tempb * 8; {throw} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $24, 4, @link); - Result[6].src_offset := $24; - Result[6].raw_addr := link; + Result[6].SrcOffset := $24; + Result[6].RawAddr := link; if link > 0 then - Result[6].raw_size := 24 + Result[6].RawSize := 24 else - Result[6].raw_size := 0; + Result[6].RawSize := 0; {footstep} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $186, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $28, 4, @link); - Result[7].src_offset := $28; - Result[7].raw_addr := link; - Result[7].raw_size := tempb * 4; + Result[7].SrcOffset := $28; + Result[7].RawAddr := link; + Result[7].RawSize := tempb * 4; {particle} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $187, 1, @tempb); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $2C, 4, @link); - Result[8].src_offset := $2C; - Result[8].raw_addr := link; - Result[8].raw_size := tempb * 24; + Result[8].SrcOffset := $2C; + Result[8].RawAddr := link; + Result[8].RawSize := tempb * 24; {position} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $30, 4, @link); - Result[9].src_offset := $30; - Result[9].raw_addr := link; - Result[9].raw_size := frames * 8; + Result[9].SrcOffset := $30; + Result[9].RawAddr := link; + Result[9].RawSize := frames * 8; {particle} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $154, 2, @tempw); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $38, 4, @link); - Result[11].src_offset := $38; - Result[11].raw_addr := link; - Result[11].raw_size := tempw * 34; + Result[11].SrcOffset := $38; + Result[11].RawAddr := link; + Result[11].RawSize := tempw * 34; {extent} ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $138, 4, @templ); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $13C, 4, @link); - Result[12].src_offset := $13C; - Result[12].raw_addr := link; - Result[12].raw_size := templ * 12; + Result[12].SrcOffset := $13C; + Result[12].RawAddr := link; + Result[12].RawSize := templ * 12; ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $34, 4, @link); if link > 0 then @@ -279,7 +280,8 @@ begin frame_count := 0; i := 0; SetLength(Data, $FFFF); - TOniDataDat(connection).LoadRawOffset(False, link, $FFFF, Data); + TAccess_OniArchive(ConManager.Connection[ConnectionID]).LoadRawOffset( + False, link, $FFFF, Data); offset := Data[$24] + Data[$25] * 256; while (offset + i < Length(Data)) and (frame_count < frames - 1) do begin @@ -290,15 +292,15 @@ begin if offset + i < Length(Data) then begin Inc(i, tempw); - Result[10].raw_size := offset + i; + Result[10].RawSize := offset + i; end else begin - Result[10].raw_size := 0; + Result[10].RawSize := 0; end; end; - Result[10].src_offset := $34; - Result[10].raw_addr := link; + Result[10].SrcOffset := $34; + Result[10].RawAddr := link; end; @@ -311,33 +313,54 @@ var x, y: Word; storetype: Byte; datasize: Integer; + mipmap: 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); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $8E, SizeOf(y), @y); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $90, SizeOf(storetype), @storetype); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $9C, 4, @link_pc); ConManager.Connection[ConnectionID].LoadDatFilePart(fileid, $A0, 4, @link_mac); - case storetype of - 0, 1, 2: - datasize := x * y * 2; - 8: - datasize := x * y * 4; - 9: - datasize := x * y div 2; + + + datasize := GetImgSize(x, y, storetype); + if (mipmap and $01) > 0 then + begin + repeat + 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); - if not connection.OSisMac then + if ConManager.Connection[ConnectionID].DataOS = DOS_WIN then begin - Result[0].src_offset := $9C; - Result[0].raw_addr := link_pc; + Result[0].SrcOffset := $9C; + Result[0].RawAddr := link_pc; end else begin - Result[0].src_offset := $A0; - Result[0].raw_addr := link_mac; + Result[0].SrcOffset := $A0; + Result[0].RawAddr := link_mac; end; - Result[0].raw_size := datasize; - Result[0].loc_sep := connection.OSisMac; + Result[0].RawSize := datasize; + Result[0].LocSep := not (ConManager.Connection[ConnectionID].DataOS = DOS_WIN); end; @@ -403,7 +426,7 @@ end; initialization RawLists := TRawLists.Create; - RawLists.InsertRawListHandler('AGDB',False,AGDB); + RawLists.InsertRawListHandler('AGDB', True, AGDB); RawLists.InsertRawListHandler('AKVA', True, AKVA); RawLists.InsertRawListHandler('BINA', True, BINA); RawLists.InsertRawListHandler('OSBD', True, OSBD);