USES CRT,SHIAR;
+TYPE ONELEVEL = RECORD
+ NAME:STRING[22];
+ SIZE:BYTE;
+ PEAS,DELAY:BYTE;
+ GROWTH,BSIZE:BYTE;
+ SPRSIZE:BYTE;
+ SPRITE:ARRAY[1..8]OF BYTE;
+ NRBALLS:BYTE;
+ BALLS:ARRAY[1..32]OF RECORD
+ Y,X,D:BYTE; {Z:%00=right+down, %11=left+up}
+ END; {BALLS}
+ W:ARRAY[1..4]OF RECORD
+ D,Y,X:BYTE;
+ END; {W(ORMS)}
+ FIELDX,FIELDY:BYTE;
+ FLAG1Y,FLAG1X:BYTE;
+ FLAG2Y,FLAG2X:BYTE;
+ NROBJ:BYTE;
+ OBJ:ARRAY[1..32]OF RECORD
+ TYP:SHORTINT;X1,Y1,X2,Y2:BYTE;
+ END; {OBJ}
+ END; {ONELEVEL}
+
CONST GAMETYPE:ARRAY[1..8]OF STRING[12] =
('SINGLEPLAYER','PEAWORM','TRON','DEATHMATCH',
'FOODMATCH','LINKPLAY','RACE','CTF');
VERSION:HEADVERSION;
NAME:'Custom Worm Level';
LSINGLE:0; LMULTI:0; LCTF:0; LTOTAL:0;
- LFROM:(1,0,0,0,0,0,0,0);
- LTO:(1,0,0,0,0,0,0,0);
+ LFROM:(0,0,0,0,0,0,0,0);
+ LTO:(0,0,0,0,0,0,0,0);
SPRSIZE:4;
SPRITE:(6*16,15*16,15*16,6*16,0,0,0,0);
{01100000
S:STRING;
F,FF:FILE;
- L:ARRAY[1..64]OF RECORD
- NAME:STRING[22];
- SIZE:BYTE;
- PEAS,DELAY:BYTE;
- GROWTH,BSIZE:BYTE;
- SPRSIZE:BYTE;
- SPRITE:ARRAY[1..8]OF BYTE;
- NRBALLS:BYTE;
- BALLS:ARRAY[1..32]OF RECORD
- Y,X,D:BYTE; {Z:%00=right+down, %11=left+up}
- END; {BALLS}
- W:ARRAY[1..4]OF RECORD
- D,Y,X:BYTE;
- END; {W(ORMS)}
- FIELDX,FIELDY:BYTE;
- FLAG1Y,FLAG1X:BYTE;
- FLAG2Y,FLAG2X:BYTE;
- NROBJ:BYTE;
- OBJ:ARRAY[1..32]OF RECORD
- TYP,X1,Y1,X2,Y2:BYTE;
- END; {OBJ}
- END; {L}
+ L:ARRAY[1..64]OF ONELEVEL;
+ LTEMP:ONELEVEL;
FILENAME:STRING[8];
PROCEDURE MAINTITLE;
BEGIN
- SETTEXT; CLRSCR;
+ SETTEXT; WINDOW(1,1,80,25); {TEXTBACKGROUND(0);} CLRSCR;
TEXTCOLOR(1); WRITE('���������������������������<');
TEXTCOLOR(14); WRITE(' WormEdit � ');
TEXTCOLOR(15); WRITE(' by SHIAR ');
LINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1+1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2+1,COL,VGA);
END; {FATLINE}
3:BEGIN
- FOR Y:=L[II].OBJ[OBJ].Y1 TO L[II].OBJ[OBJ].Y1+L[II].OBJ[OBJ].Y2 DO
+ FOR Y:=L[II].OBJ[OBJ].Y1 TO L[II].OBJ[OBJ].Y1+L[II].OBJ[OBJ].Y2-1DO
LINE(L[II].OBJ[OBJ].X1,MIN(Y,191),L[II].OBJ[OBJ].X2,MIN(Y,191),COL,VGA);
END; {BOX}
4:CIRCLE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,COL);
1:WRITE('PRESS <F1> OR <H> FOR HELP');
2:WRITE('YOU UNDERSTAND EVERYTHING');
3:WRITE('THIS AIN''T A BUG, IT A FEATURE!');
+ 4:WRITE('ALL YOUR WORMS ARE BELONG TO US!');
+ 5:WRITE('PRESS UP AND DOWN TO VIEW ALL LEVELS');
END; {TEXT TO DISPLAY}
END; {HELPBAR}
FUNCTION COMPSIZE:WORD;
BEGIN
- I:=$32+B.SPRSIZE+ORD(B.NAME[0])+
- 2*(1+(B.LTO[2]-B.LFROM[2])+(B.LTO[3]-B.LFROM[3]));
- FOR II:=1TO B.LTOTAL DO INC(I,L[II].SIZE);
+ I:=$32+B.SPRSIZE+ORD(B.NAME[0])+2;
+ IF B.LFROM[2]>0THEN I:=I+((1+B.LTO[2]-B.LFROM[2])SHL 1);
+ IF B.LFROM[3]>0THEN I:=I+((1+B.LTO[3]-B.LFROM[3])SHL 1);
+ FOR II:=1TO B.LTOTAL DO BEGIN
+ INC(I,L[II].SIZE);
+ FOR I4:=1TO L[II].NROBJ DO IF L[II].OBJ[I4].TYP<=0THEN DEC(I,5);
+ END; {CALC LEVELS}
COMPSIZE:=I;
END; {COMPSIZE}
WRITE('LEVEL OBJECTS',' ':39-13); TEXTCOLOR(7); TEXTBACKGROUND(0);
IF L[II].NROBJ<1THEN WRITELN('NONE')ELSE
FOR I4:=1TO L[II].NROBJ DO BEGIN
- WRITE(I4); TEXTCOLOR(3); WRITE(': ',OBJTYPE[L[II].OBJ[I4].TYP]);
- IF L[II].OBJ[I4].TYP>0THEN
+ WRITE(I4); TEXTCOLOR(3);
+ IF L[II].OBJ[I4].TYP>0THEN BEGIN
+ WRITE(': ',OBJTYPE[L[II].OBJ[I4].TYP]);
WRITE(' (',L[II].OBJ[I4].X1,',',L[II].OBJ[I4].Y1,')-(');
- CASE L[II].OBJ[I4].TYP OF
- 1,2:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y2,')');
- 3:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y1+L[II].OBJ[I4].Y2,')');
- 4:WRITELN(L[II].OBJ[I4].X2,')');
- END; {TYPE}
- TEXTCOLOR(7);
+ CASE L[II].OBJ[I4].TYP OF
+ 1,2:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y2,')');
+ 3:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y1+L[II].OBJ[I4].Y2,')');
+ 4:WRITELN(L[II].OBJ[I4].X2,')');
+ END; {TYPE}
+ END {ENABLED} ELSE WRITELN(': DISABLED'); TEXTCOLOR(7);
END; {DISP OBJS}
END; {2:SINGLVLS}
3:BEGIN
REPEAT
TITLEBAR(2,'EDIT OBJECT #'+NR(I)+' IN LEVEL '+NR(II));
TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': OBJECT TYPE ');
- III:=L[II].OBJ[I].TYP; TEXTCOLOR(3); WRITELN('(',III,')');
+ III:=L[II].OBJ[I].TYP; TEXTCOLOR(3); WRITELN('(',ABS(III),')');
IF III<>0THEN BEGIN
- TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7);
- IF L[II].OBJ[I].TYP=4THEN WRITE(': OBJECT POSITION ')ELSE WRITE(': OBJECT BEGIN ');
- TEXTCOLOR(3); WRITELN('(',L[II].OBJ[I].X1,',',L[II].OBJ[I].Y1,')');
- TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7);
- IF L[II].OBJ[I].TYP=4THEN WRITE(': OBJECT SIZE ')ELSE WRITE(': OBJECT END ');
+ IF L[II].OBJ[I].TYP>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7); WRITE('2'); TEXTCOLOR(7);
+ IF ABS(L[II].OBJ[I].TYP)=4THEN WRITE(': OBJECT POSITION ')ELSE WRITE(': OBJECT BEGIN');
+ IF L[II].OBJ[I].TYP>0THEN BEGIN
+ TEXTCOLOR(3); WRITELN(' (',L[II].OBJ[I].X1,',',L[II].OBJ[I].Y1,')');
+ END {PRESENT} ELSE WRITELN;
+ IF L[II].OBJ[I].TYP>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7); WRITE('3'); TEXTCOLOR(7);
+ IF ABS(L[II].OBJ[I].TYP)=4THEN WRITE(': OBJECT SIZE ')ELSE WRITE(': OBJECT END ');
TEXTCOLOR(3); CASE L[II].OBJ[I].TYP OF
3:WRITELN('(',L[II].OBJ[I].X2,',',L[II].OBJ[I].Y1+L[II].OBJ[I].Y2,')');
4:WRITELN('(',L[II].OBJ[I].X2,')');
- ELSE WRITELN('(',L[II].OBJ[I].X2,',',L[II].OBJ[I].Y2,')');
+ 1..10:WRITELN('(',L[II].OBJ[I].X2,',',L[II].OBJ[I].Y2,')');
+ ELSE WRITELN;
END; {TYPE}
- TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': PREVIEW');
+ TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITELN(': PREVIEW');
+ TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7);
+ IF L[II].OBJ[I].TYP<0THEN WRITE(': ENABLE')ELSE WRITE(': DISABLE');
END; {OBJECT PROPERTIES}
- IF III<>0THEN III:=EDITMENU(4,0)ELSE III:=EDITMENU(1,0);
+ IF III<>0THEN III:=EDITMENU(5,0)ELSE III:=EDITMENU(1,0);
CASE III OF
1:BEGIN
S:=''; FOR I4:=0TO 4DO S:=S+NR(I4)+': '+OBJTYPE[I4]+CC(' ',37-ORD(OBJTYPE[I4,0]));
L[II].OBJ[I].TYP:=INPUTINT('ENTER OBJECT TYPE',S,0,0,4);
- S:='SCREEN=(0,0)-('+NR(L[II].FIELDX-2)+','+NR(L[II].FIELDY-2)+
+ S:='SCREEN=(2,2)-('+NR(L[II].FIELDX-3)+','+NR(L[II].FIELDY-3)+
'); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
IF L[II].OBJ[I].TYP=4 THEN BEGIN
- L[II].OBJ[I].X1:=INPUTINT('ENTER X',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-4);
- L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-4);
- L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE',S,0,
- MIN(L[II].FIELDY-4,L[II].FIELDX-4)SHR 2,MIN(L[II].FIELDY-4,L[II].FIELDX-4)SHR 1);
+ L[II].OBJ[I].X1:=INPUTINT('ENTER X',S+
+ ' DO NOT MAKE CIRCLES LEFT OF THE SCREEN!',0,(L[II].FIELDX-1)SHR 1,255);
+ L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S+
+ ' DON''T TRY Y<0: MIGHT CRASH CALC!!!',0,(L[II].FIELDY-1)SHR 1,255);
+ L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE',S,3,
+ MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 2,MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 1);
L[II].OBJ[I].Y2:=0;
END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
- IF L[II].OBJ[I].TYP=3THEN I4:=4 ELSE I4:=3;
+ IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
L[II].OBJ[I].X1:=INPUTINT('ENTER X1',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
L[II].OBJ[I].Y1:=INPUTINT('ENTER Y1',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-I4);
L[II].OBJ[I].X2:=INPUTINT('ENTER X2',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
END; {NORMAL OBJECT}
END; {TYPE}
2:BEGIN
- S:='SCREEN=(0,0)-('+NR(L[II].FIELDX-2)+','+NR(L[II].FIELDY-2)+
+ S:='SCREEN=(2,2)-('+NR(L[II].FIELDX-3)+','+NR(L[II].FIELDY-3)+
'); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
IF L[II].OBJ[I].TYP=4 THEN BEGIN
- L[II].OBJ[I].X1:=INPUTINT('ENTER X',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-3);
- L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-3);
+ L[II].OBJ[I].X1:=INPUTINT('ENTER X',S+
+ ' BE CAREFUL DRAWING OFF-SCREEN!',0,L[II].OBJ[I].X1,255);
+ L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S,0,L[II].OBJ[I].Y1,255);
END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
- IF L[II].OBJ[I].TYP=3THEN I4:=4 ELSE I4:=3;
- L[II].OBJ[I].X1:=INPUTINT('ENTER BEGIN X',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
- L[II].OBJ[I].Y1:=INPUTINT('ENTER BEGIN Y',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-I4);
IF L[II].OBJ[I].TYP=3THEN
- L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2+(I4-L[II].OBJ[I].Y1);
+ L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2+L[II].OBJ[I].Y1-3;
+ IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
+ L[II].OBJ[I].X1:=INPUTINT('ENTER BEGIN X',S,2,L[II].OBJ[I].X1,L[II].FIELDX-I4);
+ L[II].OBJ[I].Y1:=INPUTINT('ENTER BEGIN Y',S,2,L[II].OBJ[I].Y1,L[II].FIELDY-I4);
+ IF L[II].OBJ[I].TYP=3THEN
+ L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1+3;
END; {NORMAL OBJECT}
END; {BEGIN}
3:BEGIN
IF L[II].OBJ[I].TYP=4 THEN BEGIN
- L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE','r',0,
- MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 2,MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 1);
+ L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE','CROSSING BOUNDARIES NOT CHECKED',
+ 3,L[II].OBJ[I].X2,255{L[II].FIELDX-3)SHR 1});
L[II].OBJ[I].Y2:=0;
END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
S:='SCREEN=(0,0)-('+NR(L[II].FIELDX-2)+','+NR(L[II].FIELDY-2)+
'); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
- IF L[II].OBJ[I].TYP=3THEN I4:=4 ELSE I4:=3;
- L[II].OBJ[I].X2:=INPUTINT('ENTER END X',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
- L[II].OBJ[I].Y2:=INPUTINT('ENTER END Y',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-I4);
+ IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
+ L[II].OBJ[I].X2:=INPUTINT('ENTER END X',S,2,L[II].OBJ[I].X2,L[II].FIELDX-I4);
+ L[II].OBJ[I].Y2:=INPUTINT('ENTER END Y',S,2,L[II].OBJ[I].Y2,L[II].FIELDY-I4);
IF L[II].OBJ[I].TYP=3THEN BEGIN
IF L[II].OBJ[I].Y2<L[II].OBJ[I].Y1 THEN BEGIN
I4:=L[II].OBJ[I].Y2; L[II].OBJ[I].Y2:=L[II].OBJ[I].Y1;
END; {NORMAL OBJECT}
END; {END}
4:DISPMAP(I);
+ 5:BEGIN
+ L[II].OBJ[I].TYP:=-L[II].OBJ[I].TYP;
+ END; {DISABLE/ENABLE}
END; {HANDLE}
UNTIL III=-1; III:=0;
END; {EDITOBJ}
WRITELN('(',L[II].W[III].X,',',L[II].W[III].Y,')');
END; {WORMS}
- IF III=4THEN III:=EDITMENU(8,0)ELSE III:=EDITMENU(2,0);
+ IF III=4THEN III:=EDITMENU(8,4)ELSE III:=EDITMENU(2,4);
CASE(III+1)OF
2,4,6,8:BEGIN
- I:=INPUTINT('ENTER WORM #'+NR(III SHR 1)+' STARTING DIRECTION',
- '0=DOWN; 64=RIGHT; 128=UP; 192=LEFT',0,L[II].W[III SHR 1].D,255);
- L[II].W[III SHR 1].D:=I;
+ I:=INPUTINT('ENTER WORM #'+NR(III SHR 1+1)+' STARTING DIRECTION',
+ '0=DOWN; 64=RIGHT; 128=UP; 192=LEFT',0,L[II].W[III SHR 1+1].D,255);
+ L[II].W[III SHR 1+1].D:=I;
END; {DIR}
3,5,7,9:BEGIN
I:=INPUTINT('ENTER WORM #'+NR(III SHR 1)+' BEGIN X-POSITION',
IF L[II].FIELDX<128THEN BEGIN
INC(L[II].NROBJ); L[II].OBJ[L[II].NROBJ].X1:=L[II].FIELDX;
L[II].OBJ[L[II].NROBJ].Y2:=255; L[II].OBJ[L[II].NROBJ].TYP:=3;
- L[II].OBJ[L[II].NROBJ].X2:=255; L[II].OBJ[L[II].NROBJ].Y1:=0;
+ L[II].OBJ[L[II].NROBJ].X2:=127; L[II].OBJ[L[II].NROBJ].Y1:=0;
END; {PUT BAR}
L[II].FIELDY:=INPUTINT('ENTER FIELD HEIGHT','57=ONE SCREEN; MORE WILL SCROLL THE SCREEN',5,L[II].FIELDY,255);
IF L[II].FIELDY<57THEN BEGIN
WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT LEVEL');
IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
WRITE('2'); TEXTCOLOR(7); WRITELN(': COPY LEVEL');
- IF B.LTOTAL>0THEN TEXTCOLOR(7)ELSE TEXTCOLOR(7);
+ IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
WRITE('3'); TEXTCOLOR(7); WRITELN(': MOVE LEVEL');
IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
WRITE('4'); TEXTCOLOR(7); WRITELN(': DELETE LEVEL');
TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7); WRITELN(': CREATE SINGLEPLAYER LEVEL');
TEXTCOLOR(14); WRITE('6'); TEXTCOLOR(7); WRITELN(': CREATE MULTIPLAYER LEVEL');
TEXTCOLOR(7); WRITE('7'); TEXTCOLOR(7); WRITELN(': CREATE CTF LEVEL');
- TEXTCOLOR(7); WRITELN; III:=EDITMENU(6,0);
+ TEXTCOLOR(7); WRITELN; III:=EDITMENU(6,5);
CASE III OF
1:IF B.LTOTAL>0THEN BEGIN
L[II].NAME:='Copy of '+L[II].NAME;
END; {>0}
END; {COPY}
+ 3:IF B.LTOTAL>0THEN BEGIN
+ I:=INPUTINT('MOVE WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
+ IF II<>0THEN BEGIN
+ II:=INPUTINT('NEW LEVEL NUMBER','ENTER 0 TO CANCEL',0,0,B.LTOTAL);
+ IF((I<=B.LSINGLE)AND(II<=B.LSINGLE))
+ OR((I>B.LSINGLE)AND(II>B.LSINGLE))THEN BEGIN
+ LTEMP:=L[I]; IF II>I THEN FOR I4:=I TO II-1DO L[I4]:=L[I4+1]
+ ELSE FOR I4:=I DOWNTO II+1DO L[I4]:=L[I4-1];
+ L[II]:=LTEMP;
+ END; {CONFIRMED}
+ END; {}
+ END; {MOVE}
4:IF B.LTOTAL>0THEN BEGIN
II:=INPUTINT('DELETE WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
IF II<>0THEN BEGIN
PROCEDURE FILECOMP;
VAR ISTACK:WORD;
+PROCEDURE SAVELEVEL(SAVEWORMS:BYTE);
+BEGIN
+ BLOCKWRITE(FF,L[II].PEAS,1);
+ BLOCKWRITE(FF,L[II].DELAY,1);
+ BLOCKWRITE(FF,L[II].GROWTH,1);
+ BLOCKWRITE(FF,L[II].BSIZE,1);
+ BLOCKWRITE(FF,L[II].SPRSIZE,1);
+ BLOCKWRITE(FF,L[II].SPRITE,L[II].SPRSIZE);
+ BLOCKWRITE(FF,L[II].NRBALLS,1);
+ BLOCKWRITE(FF,L[II].BALLS,L[II].NRBALLS*3);
+ BLOCKWRITE(FF,L[II].W[1].D,3*SAVEWORMS); {D,X,Y}
+ BLOCKWRITE(FF,L[II].FIELDX,2); {FIELDX,FIELDY}
+ FOR I:=1TO L[II].NROBJ DO BEGIN
+ IF L[II].OBJ[I].TYP>0THEN BEGIN
+ BLOCKWRITE(FF,L[II].OBJ[I].TYP,4);
+ IF(L[II].OBJ[I].TYP=3)AND(L[II].OBJ[I].Y2+L[II].OBJ[I].Y1=255)THEN BEGIN
+ I4:=MAX(57,L[II].FIELDY)-L[II].OBJ[I].Y1; BLOCKWRITE(FF,I4,1);
+ END {OFFSCREEN} ELSE BLOCKWRITE(FF,L[II].OBJ[I].Y2,1);
+ END; {VALID}
+ END; {OBJS}
+ I:=0; BLOCKWRITE(FF,I,1); {LVL END}
+END; {COMMONSAVELEVEL}
BEGIN
ASSIGN(FF,FILENAME+'.86S'); REWRITE(FF,1);
BLOCKWRITE(FF,HEAD86S[1],ORD(HEAD86S[0])); {86S-HEADER}
- ISTACK:=$12+6+B.SPRSIZE+ORD(B.NAME[0])+24+2+
- 2*(1+(B.LTO[2]-B.LFROM[2])+(B.LTO[3]-B.LFROM[3]));
- FOR II:=B.LFROM[1]TO B.LTOTAL DO INC(ISTACK,L[II].SIZE);
- BLOCKWRITE(FF,ISTACK,2); {FILE LENGTH (x+$12)}
+ ISTACK:=COMPSIZE; BLOCKWRITE(FF,ISTACK,2); {FILE LENGTH (x+$12)}
I:=$000C; BLOCKWRITE(FF,I,2); {STRING ID}
DEC(ISTACK,$10); BLOCKWRITE(FF,ISTACK,2); {DATA LENGTH (x+2)}
I:=$080C; BLOCKWRITE(FF,I,2); {STRING ID}
- S:='wormlvl1'; BLOCKWRITE(FF,S[1],8); {PRGNAME}
+ S:=LOCS(FILENAME); BLOCKWRITE(FF,S[1],8); {PRGNAME}
BLOCKWRITE(FF,ISTACK,2); {DATA LENGTH (x+2)}
DEC(ISTACK,2); BLOCKWRITE(FF,ISTACK,2); {PROG LENGTH (x)}
C:='w'; BLOCKWRITE(FF,C,1); {WORM ID}
I:=HEADVERSION; BLOCKWRITE(FF,I,1); {VERSION}
- BLOCKWRITE(FF,B.NAME[0],ORD(B.NAME[0])+1); {TITLE}
+ BLOCKWRITE(FF,B.NAME[1],ORD(B.NAME[0])); {TITLE}
+ I:=0; BLOCKWRITE(FF,I,1); {STRING TERMINATOR #0}
I:=1+B.SPRSIZE+2; FOR II:=B.LFROM[1]TO B.LTOTAL DO I:=I+L[II].SIZE;
BLOCKWRITE(FF,I,2); {SIZE}
BLOCKWRITE(FF,B.SPRSIZE,1);
BLOCKWRITE(FF,B.SPRITE,B.SPRSIZE);
- FOR II:=B.LFROM[1]TO B.LSINGLE DO BEGIN
- BLOCKWRITE(FF,L[II].PEAS,1);
- BLOCKWRITE(FF,L[II].DELAY,1);
- BLOCKWRITE(FF,L[II].GROWTH,1);
- BLOCKWRITE(FF,L[II].BSIZE,1);
- BLOCKWRITE(FF,L[II].SPRSIZE,1);
- BLOCKWRITE(FF,L[II].SPRITE,L[II].SPRSIZE);
- BLOCKWRITE(FF,L[II].NRBALLS,1);
- BLOCKWRITE(FF,L[II].BALLS,L[II].NRBALLS*3);
- BLOCKWRITE(FF,L[II].W[1].D,3); {D,X,Y}
- BLOCKWRITE(FF,L[II].FIELDX,2); {FIELDX,FIELDY}
- FOR I:=1TO L[II].NROBJ DO BEGIN
- BLOCKWRITE(FF,L[II].OBJ[I].TYP,5);
- END; {OBJS}
- I:=0; BLOCKWRITE(FF,I,1); {LVL END}
- END; {LEVELS SINGLEPL}
-
+ FOR II:=B.LFROM[1]TO B.LSINGLE DO SAVELEVEL(1); {LEVELS SINGLEPL}
I:=255; BLOCKWRITE(FF,I,1); {END}
I:=$C9; BLOCKWRITE(FF,I,1); {RET}
- FOR II:=B.LSINGLE+1TO B.LSINGLE+B.LMULTI DO BEGIN
- BLOCKWRITE(FF,L[II].PEAS,1);
- BLOCKWRITE(FF,L[II].DELAY,1);
- BLOCKWRITE(FF,L[II].GROWTH,1);
- BLOCKWRITE(FF,L[II].BSIZE,1);
- BLOCKWRITE(FF,L[II].SPRSIZE,1);
- BLOCKWRITE(FF,L[II].SPRITE,L[II].SPRSIZE);
- BLOCKWRITE(FF,L[II].NRBALLS,1);
- BLOCKWRITE(FF,L[II].BALLS,L[II].NRBALLS*3);
- BLOCKWRITE(FF,L[II].W[1].D,3*4); {D,X,Y}
- BLOCKWRITE(FF,L[II].FIELDX,2); {FIELDX,FIELDY}
- FOR I:=1TO L[II].NROBJ DO BEGIN
- BLOCKWRITE(FF,L[II].OBJ[I].TYP,5);
- END; {OBJS}
- I:=0; BLOCKWRITE(FF,I,1); {LVL END}
- END; {LEVELS MULTIPL}
-
- I:=0; FOR II:=1TO 1+(B.LTO[2]-B.LFROM[2])+(B.LTO[3]-B.LFROM[3])DO
- BLOCKWRITE(FF,I,2); {HI}
+ FOR II:=B.LSINGLE+1TO B.LSINGLE+B.LMULTI DO SAVELEVEL(4); {LEVELS MULTIPL}
+
+ I:=0; I2:=1; IF B.LFROM[2]>0THEN I2:=I2+1+B.LTO[2]-B.LFROM[2];
+ IF B.LFROM[3]>0THEN I2:=I2+1+B.LTO[3]-B.LFROM[3];
+ FOR II:=1TO I2 DO BLOCKWRITE(FF,I,2); {HI}
SEEK(FF,$37); I2:=0; I:=0;
REPEAT INC(I,I2); BLOCKREAD(FF,I2,1,ISTACK); UNTIL ISTACK<>1;