DEADSOFTWARE

changed some backslashes to forward slashes
[d2df-editor.git] / src / shared / WADEDITOR.pas
1 unit WADEDITOR;
3 {
4 -----------------------------------
5 WADEDITOR.PAS ÂÅÐÑÈß ÎÒ 26.08.08
7 Ïîääåðæêà âàäîâ âåðñèè 1
8 -----------------------------------
9 }
11 interface
13 uses WADSTRUCT;
15 type
16 SArray = array of ShortString;
18 TWADEditor_1 = class(TObject)
19 private
20 FResData: Pointer;
21 FResTable: packed array of TResourceTableRec_1;
22 FHeader: TWADHeaderRec_1;
23 FDataSize: LongWord;
24 FOffset: LongWord;
25 FFileName: string;
26 FWADOpened: Byte;
27 FLastError: Integer;
28 FVersion: Byte;
29 function LastErrorString(): string;
30 function GetResName(ResName: string): Char16;
31 public
32 constructor Create();
33 destructor Destroy(); override;
34 procedure FreeWAD();
35 function ReadFile(FileName: string): Boolean;
36 function ReadMemory(Data: Pointer; Len: LongWord): Boolean;
37 procedure CreateImage();
38 function AddResource(Data: Pointer; Len: LongWord; Name: string;
39 Section: string): Boolean; overload;
40 function AddResource(FileName, Name, Section: string): Boolean; overload;
41 function AddAlias(Res, Alias: string): Boolean;
42 procedure AddSection(Name: string);
43 procedure RemoveResource(Section, Resource: string);
44 procedure SaveTo(FileName: string);
45 function HaveResource(Section, Resource: string): Boolean;
46 function HaveSection(Section: string): Boolean;
47 function GetResource(Section, Resource: string; var pData: Pointer;
48 var Len: Integer): Boolean;
49 function GetSectionList(): SArray;
50 function GetResourcesList(Section: string): SArray;
52 property GetLastError: Integer read FLastError;
53 property GetLastErrorStr: string read LastErrorString;
54 property GetResourcesCount: Word read FHeader.RecordsCount;
55 property GetVersion: Byte read FVersion;
56 end;
58 const
59 DFWAD_NOERROR = 0;
60 DFWAD_ERROR_WADNOTFOUND = -1;
61 DFWAD_ERROR_CANTOPENWAD = -2;
62 DFWAD_ERROR_RESOURCENOTFOUND = -3;
63 DFWAD_ERROR_FILENOTWAD = -4;
64 DFWAD_ERROR_WADNOTLOADED = -5;
65 DFWAD_ERROR_READRESOURCE = -6;
66 DFWAD_ERROR_READWAD = -7;
67 DFWAD_ERROR_WRONGVERSION = -8;
70 procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
71 SectionName, ResourceName: String); overload;
72 procedure g_ProcessResourceStr(ResourceStr: String; FileName,
73 SectionName, ResourceName: PString); overload;
75 implementation
77 uses
78 SysUtils, BinEditor, ZLib, utils;
80 const
81 DFWAD_OPENED_NONE = 0;
82 DFWAD_OPENED_FILE = 1;
83 DFWAD_OPENED_MEMORY = 2;
85 procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
86 OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
87 var
88 strm: TZStreamRec;
89 P: Pointer;
90 BufInc: Integer;
91 begin
92 FillChar(strm, sizeof(strm), 0);
93 BufInc := (InBytes + 255) and not 255;
94 if OutEstimate = 0 then
95 OutBytes := BufInc
96 else
97 OutBytes := OutEstimate;
98 GetMem(OutBuf, OutBytes);
99 try
100 strm.next_in := InBuf;
101 strm.avail_in := InBytes;
102 strm.next_out := OutBuf;
103 strm.avail_out := OutBytes;
104 inflateInit_(strm, zlib_version, sizeof(strm));
105 try
106 while inflate(strm, Z_FINISH) <> Z_STREAM_END do
107 begin
108 P := OutBuf;
109 Inc(OutBytes, BufInc);
110 ReallocMem(OutBuf, OutBytes);
111 strm.next_out := PByteF(PChar(OutBuf) + (PChar(strm.next_out) - PChar(P)));
112 strm.avail_out := BufInc;
113 end;
114 finally
115 inflateEnd(strm);
116 end;
117 ReallocMem(OutBuf, strm.total_out);
118 OutBytes := strm.total_out;
119 except
120 FreeMem(OutBuf);
121 raise
122 end;
123 end;
125 procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
126 SectionName, ResourceName: String);
127 var
128 a, i: Integer;
130 begin
131 for i := Length(ResourceStr) downto 1 do
132 if ResourceStr[i] = ':' then
133 Break;
135 FileName := Copy(ResourceStr, 1, i-1);
137 for a := i+1 to Length(ResourceStr) do
138 if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
140 ResourceName := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
141 SectionName := Copy(ResourceStr, i+1, Length(ResourceStr)-Length(ResourceName)-Length(FileName)-2);
142 end;
144 procedure g_ProcessResourceStr(ResourceStr: AnsiString; FileName,
145 SectionName, ResourceName: PAnsiString);
146 var
147 a, i, l1, l2: Integer;
149 begin
150 for i := Length(ResourceStr) downto 1 do
151 if ResourceStr[i] = ':' then
152 Break;
154 if FileName <> nil then
155 begin
156 FileName^ := Copy(ResourceStr, 1, i-1);
157 l1 := Length(FileName^);
158 end
159 else
160 l1 := 0;
162 for a := i+1 to Length(ResourceStr) do
163 if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
165 if ResourceName <> nil then
166 begin
167 ResourceName^ := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
168 l2 := Length(ResourceName^);
169 end
170 else
171 l2 := 0;
173 if SectionName <> nil then
174 SectionName^ := Copy(ResourceStr, i+1, Length(ResourceStr)-l2-l1-2);
175 end;
177 { TWADEditor_1 }
179 function TWADEditor_1.AddResource(Data: Pointer; Len: LongWord; Name: string;
180 Section: string): Boolean;
181 var
182 ResCompressed: Pointer;
183 ResCompressedSize: Integer;
184 a, b: Integer;
185 begin
186 Result := False;
188 SetLength(FResTable, Length(FResTable)+1);
190 if Section = '' then
191 begin
192 if Length(FResTable) > 1 then
193 for a := High(FResTable) downto 1 do
194 FResTable[a] := FResTable[a-1];
196 a := 0;
197 end
198 else
199 begin
200 Section := AnsiUpperCase(Section);
201 b := -1;
203 for a := 0 to High(FResTable) do
204 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
205 begin
206 for b := High(FResTable) downto a+2 do
207 FResTable[b] := FResTable[b-1];
209 b := a+1;
210 Break;
211 end;
213 if b = -1 then
214 begin
215 SetLength(FResTable, Length(FResTable)-1);
216 Exit;
217 end;
218 a := b;
219 end;
221 ResCompressed := nil;
222 ResCompressedSize := 0;
223 Compress(Data, @Len, ResCompressed, ResCompressedSize);
224 if ResCompressed = nil then Exit;
226 if FResData = nil then FResData := AllocMem(ResCompressedSize)
227 else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
229 FDataSize := FDataSize+LongWord(ResCompressedSize);
231 CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
232 ResCompressed, ResCompressedSize);
233 FreeMemory(ResCompressed);
235 Inc(FHeader.RecordsCount);
237 with FResTable[a] do
238 begin
239 ResourceName := GetResName(Name);
240 Address := FOffset;
241 Length := ResCompressedSize;
242 end;
244 FOffset := FOffset+Cardinal(ResCompressedSize);
246 Result := True;
247 end;
249 function TWADEditor_1.AddAlias(Res, Alias: string): Boolean;
250 var
251 a, b: Integer;
252 ares: Char16;
253 begin
254 Result := False;
256 if FResTable = nil then Exit;
258 b := -1;
259 ares := GetResName(Alias);
260 for a := 0 to High(FResTable) do
261 if FResTable[a].ResourceName = Res then
262 begin
263 b := a;
264 Break;
265 end;
267 if b = -1 then Exit;
269 Inc(FHeader.RecordsCount);
271 SetLength(FResTable, Length(FResTable)+1);
273 with FResTable[High(FResTable)] do
274 begin
275 ResourceName := ares;
276 Address := FResTable[b].Address;
277 Length := FResTable[b].Length;
278 end;
280 Result := True;
281 end;
283 function TWADEditor_1.AddResource(FileName, Name, Section: string): Boolean;
284 var
285 ResCompressed: Pointer;
286 ResCompressedSize: Integer;
287 ResourceFile: File;
288 TempResource: Pointer;
289 OriginalSize: Integer;
290 a, b: Integer;
291 begin
292 Result := False;
294 AssignFile(ResourceFile, findFileCIStr(FileName));
296 try
297 Reset(ResourceFile, 1);
298 except
299 FLastError := DFWAD_ERROR_CANTOPENWAD;
300 Exit;
301 end;
303 OriginalSize := FileSize(ResourceFile);
304 GetMem(TempResource, OriginalSize);
306 try
307 BlockRead(ResourceFile, TempResource^, OriginalSize);
308 except
309 FLastError := DFWAD_ERROR_READWAD;
310 FreeMemory(TempResource);
311 CloseFile(ResourceFile);
312 Exit;
313 end;
315 CloseFile(ResourceFile);
317 ResCompressed := nil;
318 ResCompressedSize := 0;
319 Compress(TempResource, @OriginalSize, ResCompressed, ResCompressedSize);
320 FreeMemory(TempResource);
321 if ResCompressed = nil then Exit;
323 SetLength(FResTable, Length(FResTable)+1);
325 if Section = '' then
326 begin
327 if Length(FResTable) > 1 then
328 for a := High(FResTable) downto 1 do
329 FResTable[a] := FResTable[a-1];
331 a := 0;
332 end
333 else
334 begin
335 Section := AnsiUpperCase(Section);
336 b := -1;
338 for a := 0 to High(FResTable) do
339 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
340 begin
341 for b := High(FResTable) downto a+2 do
342 FResTable[b] := FResTable[b-1];
344 b := a+1;
345 Break;
346 end;
348 if b = -1 then
349 begin
350 FreeMemory(ResCompressed);
351 SetLength(FResTable, Length(FResTable)-1);
352 Exit;
353 end;
355 a := b;
356 end;
358 if FResData = nil then FResData := AllocMem(ResCompressedSize)
359 else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
361 FDataSize := FDataSize+LongWord(ResCompressedSize);
362 CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
363 ResCompressed, ResCompressedSize);
364 FreeMemory(ResCompressed);
366 Inc(FHeader.RecordsCount);
368 with FResTable[a] do
369 begin
370 ResourceName := GetResName(Name);
371 Address := FOffset;
372 Length := ResCompressedSize;
373 end;
375 FOffset := FOffset+Cardinal(ResCompressedSize);
377 Result := True;
378 end;
380 procedure TWADEditor_1.AddSection(Name: string);
381 begin
382 if Name = '' then Exit;
384 Inc(FHeader.RecordsCount);
386 SetLength(FResTable, Length(FResTable)+1);
387 with FResTable[High(FResTable)] do
388 begin
389 ResourceName := GetResName(Name);
390 Address := $00000000;
391 Length := $00000000;
392 end;
393 end;
395 constructor TWADEditor_1.Create();
396 begin
397 FResData := nil;
398 FResTable := nil;
399 FDataSize := 0;
400 FOffset := 0;
401 FHeader.RecordsCount := 0;
402 FFileName := '';
403 FWADOpened := DFWAD_OPENED_NONE;
404 FLastError := DFWAD_NOERROR;
405 FVersion := DFWAD_VERSION;
406 end;
408 procedure TWADEditor_1.CreateImage();
409 var
410 WADFile: File;
411 b: LongWord;
412 begin
413 if FWADOpened = DFWAD_OPENED_NONE then
414 begin
415 FLastError := DFWAD_ERROR_WADNOTLOADED;
416 Exit;
417 end;
419 if FWADOpened = DFWAD_OPENED_MEMORY then Exit;
421 if FResData <> nil then FreeMem(FResData);
423 try
424 AssignFile(WADFile, findFileCIStr(FFileName));
425 Reset(WADFile, 1);
427 b := 6+SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable);
429 FDataSize := LongWord(FileSize(WADFile))-b;
431 GetMem(FResData, FDataSize);
433 Seek(WADFile, b);
434 BlockRead(WADFile, FResData^, FDataSize);
436 CloseFile(WADFile);
438 FOffset := FDataSize;
439 except
440 FLastError := DFWAD_ERROR_CANTOPENWAD;
441 CloseFile(WADFile);
442 Exit;
443 end;
445 FLastError := DFWAD_NOERROR;
446 end;
448 destructor TWADEditor_1.Destroy();
449 begin
450 FreeWAD();
452 inherited;
453 end;
455 procedure TWADEditor_1.FreeWAD();
456 begin
457 if FResData <> nil then FreeMem(FResData);
458 FResTable := nil;
459 FDataSize := 0;
460 FOffset := 0;
461 FHeader.RecordsCount := 0;
462 FFileName := '';
463 FWADOpened := DFWAD_OPENED_NONE;
464 FLastError := DFWAD_NOERROR;
465 FVersion := DFWAD_VERSION;
466 end;
468 function TWADEditor_1.GetResName(ResName: string): Char16;
469 begin
470 ZeroMemory(@Result[0], 16);
471 if ResName = '' then Exit;
473 ResName := Trim(UpperCase(ResName));
474 if Length(ResName) > 16 then SetLength(ResName, 16);
476 CopyMemory(@Result[0], @ResName[1], Length(ResName));
477 end;
479 function TWADEditor_1.HaveResource(Section, Resource: string): Boolean;
480 var
481 a: Integer;
482 CurrentSection: string;
483 begin
484 Result := False;
486 if FResTable = nil then Exit;
488 CurrentSection := '';
489 Section := AnsiUpperCase(Section);
490 Resource := AnsiUpperCase(Resource);
492 for a := 0 to High(FResTable) do
493 begin
494 if FResTable[a].Length = 0 then
495 begin
496 CurrentSection := FResTable[a].ResourceName;
497 Continue;
498 end;
500 if (FResTable[a].ResourceName = Resource) and
501 (CurrentSection = Section) then
502 begin
503 Result := True;
504 Break;
505 end;
506 end;
507 end;
509 function TWADEditor_1.HaveSection(Section: string): Boolean;
510 var
511 a: Integer;
512 begin
513 Result := False;
515 if FResTable = nil then Exit;
516 if Section = '' then
517 begin
518 Result := True;
519 Exit;
520 end;
522 Section := AnsiUpperCase(Section);
524 for a := 0 to High(FResTable) do
525 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
526 begin
527 Result := True;
528 Exit;
529 end;
530 end;
532 function TWADEditor_1.GetResource(Section, Resource: string;
533 var pData: Pointer; var Len: Integer): Boolean;
534 var
535 a: LongWord;
536 i: Integer;
537 WADFile: File;
538 CurrentSection: string;
539 TempData: Pointer;
540 OutBytes: Integer;
541 begin
542 Result := False;
544 CurrentSection := '';
546 if FWADOpened = DFWAD_OPENED_NONE then
547 begin
548 FLastError := DFWAD_ERROR_WADNOTLOADED;
549 Exit;
550 end;
552 Section := UpperCase(Section);
553 Resource := UpperCase(Resource);
555 i := -1;
556 for a := 0 to High(FResTable) do
557 begin
558 if FResTable[a].Length = 0 then
559 begin
560 CurrentSection := FResTable[a].ResourceName;
561 Continue;
562 end;
564 if (FResTable[a].ResourceName = Resource) and
565 (CurrentSection = Section) then
566 begin
567 i := a;
568 Break;
569 end;
570 end;
572 if i = -1 then
573 begin
574 FLastError := DFWAD_ERROR_RESOURCENOTFOUND;
575 Exit;
576 end;
578 if FWADOpened = DFWAD_OPENED_FILE then
579 begin
580 try
581 AssignFile(WADFile, findFileCIStr(FFileName));
582 Reset(WADFile, 1);
584 Seek(WADFile, FResTable[i].Address+6+
585 LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable)));
586 TempData := GetMemory(FResTable[i].Length);
587 BlockRead(WADFile, TempData^, FResTable[i].Length);
588 DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
589 FreeMem(TempData);
591 Len := OutBytes;
593 CloseFile(WADFile);
594 except
595 FLastError := DFWAD_ERROR_CANTOPENWAD;
596 CloseFile(WADFile);
597 Exit;
598 end;
599 end
600 else
601 begin
602 TempData := GetMemory(FResTable[i].Length);
603 CopyMemory(TempData, Pointer(LongWord(FResData)+FResTable[i].Address+6+
604 LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable))),
605 FResTable[i].Length);
606 DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
607 FreeMem(TempData);
609 Len := OutBytes;
610 end;
612 FLastError := DFWAD_NOERROR;
613 Result := True;
614 end;
616 function TWADEditor_1.GetResourcesList(Section: string): SArray;
617 var
618 a: Integer;
619 CurrentSection: Char16;
620 begin
621 Result := nil;
623 if FResTable = nil then Exit;
624 if Length(Section) > 16 then Exit;
626 CurrentSection := '';
628 for a := 0 to High(FResTable) do
629 begin
630 if FResTable[a].Length = 0 then
631 begin
632 CurrentSection := FResTable[a].ResourceName;
633 Continue;
634 end;
636 if CurrentSection = Section then
637 begin
638 SetLength(Result, Length(Result)+1);
639 Result[High(Result)] := FResTable[a].ResourceName;
640 end;
641 end;
642 end;
644 function TWADEditor_1.GetSectionList(): SArray;
645 var
646 i: DWORD;
647 begin
648 Result := nil;
650 if FResTable = nil then Exit;
652 if FResTable[0].Length <> 0 then
653 begin
654 SetLength(Result, 1);
655 Result[0] := '';
656 end;
658 for i := 0 to High(FResTable) do
659 if FResTable[i].Length = 0 then
660 begin
661 SetLength(Result, Length(Result)+1);
662 Result[High(Result)] := FResTable[i].ResourceName;
663 end;
664 end;
666 function TWADEditor_1.LastErrorString(): string;
667 begin
668 case FLastError of
669 DFWAD_NOERROR: Result := '';
670 DFWAD_ERROR_WADNOTFOUND: Result := 'DFWAD file not found';
671 DFWAD_ERROR_CANTOPENWAD: Result := 'Can''t open DFWAD file';
672 DFWAD_ERROR_RESOURCENOTFOUND: Result := 'Resource not found';
673 DFWAD_ERROR_FILENOTWAD: Result := 'File is not DFWAD';
674 DFWAD_ERROR_WADNOTLOADED: Result := 'DFWAD file is not loaded';
675 DFWAD_ERROR_READRESOURCE: Result := 'Read resource error';
676 DFWAD_ERROR_READWAD: Result := 'Read DFWAD error';
677 end;
678 end;
680 function TWADEditor_1.ReadFile(FileName: string): Boolean;
681 var
682 WADFile: File;
683 Signature: array[0..4] of Char;
684 a: Integer;
685 begin
686 FreeWAD();
688 Result := False;
690 if not FileExists(FileName) then
691 begin
692 FLastError := DFWAD_ERROR_WADNOTFOUND;
693 Exit;
694 end;
696 FFileName := FileName;
698 AssignFile(WADFile, findFileCIStr(FFileName));
700 try
701 Reset(WADFile, 1);
702 except
703 FLastError := DFWAD_ERROR_CANTOPENWAD;
704 Exit;
705 end;
707 try
708 BlockRead(WADFile, Signature, 5);
709 if Signature <> DFWAD_SIGNATURE then
710 begin
711 FLastError := DFWAD_ERROR_FILENOTWAD;
712 CloseFile(WADFile);
713 Exit;
714 end;
716 BlockRead(WADFile, FVersion, 1);
717 if FVersion <> DFWAD_VERSION then
718 begin
719 FLastError := DFWAD_ERROR_WRONGVERSION;
720 CloseFile(WADFile);
721 Exit;
722 end;
724 BlockRead(WADFile, FHeader, SizeOf(TWADHeaderRec_1));
725 SetLength(FResTable, FHeader.RecordsCount);
726 if FResTable <> nil then
727 begin
728 BlockRead(WADFile, FResTable[0], SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
730 for a := 0 to High(FResTable) do
731 if FResTable[a].Length <> 0 then
732 FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
733 SizeOf(TResourceTableRec_1)*Length(FResTable)));
734 end;
736 CloseFile(WADFile);
737 except
738 FLastError := DFWAD_ERROR_READWAD;
739 CloseFile(WADFile);
740 Exit;
741 end;
743 FWADOpened := DFWAD_OPENED_FILE;
744 FLastError := DFWAD_NOERROR;
745 Result := True;
746 end;
748 function TWADEditor_1.ReadMemory(Data: Pointer; Len: LongWord): Boolean;
749 var
750 Signature: array[0..4] of Char;
751 a: Integer;
752 begin
753 FreeWAD();
755 Result := False;
757 CopyMemory(@Signature[0], Data, 5);
758 if Signature <> DFWAD_SIGNATURE then
759 begin
760 FLastError := DFWAD_ERROR_FILENOTWAD;
761 Exit;
762 end;
764 CopyMemory(@FVersion, Pointer(LongWord(Data)+5), 1);
765 if FVersion <> DFWAD_VERSION then
766 begin
767 FLastError := DFWAD_ERROR_WRONGVERSION;
768 Exit;
769 end;
771 CopyMemory(@FHeader, Pointer(LongWord(Data)+6), SizeOf(TWADHeaderRec_1));
773 SetLength(FResTable, FHeader.RecordsCount);
774 if FResTable <> nil then
775 begin
776 CopyMemory(@FResTable[0], Pointer(LongWord(Data)+6+SizeOf(TWADHeaderRec_1)),
777 SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
779 for a := 0 to High(FResTable) do
780 if FResTable[a].Length <> 0 then
781 FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
782 SizeOf(TResourceTableRec_1)*Length(FResTable)));
783 end;
785 GetMem(FResData, Len);
786 CopyMemory(FResData, Data, Len);
788 FWADOpened := DFWAD_OPENED_MEMORY;
789 FLastError := DFWAD_NOERROR;
791 Result := True;
792 end;
794 procedure TWADEditor_1.RemoveResource(Section, Resource: string);
795 var
796 a, i: Integer;
797 CurrentSection: Char16;
798 b, c, d: LongWord;
799 begin
800 if FResTable = nil then Exit;
802 i := -1;
803 b := 0;
804 c := 0;
805 CurrentSection := '';
807 for a := 0 to High(FResTable) do
808 begin
809 if FResTable[a].Length = 0 then
810 begin
811 CurrentSection := FResTable[a].ResourceName;
812 Continue;
813 end;
815 if (FResTable[a].ResourceName = Resource) and
816 (CurrentSection = Section) then
817 begin
818 i := a;
819 b := FResTable[a].Length;
820 c := FResTable[a].Address;
821 Break;
822 end;
823 end;
825 if i = -1 then Exit;
827 for a := i to High(FResTable)-1 do
828 FResTable[a] := FResTable[a+1];
830 SetLength(FResTable, Length(FResTable)-1);
832 d := 0;
833 for a := 0 to High(FResTable) do
834 if (FResTable[a].Length <> 0) and (FResTable[a].Address > c) then
835 begin
836 FResTable[a].Address := FResTable[a].Address-b;
837 d := d+FResTable[a].Length;
838 end;
840 CopyMemory(Pointer(LongWord(FResData)+c), Pointer(LongWord(FResData)+c+b), d);
842 FDataSize := FDataSize-b;
843 FOffset := FOffset-b;
844 ReallocMem(FResData, FDataSize);
846 FHeader.RecordsCount := FHeader.RecordsCount-1;
847 end;
849 procedure TWADEditor_1.SaveTo(FileName: string);
850 var
851 WADFile: File;
852 sign: string;
853 ver: Byte;
854 Header: TWADHeaderRec_1;
855 i: Integer;
856 begin
857 sign := DFWAD_SIGNATURE;
858 ver := DFWAD_VERSION;
860 Header.RecordsCount := Length(FResTable);
862 if FResTable <> nil then
863 for i := 0 to High(FResTable) do
864 if FResTable[i].Length <> 0 then
865 FResTable[i].Address := FResTable[i].Address+6+SizeOf(TWADHeaderRec_1)+
866 SizeOf(TResourceTableRec_1)*Header.RecordsCount;
868 AssignFile(WADFile, FileName);
869 Rewrite(WADFile, 1);
870 BlockWrite(WADFile, sign[1], 5);
871 BlockWrite(WADFile, ver, 1);
872 BlockWrite(WADFile, Header, SizeOf(TWADHeaderRec_1));
873 if FResTable <> nil then BlockWrite(WADFile, FResTable[0],
874 SizeOf(TResourceTableRec_1)*Header.RecordsCount);
875 if FResData <> nil then BlockWrite(WADFile, FResData^, FDataSize);
876 CloseFile(WADFile);
877 end;
879 end.