DEADSOFTWARE

b533664d29bb1c60e3ccf11da9131f8a97a123ea
[d2df-editor.git] / src / shared / WADEDITOR.pas
1 unit WADEDITOR;
3 {$MODE Delphi}
5 {
6 -----------------------------------
7 WADEDITOR.PAS ВЕРСИЯ ОТ 26.08.08
9 Поддержка вадов версии 1
10 -----------------------------------
11 }
13 interface
15 uses WADSTRUCT;
17 type
18 SArray = array of ShortString;
20 TWADEditor_1 = class(TObject)
21 private
22 FResData: Pointer;
23 FResTable: packed array of TResourceTableRec_1;
24 FHeader: TWADHeaderRec_1;
25 FDataSize: LongWord;
26 FOffset: LongWord;
27 FFileName: string;
28 FWADOpened: Byte;
29 FLastError: Integer;
30 FVersion: Byte;
31 function LastErrorString(): string;
32 function GetResName(ResName: string): Char16;
33 public
34 constructor Create();
35 destructor Destroy(); override;
36 procedure FreeWAD();
37 function ReadFile(FileName: string): Boolean;
38 function ReadMemory(Data: Pointer; Len: LongWord): Boolean;
39 procedure CreateImage();
40 function AddResource(Data: Pointer; Len: LongWord; Name: string;
41 Section: string): Boolean; overload;
42 function AddResource(FileName, Name, Section: string): Boolean; overload;
43 function AddAlias(Res, Alias: string): Boolean;
44 procedure AddSection(Name: string);
45 procedure RemoveResource(Section, Resource: string);
46 procedure SaveTo(FileName: string);
47 function HaveResource(Section, Resource: string): Boolean;
48 function HaveSection(Section: string): Boolean;
49 function GetResource(Section, Resource: string; var pData: Pointer;
50 var Len: Integer): Boolean;
51 function GetSectionList(): SArray;
52 function GetResourcesList(Section: string): SArray;
54 property GetLastError: Integer read FLastError;
55 property GetLastErrorStr: string read LastErrorString;
56 property GetResourcesCount: Word read FHeader.RecordsCount;
57 property GetVersion: Byte read FVersion;
58 end;
60 const
61 DFWAD_NOERROR = 0;
62 DFWAD_ERROR_WADNOTFOUND = -1;
63 DFWAD_ERROR_CANTOPENWAD = -2;
64 DFWAD_ERROR_RESOURCENOTFOUND = -3;
65 DFWAD_ERROR_FILENOTWAD = -4;
66 DFWAD_ERROR_WADNOTLOADED = -5;
67 DFWAD_ERROR_READRESOURCE = -6;
68 DFWAD_ERROR_READWAD = -7;
69 DFWAD_ERROR_WRONGVERSION = -8;
72 procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
73 SectionName, ResourceName: String); overload;
74 procedure g_ProcessResourceStr(ResourceStr: String; FileName,
75 SectionName, ResourceName: PString); overload;
77 implementation
79 uses
80 SysUtils, BinEditor, ZLib;
82 const
83 DFWAD_OPENED_NONE = 0;
84 DFWAD_OPENED_FILE = 1;
85 DFWAD_OPENED_MEMORY = 2;
87 procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
88 OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
89 var
90 strm: TZStreamRec;
91 P: Pointer;
92 BufInc: Integer;
93 begin
94 FillChar(strm, sizeof(strm), 0);
95 BufInc := (InBytes + 255) and not 255;
96 if OutEstimate = 0 then
97 OutBytes := BufInc
98 else
99 OutBytes := OutEstimate;
100 GetMem(OutBuf, OutBytes);
101 try
102 strm.next_in := InBuf;
103 strm.avail_in := InBytes;
104 strm.next_out := OutBuf;
105 strm.avail_out := OutBytes;
106 inflateInit_(strm, zlib_version, sizeof(strm));
107 try
108 while inflate(strm, Z_FINISH) <> Z_STREAM_END do
109 begin
110 P := OutBuf;
111 Inc(OutBytes, BufInc);
112 ReallocMem(OutBuf, OutBytes);
113 strm.next_out := PByteF(PChar(OutBuf) + (PChar(strm.next_out) - PChar(P)));
114 strm.avail_out := BufInc;
115 end;
116 finally
117 inflateEnd(strm);
118 end;
119 ReallocMem(OutBuf, strm.total_out);
120 OutBytes := strm.total_out;
121 except
122 FreeMem(OutBuf);
123 raise
124 end;
125 end;
127 procedure g_ProcessResourceStr(ResourceStr: String; var FileName,
128 SectionName, ResourceName: String);
129 var
130 a, i: Integer;
132 begin
133 for i := Length(ResourceStr) downto 1 do
134 if ResourceStr[i] = ':' then
135 Break;
137 FileName := Copy(ResourceStr, 1, i-1);
139 for a := i+1 to Length(ResourceStr) do
140 if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
142 ResourceName := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
143 SectionName := Copy(ResourceStr, i+1, Length(ResourceStr)-Length(ResourceName)-Length(FileName)-2);
144 end;
146 procedure g_ProcessResourceStr(ResourceStr: AnsiString; FileName,
147 SectionName, ResourceName: PAnsiString);
148 var
149 a, i, l1, l2: Integer;
151 begin
152 for i := Length(ResourceStr) downto 1 do
153 if ResourceStr[i] = ':' then
154 Break;
156 if FileName <> nil then
157 begin
158 FileName^ := Copy(ResourceStr, 1, i-1);
159 l1 := Length(FileName^);
160 end
161 else
162 l1 := 0;
164 for a := i+1 to Length(ResourceStr) do
165 if (ResourceStr[a] = '\') or (ResourceStr[a] = '/') then Break;
167 if ResourceName <> nil then
168 begin
169 ResourceName^ := Copy(ResourceStr, a+1, Length(ResourceStr)-Abs(a));
170 l2 := Length(ResourceName^);
171 end
172 else
173 l2 := 0;
175 if SectionName <> nil then
176 SectionName^ := Copy(ResourceStr, i+1, Length(ResourceStr)-l2-l1-2);
177 end;
179 { TWADEditor_1 }
181 function TWADEditor_1.AddResource(Data: Pointer; Len: LongWord; Name: string;
182 Section: string): Boolean;
183 var
184 ResCompressed: Pointer;
185 ResCompressedSize: Integer;
186 a, b: Integer;
187 begin
188 Result := False;
190 SetLength(FResTable, Length(FResTable)+1);
192 if Section = '' then
193 begin
194 if Length(FResTable) > 1 then
195 for a := High(FResTable) downto 1 do
196 FResTable[a] := FResTable[a-1];
198 a := 0;
199 end
200 else
201 begin
202 Section := AnsiUpperCase(Section);
203 b := -1;
205 for a := 0 to High(FResTable) do
206 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
207 begin
208 for b := High(FResTable) downto a+2 do
209 FResTable[b] := FResTable[b-1];
211 b := a+1;
212 Break;
213 end;
215 if b = -1 then
216 begin
217 SetLength(FResTable, Length(FResTable)-1);
218 Exit;
219 end;
220 a := b;
221 end;
223 ResCompressed := nil;
224 ResCompressedSize := 0;
225 Compress(Data, @Len, ResCompressed, ResCompressedSize);
226 if ResCompressed = nil then Exit;
228 if FResData = nil then FResData := AllocMem(ResCompressedSize)
229 else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
231 FDataSize := FDataSize+LongWord(ResCompressedSize);
233 CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
234 ResCompressed, ResCompressedSize);
235 FreeMemory(ResCompressed);
237 Inc(FHeader.RecordsCount);
239 with FResTable[a] do
240 begin
241 ResourceName := GetResName(Name);
242 Address := FOffset;
243 Length := ResCompressedSize;
244 end;
246 FOffset := FOffset+Cardinal(ResCompressedSize);
248 Result := True;
249 end;
251 function TWADEditor_1.AddAlias(Res, Alias: string): Boolean;
252 var
253 a, b: Integer;
254 ares: Char16;
255 begin
256 Result := False;
258 if FResTable = nil then Exit;
260 b := -1;
261 ares := GetResName(Alias);
262 for a := 0 to High(FResTable) do
263 if FResTable[a].ResourceName = Res then
264 begin
265 b := a;
266 Break;
267 end;
269 if b = -1 then Exit;
271 Inc(FHeader.RecordsCount);
273 SetLength(FResTable, Length(FResTable)+1);
275 with FResTable[High(FResTable)] do
276 begin
277 ResourceName := ares;
278 Address := FResTable[b].Address;
279 Length := FResTable[b].Length;
280 end;
282 Result := True;
283 end;
285 function TWADEditor_1.AddResource(FileName, Name, Section: string): Boolean;
286 var
287 ResCompressed: Pointer;
288 ResCompressedSize: Integer;
289 ResourceFile: File;
290 TempResource: Pointer;
291 OriginalSize: Integer;
292 a, b: Integer;
293 begin
294 Result := False;
296 AssignFile(ResourceFile, FileName);
298 try
299 Reset(ResourceFile, 1);
300 except
301 FLastError := DFWAD_ERROR_CANTOPENWAD;
302 Exit;
303 end;
305 OriginalSize := FileSize(ResourceFile);
306 GetMem(TempResource, OriginalSize);
308 try
309 BlockRead(ResourceFile, TempResource^, OriginalSize);
310 except
311 FLastError := DFWAD_ERROR_READWAD;
312 FreeMemory(TempResource);
313 CloseFile(ResourceFile);
314 Exit;
315 end;
317 CloseFile(ResourceFile);
319 ResCompressed := nil;
320 ResCompressedSize := 0;
321 Compress(TempResource, @OriginalSize, ResCompressed, ResCompressedSize);
322 FreeMemory(TempResource);
323 if ResCompressed = nil then Exit;
325 SetLength(FResTable, Length(FResTable)+1);
327 if Section = '' then
328 begin
329 if Length(FResTable) > 1 then
330 for a := High(FResTable) downto 1 do
331 FResTable[a] := FResTable[a-1];
333 a := 0;
334 end
335 else
336 begin
337 Section := AnsiUpperCase(Section);
338 b := -1;
340 for a := 0 to High(FResTable) do
341 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
342 begin
343 for b := High(FResTable) downto a+2 do
344 FResTable[b] := FResTable[b-1];
346 b := a+1;
347 Break;
348 end;
350 if b = -1 then
351 begin
352 FreeMemory(ResCompressed);
353 SetLength(FResTable, Length(FResTable)-1);
354 Exit;
355 end;
357 a := b;
358 end;
360 if FResData = nil then FResData := AllocMem(ResCompressedSize)
361 else ReallocMem(FResData, FDataSize+Cardinal(ResCompressedSize));
363 FDataSize := FDataSize+LongWord(ResCompressedSize);
364 CopyMemory(Pointer(PChar(FResData)+FDataSize-PChar(ResCompressedSize)),
365 ResCompressed, ResCompressedSize);
366 FreeMemory(ResCompressed);
368 Inc(FHeader.RecordsCount);
370 with FResTable[a] do
371 begin
372 ResourceName := GetResName(Name);
373 Address := FOffset;
374 Length := ResCompressedSize;
375 end;
377 FOffset := FOffset+Cardinal(ResCompressedSize);
379 Result := True;
380 end;
382 procedure TWADEditor_1.AddSection(Name: string);
383 begin
384 if Name = '' then Exit;
386 Inc(FHeader.RecordsCount);
388 SetLength(FResTable, Length(FResTable)+1);
389 with FResTable[High(FResTable)] do
390 begin
391 ResourceName := GetResName(Name);
392 Address := $00000000;
393 Length := $00000000;
394 end;
395 end;
397 constructor TWADEditor_1.Create();
398 begin
399 FResData := nil;
400 FResTable := nil;
401 FDataSize := 0;
402 FOffset := 0;
403 FHeader.RecordsCount := 0;
404 FFileName := '';
405 FWADOpened := DFWAD_OPENED_NONE;
406 FLastError := DFWAD_NOERROR;
407 FVersion := DFWAD_VERSION;
408 end;
410 procedure TWADEditor_1.CreateImage();
411 var
412 WADFile: File;
413 b: LongWord;
414 begin
415 if FWADOpened = DFWAD_OPENED_NONE then
416 begin
417 FLastError := DFWAD_ERROR_WADNOTLOADED;
418 Exit;
419 end;
421 if FWADOpened = DFWAD_OPENED_MEMORY then Exit;
423 if FResData <> nil then FreeMem(FResData);
425 try
426 AssignFile(WADFile, FFileName);
427 Reset(WADFile, 1);
429 b := 6+SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable);
431 FDataSize := LongWord(FileSize(WADFile))-b;
433 GetMem(FResData, FDataSize);
435 Seek(WADFile, b);
436 BlockRead(WADFile, FResData^, FDataSize);
438 CloseFile(WADFile);
440 FOffset := FDataSize;
441 except
442 FLastError := DFWAD_ERROR_CANTOPENWAD;
443 CloseFile(WADFile);
444 Exit;
445 end;
447 FLastError := DFWAD_NOERROR;
448 end;
450 destructor TWADEditor_1.Destroy();
451 begin
452 FreeWAD();
454 inherited;
455 end;
457 procedure TWADEditor_1.FreeWAD();
458 begin
459 if FResData <> nil then FreeMem(FResData);
460 FResTable := nil;
461 FDataSize := 0;
462 FOffset := 0;
463 FHeader.RecordsCount := 0;
464 FFileName := '';
465 FWADOpened := DFWAD_OPENED_NONE;
466 FLastError := DFWAD_NOERROR;
467 FVersion := DFWAD_VERSION;
468 end;
470 function TWADEditor_1.GetResName(ResName: string): Char16;
471 begin
472 ZeroMemory(@Result[0], 16);
473 if ResName = '' then Exit;
475 ResName := Trim(UpperCase(ResName));
476 if Length(ResName) > 16 then SetLength(ResName, 16);
478 CopyMemory(@Result[0], @ResName[1], Length(ResName));
479 end;
481 function TWADEditor_1.HaveResource(Section, Resource: string): Boolean;
482 var
483 a: Integer;
484 CurrentSection: string;
485 begin
486 Result := False;
488 if FResTable = nil then Exit;
490 CurrentSection := '';
491 Section := AnsiUpperCase(Section);
492 Resource := AnsiUpperCase(Resource);
494 for a := 0 to High(FResTable) do
495 begin
496 if FResTable[a].Length = 0 then
497 begin
498 CurrentSection := FResTable[a].ResourceName;
499 Continue;
500 end;
502 if (FResTable[a].ResourceName = Resource) and
503 (CurrentSection = Section) then
504 begin
505 Result := True;
506 Break;
507 end;
508 end;
509 end;
511 function TWADEditor_1.HaveSection(Section: string): Boolean;
512 var
513 a: Integer;
514 begin
515 Result := False;
517 if FResTable = nil then Exit;
518 if Section = '' then
519 begin
520 Result := True;
521 Exit;
522 end;
524 Section := AnsiUpperCase(Section);
526 for a := 0 to High(FResTable) do
527 if (FResTable[a].Length = 0) and (FResTable[a].ResourceName = Section) then
528 begin
529 Result := True;
530 Exit;
531 end;
532 end;
534 function TWADEditor_1.GetResource(Section, Resource: string;
535 var pData: Pointer; var Len: Integer): Boolean;
536 var
537 a: LongWord;
538 i: Integer;
539 WADFile: File;
540 CurrentSection: string;
541 TempData: Pointer;
542 OutBytes: Integer;
543 begin
544 Result := False;
546 CurrentSection := '';
548 if FWADOpened = DFWAD_OPENED_NONE then
549 begin
550 FLastError := DFWAD_ERROR_WADNOTLOADED;
551 Exit;
552 end;
554 Section := UpperCase(Section);
555 Resource := UpperCase(Resource);
557 i := -1;
558 for a := 0 to High(FResTable) do
559 begin
560 if FResTable[a].Length = 0 then
561 begin
562 CurrentSection := FResTable[a].ResourceName;
563 Continue;
564 end;
566 if (FResTable[a].ResourceName = Resource) and
567 (CurrentSection = Section) then
568 begin
569 i := a;
570 Break;
571 end;
572 end;
574 if i = -1 then
575 begin
576 FLastError := DFWAD_ERROR_RESOURCENOTFOUND;
577 Exit;
578 end;
580 if FWADOpened = DFWAD_OPENED_FILE then
581 begin
582 try
583 AssignFile(WADFile, FFileName);
584 Reset(WADFile, 1);
586 Seek(WADFile, FResTable[i].Address+6+
587 LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable)));
588 TempData := GetMemory(FResTable[i].Length);
589 BlockRead(WADFile, TempData^, FResTable[i].Length);
590 DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
591 FreeMem(TempData);
593 Len := OutBytes;
595 CloseFile(WADFile);
596 except
597 FLastError := DFWAD_ERROR_CANTOPENWAD;
598 CloseFile(WADFile);
599 Exit;
600 end;
601 end
602 else
603 begin
604 TempData := GetMemory(FResTable[i].Length);
605 CopyMemory(TempData, Pointer(LongWord(FResData)+FResTable[i].Address+6+
606 LongWord(SizeOf(TWADHeaderRec_1)+SizeOf(TResourceTableRec_1)*Length(FResTable))),
607 FResTable[i].Length);
608 DecompressBuf(TempData, FResTable[i].Length, 0, pData, OutBytes);
609 FreeMem(TempData);
611 Len := OutBytes;
612 end;
614 FLastError := DFWAD_NOERROR;
615 Result := True;
616 end;
618 function TWADEditor_1.GetResourcesList(Section: string): SArray;
619 var
620 a: Integer;
621 CurrentSection: Char16;
622 begin
623 Result := nil;
625 if FResTable = nil then Exit;
626 if Length(Section) > 16 then Exit;
628 CurrentSection := '';
630 for a := 0 to High(FResTable) do
631 begin
632 if FResTable[a].Length = 0 then
633 begin
634 CurrentSection := FResTable[a].ResourceName;
635 Continue;
636 end;
638 if CurrentSection = Section then
639 begin
640 SetLength(Result, Length(Result)+1);
641 Result[High(Result)] := FResTable[a].ResourceName;
642 end;
643 end;
644 end;
646 function TWADEditor_1.GetSectionList(): SArray;
647 var
648 i: DWORD;
649 begin
650 Result := nil;
652 if FResTable = nil then Exit;
654 if FResTable[0].Length <> 0 then
655 begin
656 SetLength(Result, 1);
657 Result[0] := '';
658 end;
660 for i := 0 to High(FResTable) do
661 if FResTable[i].Length = 0 then
662 begin
663 SetLength(Result, Length(Result)+1);
664 Result[High(Result)] := FResTable[i].ResourceName;
665 end;
666 end;
668 function TWADEditor_1.LastErrorString(): string;
669 begin
670 case FLastError of
671 DFWAD_NOERROR: Result := '';
672 DFWAD_ERROR_WADNOTFOUND: Result := 'DFWAD file not found';
673 DFWAD_ERROR_CANTOPENWAD: Result := 'Can''t open DFWAD file';
674 DFWAD_ERROR_RESOURCENOTFOUND: Result := 'Resource not found';
675 DFWAD_ERROR_FILENOTWAD: Result := 'File is not DFWAD';
676 DFWAD_ERROR_WADNOTLOADED: Result := 'DFWAD file is not loaded';
677 DFWAD_ERROR_READRESOURCE: Result := 'Read resource error';
678 DFWAD_ERROR_READWAD: Result := 'Read DFWAD error';
679 end;
680 end;
682 function TWADEditor_1.ReadFile(FileName: string): Boolean;
683 var
684 WADFile: File;
685 Signature: array[0..4] of Char;
686 a: Integer;
687 begin
688 FreeWAD();
690 Result := False;
692 if not FileExists(FileName) then
693 begin
694 FLastError := DFWAD_ERROR_WADNOTFOUND;
695 Exit;
696 end;
698 FFileName := FileName;
700 AssignFile(WADFile, FFileName);
702 try
703 Reset(WADFile, 1);
704 except
705 FLastError := DFWAD_ERROR_CANTOPENWAD;
706 Exit;
707 end;
709 try
710 BlockRead(WADFile, Signature, 5);
711 if Signature <> DFWAD_SIGNATURE then
712 begin
713 FLastError := DFWAD_ERROR_FILENOTWAD;
714 CloseFile(WADFile);
715 Exit;
716 end;
718 BlockRead(WADFile, FVersion, 1);
719 if FVersion <> DFWAD_VERSION then
720 begin
721 FLastError := DFWAD_ERROR_WRONGVERSION;
722 CloseFile(WADFile);
723 Exit;
724 end;
726 BlockRead(WADFile, FHeader, SizeOf(TWADHeaderRec_1));
727 SetLength(FResTable, FHeader.RecordsCount);
728 if FResTable <> nil then
729 begin
730 BlockRead(WADFile, FResTable[0], SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
732 for a := 0 to High(FResTable) do
733 if FResTable[a].Length <> 0 then
734 FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
735 SizeOf(TResourceTableRec_1)*Length(FResTable)));
736 end;
738 CloseFile(WADFile);
739 except
740 FLastError := DFWAD_ERROR_READWAD;
741 CloseFile(WADFile);
742 Exit;
743 end;
745 FWADOpened := DFWAD_OPENED_FILE;
746 FLastError := DFWAD_NOERROR;
747 Result := True;
748 end;
750 function TWADEditor_1.ReadMemory(Data: Pointer; Len: LongWord): Boolean;
751 var
752 Signature: array[0..4] of Char;
753 a: Integer;
754 begin
755 FreeWAD();
757 Result := False;
759 CopyMemory(@Signature[0], Data, 5);
760 if Signature <> DFWAD_SIGNATURE then
761 begin
762 FLastError := DFWAD_ERROR_FILENOTWAD;
763 Exit;
764 end;
766 CopyMemory(@FVersion, Pointer(LongWord(Data)+5), 1);
767 if FVersion <> DFWAD_VERSION then
768 begin
769 FLastError := DFWAD_ERROR_WRONGVERSION;
770 Exit;
771 end;
773 CopyMemory(@FHeader, Pointer(LongWord(Data)+6), SizeOf(TWADHeaderRec_1));
775 SetLength(FResTable, FHeader.RecordsCount);
776 if FResTable <> nil then
777 begin
778 CopyMemory(@FResTable[0], Pointer(LongWord(Data)+6+SizeOf(TWADHeaderRec_1)),
779 SizeOf(TResourceTableRec_1)*FHeader.RecordsCount);
781 for a := 0 to High(FResTable) do
782 if FResTable[a].Length <> 0 then
783 FResTable[a].Address := FResTable[a].Address-6-(LongWord(SizeOf(TWADHeaderRec_1)+
784 SizeOf(TResourceTableRec_1)*Length(FResTable)));
785 end;
787 GetMem(FResData, Len);
788 CopyMemory(FResData, Data, Len);
790 FWADOpened := DFWAD_OPENED_MEMORY;
791 FLastError := DFWAD_NOERROR;
793 Result := True;
794 end;
796 procedure TWADEditor_1.RemoveResource(Section, Resource: string);
797 var
798 a, i: Integer;
799 CurrentSection: Char16;
800 b, c, d: LongWord;
801 begin
802 if FResTable = nil then Exit;
804 i := -1;
805 b := 0;
806 c := 0;
807 CurrentSection := '';
809 for a := 0 to High(FResTable) do
810 begin
811 if FResTable[a].Length = 0 then
812 begin
813 CurrentSection := FResTable[a].ResourceName;
814 Continue;
815 end;
817 if (FResTable[a].ResourceName = Resource) and
818 (CurrentSection = Section) then
819 begin
820 i := a;
821 b := FResTable[a].Length;
822 c := FResTable[a].Address;
823 Break;
824 end;
825 end;
827 if i = -1 then Exit;
829 for a := i to High(FResTable)-1 do
830 FResTable[a] := FResTable[a+1];
832 SetLength(FResTable, Length(FResTable)-1);
834 d := 0;
835 for a := 0 to High(FResTable) do
836 if (FResTable[a].Length <> 0) and (FResTable[a].Address > c) then
837 begin
838 FResTable[a].Address := FResTable[a].Address-b;
839 d := d+FResTable[a].Length;
840 end;
842 CopyMemory(Pointer(LongWord(FResData)+c), Pointer(LongWord(FResData)+c+b), d);
844 FDataSize := FDataSize-b;
845 FOffset := FOffset-b;
846 ReallocMem(FResData, FDataSize);
848 FHeader.RecordsCount := FHeader.RecordsCount-1;
849 end;
851 procedure TWADEditor_1.SaveTo(FileName: string);
852 var
853 WADFile: File;
854 sign: string;
855 ver: Byte;
856 Header: TWADHeaderRec_1;
857 i: Integer;
858 begin
859 sign := DFWAD_SIGNATURE;
860 ver := DFWAD_VERSION;
862 Header.RecordsCount := Length(FResTable);
864 if FResTable <> nil then
865 for i := 0 to High(FResTable) do
866 if FResTable[i].Length <> 0 then
867 FResTable[i].Address := FResTable[i].Address+6+SizeOf(TWADHeaderRec_1)+
868 SizeOf(TResourceTableRec_1)*Header.RecordsCount;
870 AssignFile(WADFile, FileName);
871 Rewrite(WADFile, 1);
872 BlockWrite(WADFile, sign[1], 5);
873 BlockWrite(WADFile, ver, 1);
874 BlockWrite(WADFile, Header, SizeOf(TWADHeaderRec_1));
875 if FResTable <> nil then BlockWrite(WADFile, FResTable[0],
876 SizeOf(TResourceTableRec_1)*Header.RecordsCount);
877 if FResData <> nil then BlockWrite(WADFile, FResData^, FDataSize);
878 CloseFile(WADFile);
879 end;
881 end.