home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
ANIVGA.ZIP
/
UNLIB.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1991-11-17
|
6KB
|
192 lines
{$X+}
PROGRAM Split_Sprite_LIB_Files;
USES DOS;
CONST {Fehlercodes des Animationspaketes: }
Err_None=0;
Err_NotEnoughMemory=1;
Err_FileIO=2;
Err_NoSprite=4;
Err_DiskFull=7;
CONST dest:STRING[12]='UNLIB000.COD';
TYPE SpriteHeader= RECORD
Zeiger_auf_Plane:Array[0..3] OF Word;
Breite_in_4er_Gruppen:WORD;
Hoehe_in_Zeilen:WORD;
Translate:Array[1..4] OF Byte;
SpriteLength:WORD;
Dummy:Array[1..10] OF Word;
Kennung:ARRAY[1..2] OF CHAR;
Version:BYTE;
Modus:BYTE;
ZeigerL,ZeigerR,ZeigerO,ZeigerU:Word;
END;
VAR Error : BYTE; {globale Fehlervariable}
FUNCTION GetErrorMessage:STRING;
{ in: Error = Nummer des aufgetretenen Fehlers}
{out: den Fehler in Worten}
BEGIN
CASE Error OF
Err_None:GetErrorMessage:='No Error';
Err_NotEnoughMemory:GetErrorMessage:='Not enough memory available on heap';
Err_FileIO:GetErrorMessage:='I/O-error with file';
Err_NoSprite:GetErrorMessage:='No (or corrupted) Sprite file';
Err_DiskFull:GetErrorMessage:='Fileerror: Disk full';
END;
END;
FUNCTION SplitSprites(Name:String):WORD;
{ in: Name = Name des zu ladenden Sprite-Files (Typ: "*.COD" / "*.LIB" )}
{ Number = Nummer, die das erste Sprite aus diesem File bekommen soll }
{ dest = Name, unter dem das erste Sprite abgelegt wird, i.d.R. }
{ "UNLIB000.COD" }
{out: Anzahl der aus dem File gelesenen Sprites (0 = Fehler trat auf) }
{ UNLIB000.COD, UNLIB001.COD,... = ausgelesene Sprites }
{rem: Die Routine erkennt automatisch, ob es sich bei dem File um ein ein-}
{ zelnes Sprite oder eine ganze Spritebibliothek handelt und laedt }
{ alle Spritedaten auf den Heap, und zwar derart, dass die Adresse }
{ immer auf eine Segmentgrenze fällt. Diese Anfangsadressen werden }
{ dann in der Tabelle SPRITEAD[Number] abgelegt; sind mehrere Sprites }
{ in der Datei so werden sie mit fortlaufender Nummer eingetragen, }
{ also Number+i }
FUNCTION Update(VAR ch:CHAR):BOOLEAN;
{ in: ch = Ziffer als Zeichen : '0'..'9'}
{out: ch = um 1 erhöhtes Zeichen: '1'..'0'}
{ TRUE/FALSE, falls Übertrag in nächsthöhere Stelle}
BEGIN
IF ch='9'
THEN ch:='0'
ELSE ch:=chr(succ(ord(ch)));
Update:=ch='0'
END;
LABEL quit_loop;
TYPE SpriteBuffer=ARRAY[0..65534] OF BYTE;
VAR Buffer: ^SpriteBuffer;
len:LONGINT;
f,f2:File;
count,BytesWritten,Kopf:WORD;
Header:SpriteHeader;
BEGIN
NEW(Buffer);
count:=0; {Zahl der bisher eingelesenen Sprites}
Kopf:=SizeOf(SpriteHeader);
assign(f,name);
{$I-} reset(f,1); {$I+}
if (ioresult<>0)
THEN BEGIN {Datei existiert nicht oder nicht unter diesem Pfad}
Error:=Err_FileIO;
SplitSprites:=0; exit
END;
len:=filesize(f); {Dateilaenge ermitteln}
WHILE NOT EOF(f) DO
BEGIN
WRITELN('...working on sprite '+dest);
{Zunaechst den Spriteheader einlesen: }
{$I-} {jetzt den Spriteheader vià BLOCKREAD auf den Heap laden}
blockread(f,Header,Kopf);
{$I+}
IF (ioresult<>0)
THEN BEGIN
Error:=Err_FileIO;
goto quit_loop;
END;
IF (Header.Kennung[1]<>'K') or (Header.Kennung[2]<>'R')
THEN BEGIN
Error:=Err_NoSprite;
goto quit_loop;
END;
IF (Header.SpriteLength>MaxAvail+15) {noch genug Platz da?}
THEN BEGIN
Error:=Err_NotEnoughMemory;
goto quit_loop;
END;
MOVE(Header,Buffer^[0],Kopf);
{Jetzt eigentliche Spritedaten einlesen: }
{$I-}
blockread(f,Buffer^[Kopf],Header.SpriteLength-Kopf);
{$I+}
IF (ioresult<>0)
THEN BEGIN
Error:=Err_FileIO;
goto quit_loop
END;
{$I-} {jetzt das Sprite auf Disk schreiben}
assign(f2,dest);
Rewrite(f2,1);
{$I+}
IF (ioresult<>0)
THEN BEGIN
Error:=Err_FileIO;
goto quit_loop
END;
{$I-}
blockwrite(f2,Buffer^[0],Header.SpriteLength,BytesWritten);
{$I+}
IF Header.SpriteLength<>BytesWritten
THEN BEGIN
Error:=Err_DiskFull;
goto quit_loop
END;
IF (ioresult<>0)
THEN BEGIN
Error:=Err_FileIO;
goto quit_loop
END;
{$I-}
close(f2);
{$I+}
IF (ioresult<>0)
THEN BEGIN
Error:=Err_FileIO;
goto quit_loop
END;
INC(count);
IF Update(dest[8]) {Filenamen für nächsten Aufruf generieren}
THEN IF Update(dest[7])
THEN Update(dest[6]);
END;
WRITELN('Done, extracted ',count,' sprites');
quit_loop: ;
close(f);
SplitSprites:=count
END;
BEGIN
WRITELN;
WRITELN('UNLIB V1.1 -- Splits a spritelibrary into its *.COD-files');
WRITELN(' by Kai Rohrbacher, 1991');
WRITELN;
IF ParamCount<>1
THEN BEGIN
WRITELN('*** Wrong parameters!');
WRITELN('Call UNLIB with the name of your spritelibrary to split, e.g.:');
WRITELN;
WRITELN(' UNLIB c:\sprites\my_files.LIB');
WRITELN;
WRITELN('UNLIB will create the *.COD-files in the current directory,');
WRITELN('starting with the name '+dest+' and using increasing numbers.');
Halt(1);
END;
Error:=Err_None;
IF SplitSprites(ParamStr(1))=0
THEN BEGIN
WRITELN('*** Error: '+GetErrorMessage);
END;
END.