summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 96165a1)
raw | patch | inline | side by side (parent: 96165a1)
author | Ketmar Dark <ketmar@ketmar.no-ip.org> | |
Fri, 1 Sep 2017 01:29:33 +0000 (04:29 +0300) | ||
committer | Ketmar Dark <ketmar@ketmar.no-ip.org> | |
Fri, 1 Sep 2017 01:29:47 +0000 (04:29 +0300) |
src/sheditor/MAPWRITER.pas | [deleted file] | patch | blob | history |
src/sheditor/WADEDITOR_full.pas | [deleted file] | patch | blob | history |
src/sheditor/WADSTRUCT.pas | [deleted file] | patch | blob | history |
src/sheditor/xstreams_sdl.pas | [deleted file] | patch | blob | history |
diff --git a/src/sheditor/MAPWRITER.pas b/src/sheditor/MAPWRITER.pas
+++ /dev/null
@@ -1,339 +0,0 @@
-(* Copyright (C) DooM 2D:Forever Developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *)
-{$MODE DELPHI}
-unit MAPWRITER;
-
-{
------------------------------------
-MAPWRITER.PAS ÂÅÐÑÈß ÎÒ 24.09.06
-
-Ïîääåðæêà êàðò âåðñèè 1
------------------------------------
-}
-
-interface
-
-uses
- MAPSTRUCT;
-
-type
- TDataBlock = packed record
- Block: TBlock;
- Data: Pointer;
- end;
-
- TDataBlocksArray = packed array of TDataBlock;
-
- TMapWriter = class(TObject)
- private
- FDataBlocks: TDataBlocksArray;
- public
- constructor Create();
- destructor Destroy(); override;
- procedure FreeMap();
- function SaveMap(var Data: Pointer): LongWord;
- function HandledVersion(): Byte; virtual;
- end;
-
- TMapWriter_1 = class(TMapWriter)
- public
- function AddTextures(Textures: TTexturesRec1Array): Boolean;
- function AddPanels(Panels: TPanelsRec1Array): Boolean;
- function AddItems(Items: TItemsRec1Array): Boolean;
- function AddMonsters(Monsters: TMonsterRec1Array): Boolean;
- function AddAreas(Areas: TAreasRec1Array): Boolean;
- function AddTriggers(Triggers: TTriggersRec1Array): Boolean;
- function AddHeader(MapHeader: TMapHeaderRec_1): Boolean;
- function HandledVersion(): Byte; override;
- end;
-
-
-implementation
-
-uses
- BinEditor, SysUtils;
-
-{ TMapWriter }
-
-constructor TMapWriter.Create();
-begin
- FDataBlocks := nil;
-end;
-
-destructor TMapWriter.Destroy();
-begin
- FreeMap();
-
- inherited;
-end;
-
-procedure TMapWriter.FreeMap();
-var
- a: Integer;
-begin
- if FDataBlocks <> nil then
- for a := 0 to High(FDataBlocks) do
- if FDataBlocks[a].Data <> nil then FreeMem(FDataBlocks[a].Data);
-
- FDataBlocks := nil;
-end;
-
-function TMapWriter.SaveMap(var Data: Pointer): LongWord;
-var
- a: Integer;
- b, c: LongWord;
- Sign: array[0..2] of Char;
- Ver: Byte;
-begin
- b := 3+1+SizeOf(TBlock)*(Length(FDataBlocks)+1);
-
- if FDataBlocks <> nil then
- for a := 0 to High(FDataBlocks) do
- b := b+FDataBlocks[a].Block.BlockSize;
-
- Result := b;
-
- GetMem(Data, b);
-
- Sign := MAP_SIGNATURE;
- CopyMemory(Data, @Sign[0], 3);
- c := 3;
-
- Ver := HandledVersion();
- CopyMemory(Pointer(LongWord(Data)+c), @Ver, 1);
- c := c+1;
-
- if FDataBlocks <> nil then
- for a := 0 to High(FDataBlocks) do
- begin
- CopyMemory(Pointer(LongWord(Data)+c), @FDataBlocks[a].Block, SizeOf(TBlock));
- c := c+SizeOf(TBlock);
- CopyMemory(Pointer(LongWord(Data)+c), FDataBlocks[a].Data, FDataBlocks[a].Block.BlockSize);
- c := c+FDataBlocks[a].Block.BlockSize;
- end;
-
- ZeroMemory(Pointer(LongWord(Data)+c), SizeOf(TBlock));
-end;
-
-function TMapWriter.HandledVersion(): Byte;
-begin
- Result := $00;
-end;
-
-{ TMapWriter_1 }
-
-function TMapWriter_1.AddAreas(Areas: TAreasRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Areas = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TAreaRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_AREAS;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Areas))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Areas) do
- CopyMemory(Pointer(LongWord(Data)+a*Size), @Areas[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddItems(Items: TItemsRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Items = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TItemRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_ITEMS;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Items))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Items) do
- CopyMemory(Pointer(LongWord(Data)+a*size), @Items[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddMonsters(Monsters: TMonsterRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Monsters = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TMonsterRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_MONSTERS;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Monsters))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Monsters) do
- CopyMemory(Pointer(LongWord(Data)+a*Size), @Monsters[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddPanels(Panels: TPanelsRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Panels = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TPanelRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_PANELS;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Panels))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Panels) do
- CopyMemory(Pointer(LongWord(Data)+a*size), @Panels[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddTextures(Textures: TTexturesRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Textures = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TTextureRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_TEXTURES;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Textures))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Textures) do
- CopyMemory(Pointer(LongWord(Data)+a*size), @Textures[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddTriggers(Triggers: TTriggersRec1Array): Boolean;
-var
- a, size: LongWord;
-begin
- if Triggers = nil then
- begin
- Result := True;
- Exit;
- end;
-
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TTriggerRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_TRIGGERS;
- Block.Reserved := $00000000;
- Block.BlockSize := LongWord(Length(Triggers))*size;
-
- Data := GetMemory(Block.BlockSize);
-
- for a := 0 to High(Triggers) do
- CopyMemory(Pointer(LongWord(Data)+a*size), @Triggers[a], size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.AddHeader(MapHeader: TMapHeaderRec_1): Boolean;
-var
- size: LongWord;
-begin
- SetLength(FDataBlocks, Length(FDataBlocks)+1);
-
- size := SizeOf(TMapHeaderRec_1);
-
- with FDataBlocks[High(FDataBlocks)] do
- begin
- Block.BlockType := BLOCK_HEADER;
- Block.Reserved := $00000000;
- Block.BlockSize := size;
-
- Data := GetMemory(Block.BlockSize);
-
- CopyMemory(Pointer(LongWord(Data)), @MapHeader, size);
- end;
-
- Result := True;
-end;
-
-function TMapWriter_1.HandledVersion(): Byte;
-begin
- Result := $01;
-end;
-
-end.
diff --git a/src/sheditor/WADEDITOR_full.pas b/src/sheditor/WADEDITOR_full.pas
+++ /dev/null
@@ -1,928 +0,0 @@
-(* Copyright (C) DooM 2D:Forever Developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *)
-{$MODE DELPHI}
-unit WADEDITOR_full;
-
-{
------------------------------------
-WADEDITOR.PAS ÂÅÐÑÈß ÎÒ 26.08.08
-
-Ïîääåðæêà âàäîâ âåðñèè 1
------------------------------------
-}
-
-{
------------------------------------
-WADSTRUCT.PAS ÂÅÐÑÈß ÎÒ 24.09.06
-
-Ïîääåðæêà âàäîâ âåðñèè 1
------------------------------------
-
-Ñòðóêòóðà DFWAD-ôàéëà âåðñèè 1:
- ------------------------------------------
- SIGNATURE | Byte[5] | 'DFWAD'
- VERSION | Byte | $01
- HEADER | TWADHeaderRec_1 |
- RESRECORD1 | TResourceTableRec_1 |
- ... | ................... |
- RESRECORDN | TResourceTableRec_1 |
- DATA | RAW |
- ------------------------------------------
-}
-
-interface
-
-type
- SArray = array of ShortString;
- Char16 = packed array[0..15] of Char;
-
- TWADHeaderRec_1 = packed record
- RecordsCount: Word;
- end;
-
- TResourceTableRec_1 = packed record
- ResourceName: Char16;
- Address: LongWord;
- Length: LongWord;
- end;
-
- TWADEditor_1 = class(TObject)
- private
- FResData: Pointer;
- FResTable: packed array of TResourceTableRec_1;
- FHeader: TWADHeaderRec_1;
- FDataSize: LongWord;
- FOffset: LongWord;
- FFileName: string;
- FWADOpened: Byte;
- FLastError: Integer;
- FVersion: Byte;
- function LastErrorString(): string;
- function GetResName(ResName: string): Char16;
- public
- constructor Create();
- destructor Destroy(); override;
- procedure FreeWAD();
- function ReadFile(FileName: string): Boolean;
- function ReadMemory(Data: Pointer; Len: LongWord): Boolean;
- procedure CreateImage();
- function AddResource(Data: Pointer; Len: LongWord; Name: string;
- Section: string): Boolean; overload;
- function AddResource(FileName, Name, Section: string): Boolean; overload;
- function AddAlias(Res, Alias: string): Boolean;
- procedure AddSection(Name: string);
- procedure RemoveResource(Section, Resource: string);
- procedure SaveTo(FileName: string);
- function HaveResource(Section, Resource: string): Boolean;
- function HaveSection(Section: string): Boolean;
- function GetResource(Section, Resource: string; var pData: Pointer;
- var Len: Integer): Boolean;
- function GetSectionList(): SArray;
- function GetResourcesList(Section: string): SArray;
-
- property GetLastError: Integer read FLastError;
- property GetLastErrorStr: string read LastErrorString;
- property GetResourcesCount: Word read FHeader.RecordsCount;
- property GetVersion: Byte read FVersion;
- end;
-
-const
- DFWAD_SIGNATURE = 'DFWAD';
- DFWAD_VERSION = $01;
-
-const
- DFWAD_NOERROR = 0;
- DFWAD_ERROR_WADNOTFOUND = -1;
- DFWAD_ERROR_CANTOPENWAD = -2;
- DFWAD_ERROR_RESOURCENOTFOUND = -3;
- DFWAD_ERROR_FILENOTWAD = -4;
- DFWAD_ERROR_WADNOTLOADED = -5;
- DFWAD_ERROR_READRESOURCE = -6;
- DFWAD_ERROR_READWAD = -7;
- DFWAD_ERROR_WRONGVERSION = -8;
-
-
- procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
- SectionName, ResourceName: String); overload;
- procedure g_ProcessResourceStr(ResourceStr: String; FileName,
- SectionName, ResourceName: PString); overload;
-
-implementation
-
-uses
- SysUtils, BinEditor, ZLib;
-
-const
- DFWAD_OPENED_NONE = 0;
- DFWAD_OPENED_FILE = 1;
- DFWAD_OPENED_MEMORY = 2;
-
-procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
- OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
-var
- strm: TZStreamRec;
- P: Pointer;
- BufInc: Integer;
-begin
- FillChar(strm, sizeof(strm), 0);
- BufInc := (InBytes + 255) and not 255;
- if OutEstimate = 0 then
- OutBytes := BufInc
- else
- OutBytes := OutEstimate;
- GetMem(OutBuf, OutBytes);
- try
- strm.next_in := InBuf;
- strm.avail_in := InBytes;
- strm.next_out := OutBuf;
- strm.avail_out := OutBytes;
- inflateInit_(strm, zlib_version, sizeof(strm));
- try
- while inflate(strm, Z_FINISH) <> Z_STREAM_END do
- begin
- P := OutBuf;
- Inc(OutBytes, BufInc);
- ReallocMem(OutBuf, OutBytes);
- strm.next_out := PByteF(PChar(OutBuf) + (PChar(strm.next_out) - PChar(P)));
- strm.avail_out := BufInc;
- end;
- finally
- inflateEnd(strm);
- end;
- ReallocMem(OutBuf, strm.total_out);
- OutBytes := strm.total_out;
- except
- FreeMem(OutBuf);
- raise
- end;
-end;
-
-procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
- SectionName, ResourceName: String);
-var
- a, i: Integer;
-
-begin
- for i := Length(ResourceStr) downto 1 do
- if ResourceStr[i] = ':' then
- Break;
-
- FileName := Copy(ResourceStr, 1, i-1);
-
- for a := i+1 to Length(ResourceStr) do
- if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
-
- ResourceName := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
- SectionName := Copy(ResourceStr, i+1, Length(ResourceStr)-Length(ResourceName)-Length(FileName)-2);
-end;
-
-procedure g_ProcessResourceStr(ResourceStr: AnsiString; FileName,
- SectionName, ResourceName: PAnsiString);
-var
- a, i, l1, l2: Integer;
-
-begin
- for i := Length(ResourceStr) downto 1 do
- if ResourceStr[i] = ':' then
- Break;
-
- if FileName <> nil then
- begin
- FileName^ := Copy(ResourceStr, 1, i-1);
- l1 := Length(FileName^);
- end
- else
- l1 := 0;
-
- for a := i+1 to Length(ResourceStr) do
- if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
-
- if ResourceName <> nil then
- begin
- ResourceName^ := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
- l2 := Length(ResourceName^);
- end
- else
- l2 := 0;
-
- if SectionName <> nil then
- SectionName^ := Copy(ResourceStr, i+1, Length(ResourceStr)-l2-l1-2);
-end;
-
-{ TWADEditor_1 }
-
-function TWADEditor_1.AddResource(Data: Pointer; Len: LongWord; Name: string;
- Section: string): Boolean;
-var
- ResCompressed: Pointer;
- ResCompressedSize: Integer;
- a, b: Integer;
-begin
- Result := False;
-
- SetLength(FResTable, Length(FResTable)+1);
-
- if Section = '' then
- begin
- if Length(FResTable) > 1 then
- for a := High(FResTable) downto 1 do
- FResTable[a] := FResTable[a-1];
-
- a := 0;
- end
- else
- begin
- Section := AnsiUpperCase(Section);
- b := -1;
-
- for a := 0 to High(FResTable) do
- if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
- begin
- for b := High(FResTable) downto a+2 do
- FResTable[b] := FResTable[b-1];
-
- b := a+1;
- Break;
- end;
-
- if b = -1 then
- begin
- SetLength(FResTable, Length(FResTable)-1);
- Exit;
- end;
- a := b;
- end;
-
- ResCompressed := nil;
- ResCompressedSize := 0;
- Compress(Data, @Len, ResCompressed, ResCompressedSize);
- if ResCompressed = nil then Exit;
-
- if FResData = nil then FResData := AllocMem(ResCompressedSize)
- else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
-
- FDataSize := FDataSize+LongWord(ResCompressedSize);
-
- CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
- ResCompressed, ResCompressedSize);
- FreeMemory(ResCompressed);
-
- Inc(FHeader.RecordsCount);
-
- with FResTable[a] do
- begin
- ResourceName := GetResName(Name);
- Address := FOffset;
- Length := ResCompressedSize;
- end;
-
- FOffset := FOffset+Cardinal(ResCompressedSize);
-
- Result := True;
-end;
-
-function TWADEditor_1.AddAlias(Res, Alias: string): Boolean;
-var
- a, b: Integer;
- ares: Char16;
-begin
- Result := False;
-
- if FResTable = nil then Exit;
-
- b := -1;
- ares := GetResName(Alias);
- for a := 0 to High(FResTable) do
- if FResTable[a].ResourceName = Res then
- begin
- b := a;
- Break;
- end;
-
- if b = -1 then Exit;
-
- Inc(FHeader.RecordsCount);
-
- SetLength(FResTable, Length(FResTable)+1);
-
- with FResTable[High(FResTable)] do
- begin
- ResourceName := ares;
- Address := FResTable[b].Address;
- Length := FResTable[b].Length;
- end;
-
- Result := True;
-end;
-
-function TWADEditor_1.AddResource(FileName, Name, Section: string): Boolean;
-var
- ResCompressed: Pointer;
- ResCompressedSize: Integer;
- ResourceFile: File;
- TempResource: Pointer;
- OriginalSize: Integer;
- a, b: Integer;
-begin
- Result := False;
-
- AssignFile(ResourceFile, FileName);
-
- try
- Reset(ResourceFile, 1);
- except
- FLastError := DFWAD_ERROR_CANTOPENWAD;
- Exit;
- end;
-
- OriginalSize := FileSize(ResourceFile);
- GetMem(TempResource, OriginalSize);
-
- try
- BlockRead(ResourceFile, TempResource^, OriginalSize);
- except
- FLastError := DFWAD_ERROR_READWAD;
- FreeMemory(TempResource);
- CloseFile(ResourceFile);
- Exit;
- end;
-
- CloseFile(ResourceFile);
-
- ResCompressed := nil;
- ResCompressedSize := 0;
- Compress(TempResource, @OriginalSize, ResCompressed, ResCompressedSize);
- FreeMemory(TempResource);
- if ResCompressed = nil then Exit;
-
- SetLength(FResTable, Length(FResTable)+1);
-
- if Section = '' then
- begin
- if Length(FResTable) > 1 then
- for a := High(FResTable) downto 1 do
- FResTable[a] := FResTable[a-1];
-
- a := 0;
- end
- else
- begin
- Section := AnsiUpperCase(Section);
- b := -1;
-
- for a := 0 to High(FResTable) do
- if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
- begin
- for b := High(FResTable) downto a+2 do
- FResTable[b] := FResTable[b-1];
-
- b := a+1;
- Break;
- end;
-
- if b = -1 then
- begin
- FreeMemory(ResCompressed);
- SetLength(FResTable, Length(FResTable)-1);
- Exit;
- end;
-
- a := b;
- end;
-
- if FResData = nil then FResData := AllocMem(ResCompressedSize)
- else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
-
- FDataSize := FDataSize+LongWord(ResCompressedSize);
- CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
- ResCompressed, ResCompressedSize);
- FreeMemory(ResCompressed);
-
- Inc(FHeader.RecordsCount);
-
- with FResTable[a] do
- begin
- ResourceName := GetResName(Name);
- Address := FOffset;
- Length := ResCompressedSize;
- end;
-
- FOffset := FOffset+Cardinal(ResCompressedSize);
-
- Result := True;
-end;
-
-procedure TWADEditor_1.AddSection(Name: string);
-begin
- if Name = '' then Exit;
-
- Inc(FHeader.RecordsCount);
-
- SetLength(FResTable, Length(FResTable)+1);
- with FResTable[High(FResTable)] do
- begin
- ResourceName := GetResName(Name);
- Address := $00000000;
- Length := $00000000;
- end;
-end;
-
-constructor TWADEditor_1.Create();
-begin
- FResData := nil;
- FResTable := nil;
- FDataSize := 0;
- FOffset := 0;
- FHeader.RecordsCount := 0;
- FFileName := '';
- FWADOpened := DFWAD_OPENED_NONE;
- FLastError := DFWAD_NOERROR;
- FVersion := DFWAD_VERSION;
-end;
-
-procedure TWADEditor_1.CreateImage();
-var
- WADFile: File;
- b: LongWord;
-begin
- if FWADOpened = DFWAD_OPENED_NONE then
- begin
- FLastError := DFWAD_ERROR_WADNOTLOADED;
- Exit;
- end;
-
- if FWADOpened = DFWAD_OPENED_MEMORY then Exit;
-
- if FResData <> nil then FreeMem(FResData);
-
- try
- AssignFile(WADFile, FFileName);
- Reset(WADFile, 1);
-
- b := 6+SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable);
-
- FDataSize := LongWord(FileSize(WADFile))-b;
-
- GetMem(FResData, FDataSize);
-
- Seek(WADFile, b);
- BlockRead(WADFile, FResData^, FDataSize);
-
- CloseFile(WADFile);
-
- FOffset := FDataSize;
- except
- FLastError := DFWAD_ERROR_CANTOPENWAD;
- CloseFile(WADFile);
- Exit;
- end;
-
- FLastError := DFWAD_NOERROR;
-end;
-
-destructor TWADEditor_1.Destroy();
-begin
- FreeWAD();
-
- inherited;
-end;
-
-procedure TWADEditor_1.FreeWAD();
-begin
- if FResData <> nil then FreeMem(FResData);
- FResTable := nil;
- FDataSize := 0;
- FOffset := 0;
- FHeader.RecordsCount := 0;
- FFileName := '';
- FWADOpened := DFWAD_OPENED_NONE;
- FLastError := DFWAD_NOERROR;
- FVersion := DFWAD_VERSION;
-end;
-
-function TWADEditor_1.GetResName(ResName: string): Char16;
-begin
- ZeroMemory(@Result[0], 16);
- if ResName = '' then Exit;
-
- ResName := Trim(UpperCase(ResName));
- if Length(ResName) > 16 then SetLength(ResName, 16);
-
- CopyMemory(@Result[0], @ResName[1], Length(ResName));
-end;
-
-function TWADEditor_1.HaveResource(Section, Resource: string): Boolean;
-var
- a: Integer;
- CurrentSection: string;
-begin
- Result := False;
-
- if FResTable = nil then Exit;
-
- CurrentSection := '';
- Section := AnsiUpperCase(Section);
- Resource := AnsiUpperCase(Resource);
-
- for a := 0 to High(FResTable) do
- begin
- if FResTable[a].Length = 0 then
- begin
- CurrentSection := FResTable[a].ResourceName;
- Continue;
- end;
-
- if (FResTable[a].ResourceName = Resource) and
- (CurrentSection = Section) then
- begin
- Result := True;
- Break;
- end;
- end;
-end;
-
-function TWADEditor_1.HaveSection(Section: string): Boolean;
-var
- a: Integer;
-begin
- Result := False;
-
- if FResTable = nil then Exit;
- if Section = '' then
- begin
- Result := True;
- Exit;
- end;
-
- Section := AnsiUpperCase(Section);
-
- for a := 0 to High(FResTable) do
- if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
- begin
- Result := True;
- Exit;
- end;
-end;
-
-function TWADEditor_1.GetResource(Section, Resource: string;
- var pData: Pointer; var Len: Integer): Boolean;
-var
- a: LongWord;
- i: Integer;
- WADFile: File;
- CurrentSection: string;
- TempData: Pointer;
- OutBytes: Integer;
-begin
- Result := False;
-
- CurrentSection := '';
-
- if FWADOpened = DFWAD_OPENED_NONE then
- begin
- FLastError := DFWAD_ERROR_WADNOTLOADED;
- Exit;
- end;
-
- Section := UpperCase(Section);
- Resource := UpperCase(Resource);
-
- i := -1;
- for a := 0 to High(FResTable) do
- begin
- if FResTable[a].Length = 0 then
- begin
- CurrentSection := FResTable[a].ResourceName;
- Continue;
- end;
-
- if (FResTable[a].ResourceName = Resource) and
- (CurrentSection = Section) then
- begin
- i := a;
- Break;
- end;
- end;
-
- if i = -1 then
- begin
- FLastError := DFWAD_ERROR_RESOURCENOTFOUND;
- Exit;
- end;
-
- if FWADOpened = DFWAD_OPENED_FILE then
- begin
- try
- AssignFile(WADFile, FFileName);
- Reset(WADFile, 1);
-
- Seek(WADFile, FResTable[i].Address+6+
- LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable)));
- TempData := GetMemory(FResTable[i].Length);
- BlockRead(WADFile, TempData^, FResTable[i].Length);
- DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
- FreeMem(TempData);
-
- Len := OutBytes;
-
- CloseFile(WADFile);
- except
- FLastError := DFWAD_ERROR_CANTOPENWAD;
- CloseFile(WADFile);
- Exit;
- end;
- end
- else
- begin
- TempData := GetMemory(FResTable[i].Length);
- CopyMemory(TempData, Pointer(NativeUInt(FResData)+FResTable[i].Address+6+
- LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable))),
- FResTable[i].Length);
- DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
- FreeMem(TempData);
-
- Len := OutBytes;
- end;
-
- FLastError := DFWAD_NOERROR;
- Result := True;
-end;
-
-function TWADEditor_1.GetResourcesList(Section: string): SArray;
-var
- a: Integer;
- CurrentSection: Char16;
-begin
- Result := nil;
-
- if FResTable = nil then Exit;
- if Length(Section) > 16 then Exit;
-
- CurrentSection := '';
-
- for a := 0 to High(FResTable) do
- begin
- if FResTable[a].Length = 0 then
- begin
- CurrentSection := FResTable[a].ResourceName;
- Continue;
- end;
-
- if CurrentSection = Section then
- begin
- SetLength(Result, Length(Result)+1);
- Result[High(Result)] := FResTable[a].ResourceName;
- end;
- end;
-end;
-
-function TWADEditor_1.GetSectionList(): SArray;
-var
- i: DWORD;
-begin
- Result := nil;
-
- if FResTable = nil then Exit;
-
- if FResTable[0].Length <> 0 then
- begin
- SetLength(Result, 1);
- Result[0] := '';
- end;
-
- for i := 0 to High(FResTable) do
- if FResTable[i].Length = 0 then
- begin
- SetLength(Result, Length(Result)+1);
- Result[High(Result)] := FResTable[i].ResourceName;
- end;
-end;
-
-function TWADEditor_1.LastErrorString(): string;
-begin
- case FLastError of
- DFWAD_NOERROR: Result := '';
- DFWAD_ERROR_WADNOTFOUND: Result := 'DFWAD file not found';
- DFWAD_ERROR_CANTOPENWAD: Result := 'Can''t open DFWAD file';
- DFWAD_ERROR_RESOURCENOTFOUND: Result := 'Resource not found';
- DFWAD_ERROR_FILENOTWAD: Result := 'File is not DFWAD';
- DFWAD_ERROR_WADNOTLOADED: Result := 'DFWAD file is not loaded';
- DFWAD_ERROR_READRESOURCE: Result := 'Read resource error';
- DFWAD_ERROR_READWAD: Result := 'Read DFWAD error';
- else Result := 'Unknown DFWAD error';
- end;
-end;
-
-function TWADEditor_1.ReadFile(FileName: string): Boolean;
-var
- WADFile: File;
- Signature: array[0..4] of Char;
- a: Integer;
-begin
- FreeWAD();
-
- Result := False;
-
- if not FileExists(FileName) then
- begin
- FLastError := DFWAD_ERROR_WADNOTFOUND;
- Exit;
- end;
-
- FFileName := FileName;
-
- AssignFile(WADFile, FFileName);
-
- try
- Reset(WADFile, 1);
- except
- FLastError := DFWAD_ERROR_CANTOPENWAD;
- Exit;
- end;
-
- try
- BlockRead(WADFile, Signature, 5);
- if Signature <> DFWAD_SIGNATURE then
- begin
- FLastError := DFWAD_ERROR_FILENOTWAD;
- CloseFile(WADFile);
- Exit;
- end;
-
- BlockRead(WADFile, FVersion, 1);
- if FVersion <> DFWAD_VERSION then
- begin
- FLastError := DFWAD_ERROR_WRONGVERSION;
- CloseFile(WADFile);
- Exit;
- end;
-
- BlockRead(WADFile, FHeader, SizeOf(TWADHeaderRec_1));
- SetLength(FResTable, FHeader.RecordsCount);
- if FResTable <> nil then
- begin
- BlockRead(WADFile, FResTable[0], SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
-
- for a := 0 to High(FResTable) do
- if FResTable[a].Length <> 0 then
- FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
- SizeOf(TResourceTableRec_1)*Length(FResTable)));
- end;
-
- CloseFile(WADFile);
- except
- FLastError := DFWAD_ERROR_READWAD;
- CloseFile(WADFile);
- Exit;
- end;
-
- FWADOpened := DFWAD_OPENED_FILE;
- FLastError := DFWAD_NOERROR;
- Result := True;
-end;
-
-function TWADEditor_1.ReadMemory(Data: Pointer; Len: LongWord): Boolean;
-var
- Signature: array[0..4] of Char;
- a: Integer;
-begin
- FreeWAD();
-
- Result := False;
-
- CopyMemory(@Signature[0], Data, 5);
- if Signature <> DFWAD_SIGNATURE then
- begin
- FLastError := DFWAD_ERROR_FILENOTWAD;
- Exit;
- end;
-
- CopyMemory(@FVersion, Pointer(NativeUInt(Data)+5), 1);
- if FVersion <> DFWAD_VERSION then
- begin
- FLastError := DFWAD_ERROR_WRONGVERSION;
- Exit;
- end;
-
- CopyMemory(@FHeader, Pointer(NativeUInt(Data)+6), SizeOf(TWADHeaderRec_1));
-
- SetLength(FResTable, FHeader.RecordsCount);
- if FResTable <> nil then
- begin
- CopyMemory(@FResTable[0], Pointer(NativeUInt(Data)+6+SizeOf(TWADHeaderRec_1)),
- SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
-
- for a := 0 to High(FResTable) do
- if FResTable[a].Length <> 0 then
- FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
- SizeOf(TResourceTableRec_1)*Length(FResTable)));
- end;
-
- GetMem(FResData, Len);
- CopyMemory(FResData, Data, Len);
-
- FWADOpened := DFWAD_OPENED_MEMORY;
- FLastError := DFWAD_NOERROR;
-
- Result := True;
-end;
-
-procedure TWADEditor_1.RemoveResource(Section, Resource: string);
-var
- a, i: Integer;
- CurrentSection: Char16;
- b, c, d: LongWord;
-begin
- if FResTable = nil then Exit;
-
- i := -1;
- b := 0;
- c := 0;
- CurrentSection := '';
-
- for a := 0 to High(FResTable) do
- begin
- if FResTable[a].Length = 0 then
- begin
- CurrentSection := FResTable[a].ResourceName;
- Continue;
- end;
-
- if (FResTable[a].ResourceName = Resource) and
- (CurrentSection = Section) then
- begin
- i := a;
- b := FResTable[a].Length;
- c := FResTable[a].Address;
- Break;
- end;
- end;
-
- if i = -1 then Exit;
-
- for a := i to High(FResTable)-1 do
- FResTable[a] := FResTable[a+1];
-
- SetLength(FResTable, Length(FResTable)-1);
-
- d := 0;
- for a := 0 to High(FResTable) do
- if (FResTable[a].Length <> 0) and (FResTable[a].Address > c) then
- begin
- FResTable[a].Address := FResTable[a].Address-b;
- d := d+FResTable[a].Length;
- end;
-
- CopyMemory(Pointer(LongWord(FResData)+c), Pointer(LongWord(FResData)+c+b), d);
-
- FDataSize := FDataSize-b;
- FOffset := FOffset-b;
- ReallocMem(FResData, FDataSize);
-
- FHeader.RecordsCount := FHeader.RecordsCount-1;
-end;
-
-procedure TWADEditor_1.SaveTo(FileName: string);
-var
- WADFile: File;
- sign: string;
- ver: Byte;
- Header: TWADHeaderRec_1;
- i: Integer;
-begin
- sign := DFWAD_SIGNATURE;
- ver := DFWAD_VERSION;
-
- Header.RecordsCount := Length(FResTable);
-
- if FResTable <> nil then
- for i := 0 to High(FResTable) do
- if FResTable[i].Length <> 0 then
- FResTable[i].Address := FResTable[i].Address+6+SizeOf(TWADHeaderRec_1)+
- SizeOf(TResourceTableRec_1)*Header.RecordsCount;
-
- AssignFile(WADFile, FileName);
- Rewrite(WADFile, 1);
- BlockWrite(WADFile, sign[1], 5);
- BlockWrite(WADFile, ver, 1);
- BlockWrite(WADFile, Header, SizeOf(TWADHeaderRec_1));
- if FResTable <> nil then BlockWrite(WADFile, FResTable[0],
- SizeOf(TResourceTableRec_1)*Header.RecordsCount);
- if FResData <> nil then BlockWrite(WADFile, FResData^, FDataSize);
- CloseFile(WADFile);
-end;
-
-end.
diff --git a/src/sheditor/WADSTRUCT.pas b/src/sheditor/WADSTRUCT.pas
+++ /dev/null
@@ -1,59 +0,0 @@
-(* Copyright (C) DooM 2D:Forever Developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *)
-{$MODE DELPHI}
-unit WADSTRUCT;
-
-{
------------------------------------
-WADSTRUCT.PAS ÂÅÐÑÈß ÎÒ 24.09.06
-
-Ïîääåðæêà âàäîâ âåðñèè 1
------------------------------------
-
-Ñòðóêòóðà DFWAD-ôàéëà âåðñèè 1:
- ------------------------------------------
- SIGNATURE | Byte[5] | 'DFWAD'
- VERSION | Byte | $01
- HEADER | TWADHeaderRec_1 |
- RESRECORD1 | TResourceTableRec_1 |
- ... | ................... |
- RESRECORDN | TResourceTableRec_1 |
- DATA | RAW |
- ------------------------------------------
-}
-
-interface
-
-type
- Char16 = packed array[0..15] of Char;
-
- TWADHeaderRec_1 = packed record
- RecordsCount: Word;
- end;
-
- TResourceTableRec_1 = packed record
- ResourceName: Char16;
- Address: LongWord;
- Length: LongWord;
- end;
-
-const
- DFWAD_SIGNATURE = 'DFWAD';
- DFWAD_VERSION = $01;
-
-implementation
-
-end.
diff --git a/src/sheditor/xstreams_sdl.pas b/src/sheditor/xstreams_sdl.pas
+++ /dev/null
@@ -1,91 +0,0 @@
-(* Copyright (C) DooM 2D:Forever Developers
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *)
-// special stream classes
-{$MODE DELPHI}
-{$R+}
-unit xstreams_sdl;
-
-interface
-
-uses
- SysUtils, Classes, xstreams;
-
-
-type
- // ïîòîê-îá¸ðòêà äëÿ SDL_RWops
- TSFSSDLStream = class(TStream)
- protected
- fRW: PSDL_RWops; // SDL-íàÿ ïðîêëàäêà
- fFreeSource: Boolean; // óáèâàòü èñõîäíèê ïðè ïîìèðàíèè?
-
- public
- constructor Create (aSrc: PSDL_RWops; aFreeSource: Boolean=true);
- destructor Destroy (); override;
-
- function Read (var buffer; count: LongInt): LongInt; override;
- function Write (const buffer; count: LongInt): LongInt; override;
- function Seek (const offset: Int64; origin: TSeekOrigin): Int64; override;
- end;
-
-
-implementation
-
-
-{ TSFSSDLStream }
-constructor TSFSSDLStream.Create (aSrc: PSDL_RWops; aFreeSource: Boolean=true);
-begin
- inherited Create();
- //ASSERT(aSrc <> nil);
- fRW := aSrc;
- fFreeSource := aFreeSource;
-end;
-
-destructor TSFSSDLStream.Destroy ();
-begin
- if fFreeSource and (fRW <> nil) then SDL_FreeRW(fRW);
- inherited Destroy();
-end;
-
-function TSFSSDLStream.Read (var buffer; count: LongInt): LongInt;
-begin
- if (fRW = nil) or (count <= 0) then begin result := 0; exit; end;
- result := SDL_RWread(fRW, @buffer, 1, count);
-end;
-
-function TSFSSDLStream.Write (const buffer; count: LongInt): LongInt;
-begin
- if (fRW = nil) or (count <= 0) then begin result := 0; exit; end;
- result := SDL_RWwrite(fRW, @buffer, 1, count);
-end;
-
-function TSFSSDLStream.Seek (const offset: Int64; origin: TSeekOrigin): Int64;
-var
- ss: Integer;
-begin
- if fRW = nil then begin result := 0; exit; end;
- case origin of
- soBeginning: ss := RW_SEEK_SET;
- soCurrent: ss := RW_SEEK_CUR;
- soEnd: ss := RW_SEEK_END;
- else raise XStreamError.Create('invalid Seek() call');
- // äðóãèõ íå áûâàåò. à ó êîãî áûâàåò, òîìó ÿ íå äîêòîð.
- end;
- result := SDL_RWseek(fRW, offset, ss);
- if result = -1 then raise XStreamError.Create('Seek() error');
-end;
-
-
-end.