parse-wormedit: parse multiplayer levels in 86s files
[wormy.git] / worm5253.pas
1 USES CRT,SHIAR,DOS;
2
3 TYPE ONELEVEL52 = RECORD
4        ID:STRING[22];
5        NAME:STRING[22];
6        SIZE:BYTE;
7        PEAS,DELAY:BYTE;
8        GROWTH,BSIZE:BYTE;
9        SPRSIZE:BYTE;
10        SPRITE:ARRAY[1..8]OF BYTE;
11        NRBALLS:BYTE;
12        BALLS:ARRAY[1..32]OF RECORD
13          Y,X,D:BYTE; {Z:%00=right+down, %11=left+up}
14        END; {BALLS}
15        W:ARRAY[1..4]OF RECORD
16          D,Y,X:BYTE;
17        END; {W(ORMS)}
18        FIELDX,FIELDY:BYTE;
19        FLAG1Y,FLAG1X:BYTE;
20        FLAG2Y,FLAG2X:BYTE;
21        NROBJ:BYTE;
22        OBJ:ARRAY[1..32]OF RECORD {..128}
23          TYP:SHORTINT;X1,Y1,X2,Y2:BYTE;
24        END; {OBJ}
25      END; {ONELEVEL}
26
27      B52 = RECORD
28         A:ARRAY[1..15]OF CHAR;
29         B:BYTE;
30         C:ARRAY[1..98]OF BYTE; {256}
31         D:ARRAY[1..14]OF BYTE; {1}
32         E:ARRAY[1..9]OF BYTE; {1}
33         F:ARRAY[1..523]OF BYTE; {256}
34         G:ARRAY[1..3]OF BYTE;
35      END; {B}
36
37
38 CONST HEADEDIT52 = ('WormEdit�95'+#0+'LVL');
39       HEADVERSION = 95;
40
41
42 VAR I,II,I2:WORD;
43     C:CHAR;
44     FILENAME,S:STRING;
45     F:FILE;
46     L:ARRAY[1..64]OF ONELEVEL52;
47     B:B52;
48
49
50
51 FUNCTION STR2BYTE(SPRITE:STRING):BYTE;
52 VAR SPRTEMP,SPRTEMP2:BYTE;
53 BEGIN
54   SPRTEMP:=0; SPRTEMP2:=1;
55   FOR SPRTEMP2:=1TO LENGTH(SPRITE)DO
56     IF SPRITE[SPRTEMP2]='1'THEN INC(SPRTEMP,1SHL(8-SPRTEMP2));
57   STR2BYTE:=SPRTEMP;
58 END; {STR2BYTE}
59
60 PROCEDURE OPENFILE;
61 BEGIN
62   ASSIGN(F,FILENAME); {$I-} RESET(F,1); {$I+} I:=IORESULT;
63   IF I<>0THEN BEGIN
64     TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
65     WRITELN('FAILED OPENING LEVEL FILE ',FILENAME,'!'); WRITELN('RUNTIME ERROR #',I); HALT;
66   END; {CAN'T OPEN}
67   WRITELN('OPENING ',FILENAME);
68   {$I-} BLOCKREAD(F,B,SIZEOF(B));
69         FOR I:=1TO B.D[5]DO BLOCKREAD(F,L[I],SIZEOF(L[I])); {$I+}
70   IF(IORESULT<>0)OR(B.A<>HEADEDIT52)THEN BEGIN
71     TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
72     WRITELN('ERROR READING LEVEL FILE!'); CLOSE(F); HALT;
73   END; {ERROR}
74   IF B.B<>HEADVERSION THEN BEGIN
75     WRITELN('CAN''T READ FILE VERSION ',B.B,'.'); CLOSE(F); HALT;
76   END; {VERSION}
77   CLOSE(F);
78   WRITELN('OPENED V',B.B,' SUCESSFULLY - ',B.D[5],' LEVELS FOUND');
79 END; {OPENFILE}
80
81 PROCEDURE FILESAVE;
82 BEGIN
83   ASSIGN(F,FILENAME); REWRITE(F,1);
84   S:='WormEdit053'+#0+'LVL';
85   BLOCKWRITE(F,S[1],SIZEOF(B.A));
86   B.B:=53;
87   BLOCKWRITE(F,B.B,SIZEOF(B.B));
88   BLOCKWRITE(F,B.C,SIZEOF(B.C));
89   II:=0; FOR I:=1TO 128DO BLOCKWRITE(F,II,2);
90   BLOCKWRITE(F,B.D,SIZEOF(B.D));
91     BLOCKWRITE(F,II,1);
92   BLOCKWRITE(F,B.E,SIZEOF(B.E));
93     BLOCKWRITE(F,II,1);
94   BLOCKWRITE(F,B.F,SIZEOF(B.F));
95     FOR I:=1TO 128DO BLOCKWRITE(F,II,2);
96   BLOCKWRITE(F,B.G,SIZEOF(B.G));
97   FOR I:=1TO B.D[5]DO BEGIN
98     BLOCKWRITE(F,L[I],SIZEOF(L[I]));
99     FOR I2:=1TO 5*48DO BLOCKWRITE(F,II,2);
100   END; {}
101   CLOSE(F);
102   WRITELN(FILENAME,' REWRITTEN AS V',B.B);
103 END; {FILESAVE}
104
105
106 BEGIN
107  {$M 16384,0,655360}
108   WINDOW(1,1,80,25); TEXTCOLOR(7); TEXTBACKGROUND(0); CLRSCR;
109   WRITELN('V52 TO V53 CONVERTER - BY SHIAR');
110   FILENAME:=PARAMSTR(1);
111   OPENFILE; FILESAVE;
112   WRITELN('ALL DONE. ENJOY!');
113 END.