9 SPRITE:ARRAY[1..8]OF BYTE;
11 BALLS:ARRAY[1..32]OF RECORD
12 Y,X,D:BYTE; {Z:%00=right+down, %11=left+up}
14 W:ARRAY[1..4]OF RECORD
21 OBJ:ARRAY[1..32]OF RECORD
22 TYP:SHORTINT;X1,Y1,X2,Y2:BYTE;
26 CONST GAMETYPE:ARRAY[1..8]OF STRING[12] =
27 ('SINGLEPLAYER','PEAWORM','TRON','DEATHMATCH',
28 'FOODMATCH','LINKPLAY','RACE','CTF');
30 OBJTYPE:ARRAY[0..4]OF STRING[8] =
31 ('NONE','LINE','FAT LINE','BAR','CIRCLE');
33 ENDTYPE:ARRAY[0..1]OF STRING[8] =
37 ('**TI86**'+#$1A+#$A+#0+ {HEADER}
38 'Levelfile for Worm 0�94 made with WormEdit'); {COMMENT}
40 HEADEDIT = ('WormEdit�94'+#0+'LVL');
44 HEAD:ARRAY[1..15]OF CHAR;
47 LSINGLE,LMULTI,LCTF,LTOTAL:BYTE;
48 LFROM:ARRAY[1..8]OF BYTE;
49 LTO:ARRAY[1..8]OF BYTE;
51 SPRITE:ARRAY[1..8]OF BYTE;
54 HINAME:ARRAY[1..3]OF CHAR;
58 NAME:'Custom Worm Level';
59 LSINGLE:0; LMULTI:0; LCTF:0; LTOTAL:0;
60 LFROM:(0,0,0,0,0,0,0,0);
61 LTO:(0,0,0,0,0,0,0,0);
63 SPRITE:(6*16,15*16,15*16,6*16,0,0,0,0);
81 L:ARRAY[1..64]OF ONELEVEL;
89 SETTEXT; WINDOW(1,1,80,25); {TEXTBACKGROUND(0);} CLRSCR;
90 TEXTCOLOR(1); WRITE('���������������������������<');
91 TEXTCOLOR(14); WRITE(' WormEdit � ');
92 TEXTCOLOR(15); WRITE(' by SHIAR ');
93 TEXTCOLOR(1); WRITE('>�����������������������������');
94 WINDOW(41,2,41,25); TEXTCOLOR(7); TEXTBACKGROUND(0); WRITE(CC('�',23));
95 WINDOW(1,25,80,25); TEXTBACKGROUND(1); CLRSCR;
96 GOTOXY(75,1); TEXTCOLOR(0); WRITE('v0.94'); TEXTBACKGROUND(0);
99 PROCEDURE CIRCLE(X,Y,Z,COL:BYTE);
100 VAR XX,YY,ZZ:INTEGER;
102 XX:=-1; YY:=Z; ZZ:=-Z;
105 LINE(X-XX,Y+YY,X+XX,Y+YY,COL,VGA);
106 LINE(X-XX,Y-YY,X+XX,Y-YY,COL,VGA);
107 LINE(X-YY,Y+XX,X+YY,Y+XX,COL,VGA);
108 LINE(X-YY,Y-XX,X+YY,Y-XX,COL,VGA);
109 IF ZZ>=0THEN BEGIN ZZ:=ZZ-(YY SHL 1)+2; DEC(YY); END;
114 PROCEDURE DISPMAP(OBJ:INTEGER);
116 PROCEDURE DISPOBJ(OBJ:INTEGER;COL:BYTE);
119 CASE L[II].OBJ[OBJ].TYP OF
120 1:LINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2,COL,VGA);
122 LINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2,COL,VGA);
123 LINE(L[II].OBJ[OBJ].X1+1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2+1,L[II].OBJ[OBJ].Y2,COL,VGA);
124 LINE(L[II].OBJ[OBJ].X1+1,L[II].OBJ[OBJ].Y1+1,L[II].OBJ[OBJ].X2+1,L[II].OBJ[OBJ].Y2+1,COL,VGA);
125 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);
128 FOR Y:=L[II].OBJ[OBJ].Y1 TO L[II].OBJ[OBJ].Y1+L[II].OBJ[OBJ].Y2-1DO
129 LINE(L[II].OBJ[OBJ].X1,MIN(Y,191),L[II].OBJ[OBJ].X2,MIN(Y,191),COL,VGA);
131 4:CIRCLE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,COL);
136 LINE(0,56,255,56,8,VGA); LINE(0,113,255,113,8,VGA);
137 LINE(0,170,255,170,8,VGA); {LINE(0,227,255,227,8,VGA);}
138 LINE(127,0,127,170,8,VGA); LINE(255,0,255,170,8,VGA);
139 LINE(0,0,255,0,15,VGA); LINE(0,1,255,1,15,VGA);
140 LINE(0,2,0,190-3,15,VGA); LINE(1,2,1,190-3,15,VGA);
141 LINE(L[II].FIELDX-2,2,L[II].FIELDX-2,L[II].FIELDY-1,15,VGA);
142 LINE(L[II].FIELDX-1,2,L[II].FIELDX-1,L[II].FIELDY-1,15,VGA);
143 LINE(0,L[II].FIELDY-2,L[II].FIELDX-1,L[II].FIELDY-2,15,VGA);
144 LINE(0,L[II].FIELDY-1,L[II].FIELDX-1,L[II].FIELDY-1,15,VGA);
145 FOR OBJ2:=1TO L[II].NROBJ DO IF OBJ2<>OBJ THEN DISPOBJ(OBJ2,7);
146 IF(OBJ>0)AND(OBJ<=L[II].NROBJ)THEN DISPOBJ(OBJ,14);
147 REPEAT UNTIL READKEY<>#0;
151 FUNCTION NR(VALUE:LONGINT):STRING;
154 STR(VALUE,NRSTR); NR:=NRSTR;
157 PROCEDURE HELPBAR(HELPPAGE:BYTE);
160 IF HELPPAGE=0THEN BEGIN
161 TEXTCOLOR(7); WRITE('�'); WINDOW(42,14,80,24); CLRSCR; EXIT;
163 TEXTBACKGROUND(1); TEXTCOLOR(7); WRITE('�'); TEXTCOLOR(15);
164 WRITE('HELP',' ':39-4); WINDOW(42,15,80,24); TEXTBACKGROUND(0); TEXTCOLOR(7);
165 CLRSCR; CASE HELPPAGE OF
166 1:WRITE('PRESS <F1> OR <H> FOR HELP');
167 2:WRITE('YOU UNDERSTAND EVERYTHING');
168 3:WRITE('THIS AIN''T A BUG, IT A FEATURE!');
169 4:WRITE('ALL YOUR WORMS ARE BELONG TO US!');
170 5:WRITE('PRESS UP AND DOWN TO VIEW ALL LEVELS');
171 END; {TEXT TO DISPLAY}
174 PROCEDURE DISPLEVELS;
176 WINDOW(42,3,80,13); TEXTCOLOR(7); TEXTBACKGROUND(0); CLRSCR;
177 IF B.LTOTAL<1THEN WRITELN('NONE PRESENT')ELSE
178 FOR II:=LVLPOS TO MIN(B.LTOTAL,LVLPOS+9)DO BEGIN
179 IF LVLDISP=1THEN WRITE(II) {CONTINOUS}
180 ELSE IF II>B.LSINGLE THEN WRITE(II-B.LSINGLE)ELSE WRITE(II); {SEPERATE}
181 TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7);
185 FUNCTION EDITMENU(EDITMENUMAX,HELPPAGE:BYTE):SHORTINT;
189 WINDOW(39,1,39,1); GOTOXY(1,1); REPEAT UNTIL KEYPRESSED; C:=READKEY;
190 IF C=' 'THEN EDITOK:=10 {10} ELSE
191 IF(C>='1')AND(C<=CHR(EDITMENUMAX+48))THEN EDITOK:=ORD(C)-48 {1..<=9} ELSE
192 IF(C=#27)OR(C='-')OR(C='+')THEN EDITOK:=-1 {EXIT} ELSE
193 IF UPCASE(C)='H'THEN HELPBAR(HELPPAGE) ELSE
194 IF C=#0THEN BEGIN C:=READKEY;
195 IF HELPPAGE=5THEN BEGIN
196 IF(C=#80)AND(LVLPOS<B.LTOTAL-9)THEN BEGIN INC(LVLPOS); DISPLEVELS; END {DOWN} ELSE
197 IF(C=#72)AND(LVLPOS>1)THEN BEGIN DEC(LVLPOS); DISPLEVELS; END {UP} ELSE
199 IF C=#59THEN HELPBAR(HELPPAGE);
201 UNTIL EDITOK<>0; EDITMENU:=EDITOK;
204 FUNCTION COMPSIZE:WORD;
206 I:=$32+B.SPRSIZE+ORD(B.NAME[0])+5;
207 IF B.LFROM[2]>0THEN I:=I+((1+B.LTO[2]-B.LFROM[2])*5);
208 IF B.LFROM[3]>0THEN I:=I+((1+B.LTO[3]-B.LFROM[3])*5);
209 FOR II:=1TO B.LTOTAL DO BEGIN
211 FOR I4:=1TO L[II].NROBJ DO IF L[II].OBJ[I4].TYP<=0THEN DEC(I,5);
216 PROCEDURE TITLEBAR(BAR:SHORTINT;TITLNAME:STRING);
218 HELPBAR(0); WINDOW(41,2,42,2);
219 IF BAR=0THEN TEXTBACKGROUND(0)ELSE TEXTBACKGROUND(1);
220 TEXTCOLOR(7); WRITE('�'); WINDOW(42,2,80,13); TEXTBACKGROUND(0); CLRSCR;
221 TEXTCOLOR(15); TEXTBACKGROUND(1);
224 WRITE('LEVELS',' ':39-6); LVLDISP:=1; DISPLEVELS;
227 WRITE('LEVEL OBJECTS',' ':39-13); TEXTCOLOR(7); TEXTBACKGROUND(0);
228 IF L[II].NROBJ<1THEN WRITELN('NONE')ELSE
229 FOR I4:=1TO L[II].NROBJ DO BEGIN
230 WRITE(I4); TEXTCOLOR(3);
231 IF L[II].OBJ[I4].TYP>0THEN BEGIN
232 WRITE(': ',OBJTYPE[L[II].OBJ[I4].TYP]);
233 WRITE(' (',L[II].OBJ[I4].X1,',',L[II].OBJ[I4].Y1,')-(');
234 CASE L[II].OBJ[I4].TYP OF
235 1,2:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y2,')');
236 3:WRITELN(L[II].OBJ[I4].X2,',',L[II].OBJ[I4].Y1+L[II].OBJ[I4].Y2,')');
237 4:WRITELN(L[II].OBJ[I4].X2,')');
239 END {ENABLED} ELSE WRITELN(': DISABLED'); TEXTCOLOR(7);
243 WRITE('LEVEL INFO',' ':39-10); TEXTCOLOR(7); TEXTBACKGROUND(0);
245 IF II>B.LSINGLE THEN WRITELN(' MP #',II-B.LSINGLE)ELSE WRITELN;
246 WRITELN('LEVEL SIZE: ',L[II].SIZE);
247 IF II<=B.LSINGLE THEN WRITELN('SINGLEPLAYER')ELSE FOR I:=2TO 7DO
248 IF(II-B.LSINGLE>=B.LFROM[I])AND(II-B.LSINGLE<=B.LTO[I])THEN
249 WRITELN(GAMETYPE[I]);
252 WRITE(FILENAME,'.LVL',' ':35-ORD(FILENAME[0])); TEXTCOLOR(7);
253 TEXTBACKGROUND(0); WRITE('FILE VERSION: '); TEXTCOLOR(3);
254 WRITELN(B.VERSION); TEXTCOLOR(7); WRITE('FILE SIZE: '); TEXTCOLOR(3);
255 WRITE(FILESIZE(F)SHR 10); TEXTCOLOR(7); WRITELN('kB');
256 WRITE('COMPILED: '); TEXTCOLOR(3); WRITE(COMPSIZE); TEXTCOLOR(7);
260 WRITE('LEVELS',' ':39-6); LVLDISP:=2; DISPLEVELS;
264 TEXTBACKGROUND(1); TEXTCOLOR(15); WRITE(TITLNAME,' ':40-ORD(TITLNAME[0]));
265 WINDOW(1,3,40,24); TEXTBACKGROUND(0); CLRSCR;
268 FUNCTION INPUTSTR(ISTR,ICOM,IDEF:STRING;IMAX:BYTE):STRING;
269 VAR IVAL:STRING; IOK:BOOLEAN;
272 TEXTBACKGROUND(1); TEXTCOLOR(15); WRITE('INPUT',' ':40-5);
273 WINDOW(1,15,40,24); TEXTBACKGROUND(0); CLRSCR;
275 TEXTCOLOR(7); WRITELN(ISTR); TEXTCOLOR(8); WRITELN(ICOM);
276 TEXTCOLOR(8); WRITELN('ENTER FOR DEFAULT:'); WRITELN(IDEF);
277 TEXTCOLOR(7); WRITE('> '); READLN(IVAL);
278 IF IVAL=''THEN IVAL:=IDEF;
279 IOK:=FALSE; IF ORD(IVAL[0])<=IMAX THEN IOK:=TRUE
280 ELSE BEGIN CLRSCR; WRITELN('OH NO, THAT''S TOO MUCH!'); END; {TOOLONG}
281 UNTIL IOK; INPUTSTR:=IVAL;
284 FUNCTION INPUTINT(ISTR,ICOM:STRING;IMIN,IDEF,IMAX:INTEGER):INTEGER;
285 FUNCTION READ:INTEGER;
286 VAR REI1:INTEGER; REI2:BYTE;
287 BEGIN {INPUTS POSITIVE INTEGER VALUE FROM KEYBOARD}
288 REI1:=0; {VALUE} REI2:=0; {SIZE}
290 REPEAT C:=READKEY; UNTIL C<>'';
292 #8,'+','-':IF REI2>0THEN BEGIN
293 REI1:=REI1 DIV 10; DEC(REI2); WRITE(#8+' '+#8);
295 '0'..'9':IF REI2<4THEN BEGIN
296 REI1:=REI1*10+ORD(C)-48; INC(REI2); WRITE(C);
298 #13:IF REI2=0THEN REI1:=-1; {ENTER}
300 UNTIL C=#13; {UNTIL ENTER PRESSED}
303 VAR IVAL:INTEGER; IOK:BOOLEAN;
306 TEXTBACKGROUND(1); TEXTCOLOR(15); WRITE('INPUT',' ':40-5);
307 WINDOW(1,15,40,24); TEXTBACKGROUND(0); CLRSCR;
309 TEXTCOLOR(7); WRITELN(ISTR); TEXTCOLOR(8); WRITELN(ICOM);
310 TEXTCOLOR(8); WRITE('(RANGE '); TEXTCOLOR(7); WRITE(IMIN); TEXTCOLOR(8);
311 WRITE(' TO '); TEXTCOLOR(7); WRITE(IMAX); TEXTCOLOR(8);
312 WRITE('; DEFAULT VALUE '); TEXTCOLOR(7); WRITE(IDEF); TEXTCOLOR(8);
313 WRITELN(')'); TEXTCOLOR(7); WRITE('> '); IVAL:=READ; IF IVAL=-1THEN IVAL:=IDEF;
314 IOK:=FALSE; IF(IVAL>=IMIN)AND(IVAL<=IMAX)THEN IOK:=TRUE
315 ELSE BEGIN CLRSCR; WRITELN('OUT OF RANGE!'); END; {OUTOFRANGE}
316 UNTIL IOK; INPUTINT:=IVAL;
320 LABEL EDITGAME1,EDITGAME2;
323 TITLEBAR(5,'EDIT GAMETYPES'); TEXTCOLOR(14); WRITE('1');
324 TEXTCOLOR(7); WRITE(': SINGLEPLAYER ');
325 TEXTCOLOR(3); IF B.LSINGLE=0THEN WRITELN('(NO LEVELS)')
326 ELSE WRITELN('(',B.LTO[1]-B.LFROM[1]+1,' OF ',B.LSINGLE,')');
327 FOR II:=2TO 7DO BEGIN
328 TEXTCOLOR(14); WRITE(II); TEXTCOLOR(7); WRITE(': '+GAMETYPE[II],' ');
329 TEXTCOLOR(3); IF B.LFROM[II]=0THEN WRITELN('(NO LEVELS)')
330 ELSE WRITELN('(',B.LFROM[II],'-',B.LTO[II],')');
332 TEXTCOLOR(7); WRITE('8: CTF '); TEXTCOLOR(3);
333 IF B.LCTF=0THEN WRITE('(NO LEVELS)')ELSE WRITE('(',B.LCTF,')');
337 B.LFROM[1]:=INPUTINT('ENTER LEVELS TO SKIP','USE THIS TO TEMPORARILY REMOVE THE FIRSTFEW LEVELS',
338 0,0,B.LSINGLE-1); INC(B.LFROM[1]);
339 B.LTO[1]:=INPUTINT('ENTER LEVELS SELECTABLE','THE HIGHEST LEVEL SOMEONE CAN START IN WITHOUT PLAYING IT EARLIER',
340 1,1,B.LSINGLE+1-B.LFROM[1]); B.LTO[1]:=B.LTO[1]+B.LFROM[1]-1;
341 END {SINGLEPLAYER} ELSE IF III>0THEN BEGIN
342 B.LFROM[III]:=INPUTINT('ENTER NEW STARTING LEVEL',
343 'THAT LEVEL WILL BE LEVEL #1 IN GAMEMODE '+GAMETYPE[III]+'. 0=NO LEVELS',0,1,B.LMULTI);
344 IF B.LFROM[III]>0THEN
345 B.LTO[III]:=INPUTINT('ENTER LAST LEVEL NUMBER',NR(B.LMULTI)+' LEVELS PRESENT',
346 B.LFROM[III],B.LMULTI,B.LMULTI);
348 UNTIL III=-1; III:=0;
355 TITLEBAR(2,'EDIT OBJECT #'+NR(I)+' IN LEVEL '+NR(II));
356 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': OBJECT TYPE ');
357 III:=L[II].OBJ[I].TYP; TEXTCOLOR(3); WRITELN('(',ABS(III),')');
359 IF L[II].OBJ[I].TYP>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7); WRITE('2'); TEXTCOLOR(7);
360 IF ABS(L[II].OBJ[I].TYP)=4THEN WRITE(': OBJECT POSITION ')ELSE WRITE(': OBJECT BEGIN');
361 IF L[II].OBJ[I].TYP>0THEN BEGIN
362 TEXTCOLOR(3); WRITELN(' (',L[II].OBJ[I].X1,',',L[II].OBJ[I].Y1,')');
363 END {PRESENT} ELSE WRITELN;
364 IF L[II].OBJ[I].TYP>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7); WRITE('3'); TEXTCOLOR(7);
365 IF ABS(L[II].OBJ[I].TYP)=4THEN WRITE(': OBJECT SIZE ')ELSE WRITE(': OBJECT END ');
366 TEXTCOLOR(3); CASE L[II].OBJ[I].TYP OF
367 3:WRITELN('(',L[II].OBJ[I].X2,',',L[II].OBJ[I].Y1+L[II].OBJ[I].Y2,')');
368 4:WRITELN('(',L[II].OBJ[I].X2,')');
369 1..10:WRITELN('(',L[II].OBJ[I].X2,',',L[II].OBJ[I].Y2,')');
372 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITELN(': PREVIEW');
373 TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7);
374 IF L[II].OBJ[I].TYP<0THEN WRITE(': ENABLE')ELSE WRITE(': DISABLE');
375 END; {OBJECT PROPERTIES}
377 IF III<>0THEN III:=EDITMENU(5,0)ELSE III:=EDITMENU(1,0);
380 S:=''; FOR I4:=0TO 4DO S:=S+NR(I4)+': '+OBJTYPE[I4]+CC(' ',37-ORD(OBJTYPE[I4,0]));
381 L[II].OBJ[I].TYP:=INPUTINT('ENTER OBJECT TYPE',S,0,0,4);
382 S:='SCREEN=(2,2)-('+NR(L[II].FIELDX-3)+','+NR(L[II].FIELDY-3)+
383 '); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
384 IF L[II].OBJ[I].TYP=4 THEN BEGIN
385 L[II].OBJ[I].X1:=INPUTINT('ENTER X',S+
386 ' DO NOT MAKE CIRCLES LEFT OF THE SCREEN!',0,(L[II].FIELDX-1)SHR 1,255);
387 L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S+
388 ' DON''T TRY Y<0: MIGHT CRASH CALC!!!',0,(L[II].FIELDY-1)SHR 1,255);
389 L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE',S,3,
390 MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 2,MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 1);
392 END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
393 IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
394 L[II].OBJ[I].X1:=INPUTINT('ENTER X1',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
395 L[II].OBJ[I].Y1:=INPUTINT('ENTER Y1',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-I4);
396 L[II].OBJ[I].X2:=INPUTINT('ENTER X2',S,2,(L[II].FIELDX-1)SHR 1,L[II].FIELDX-I4);
397 L[II].OBJ[I].Y2:=INPUTINT('ENTER Y2',S,2,(L[II].FIELDY-1)SHR 1,L[II].FIELDY-I4);
398 IF L[II].OBJ[I].TYP=3THEN BEGIN
399 IF L[II].OBJ[I].Y2<L[II].OBJ[I].Y1 THEN BEGIN
400 I4:=L[II].OBJ[I].Y2; L[II].OBJ[I].Y2:=L[II].OBJ[I].Y1;
402 END; {END BEFORE START}
403 L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1;
408 S:='SCREEN=(2,2)-('+NR(L[II].FIELDX-3)+','+NR(L[II].FIELDY-3)+
409 '); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
410 IF L[II].OBJ[I].TYP=4 THEN BEGIN
411 L[II].OBJ[I].X1:=INPUTINT('ENTER X',S+
412 ' BE CAREFUL DRAWING OFF-SCREEN!',0,L[II].OBJ[I].X1,255);
413 L[II].OBJ[I].Y1:=INPUTINT('ENTER Y',S,0,L[II].OBJ[I].Y1,255);
414 END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
415 IF L[II].OBJ[I].TYP=3THEN
416 L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2+L[II].OBJ[I].Y1-3;
417 IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
418 L[II].OBJ[I].X1:=INPUTINT('ENTER BEGIN X',S,2,L[II].OBJ[I].X1,L[II].FIELDX-I4);
419 L[II].OBJ[I].Y1:=INPUTINT('ENTER BEGIN Y',S,2,L[II].OBJ[I].Y1,L[II].FIELDY-I4);
420 IF L[II].OBJ[I].TYP=3THEN
421 L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1+3;
425 IF L[II].OBJ[I].TYP=4 THEN BEGIN
426 L[II].OBJ[I].X2:=INPUTINT('ENTER SIZE','CROSSING BOUNDARIES NOT CHECKED',
427 3,L[II].OBJ[I].X2,255{L[II].FIELDX-3)SHR 1});
429 END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
430 S:='SCREEN=(0,0)-('+NR(L[II].FIELDX-2)+','+NR(L[II].FIELDY-2)+
431 '); CENTER=('+NR((L[II].FIELDX-1)SHR 1)+','+NR((L[II].FIELDY-1)SHR 1)+')';
432 IF(L[II].OBJ[I].TYP=1)OR(L[II].OBJ[I].TYP=3)THEN I4:=2 ELSE I4:=3;
433 L[II].OBJ[I].X2:=INPUTINT('ENTER END X',S,2,L[II].OBJ[I].X2,L[II].FIELDX-I4);
434 L[II].OBJ[I].Y2:=INPUTINT('ENTER END Y',S,2,L[II].OBJ[I].Y2,L[II].FIELDY-I4);
435 IF L[II].OBJ[I].TYP=3THEN BEGIN
436 IF L[II].OBJ[I].Y2<L[II].OBJ[I].Y1 THEN BEGIN
437 I4:=L[II].OBJ[I].Y2; L[II].OBJ[I].Y2:=L[II].OBJ[I].Y1;
439 END; {END BEFORE START}
440 L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1;
446 L[II].OBJ[I].TYP:=-L[II].OBJ[I].TYP;
447 END; {DISABLE/ENABLE}
449 UNTIL III=-1; III:=0;
453 LABEL EDITOBJS1,EDITOBJS2;
456 TITLEBAR(2,'EDIT LEVEL OBJECTS');
457 IF L[II].NROBJ>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
458 WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT OBJECT');
459 IF L[II].NROBJ>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
460 WRITE('2'); TEXTCOLOR(7); WRITELN(': DELETE OBJECT');
461 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITELN(': CREATE OBJECT');
462 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': VIEW OBJECT');
466 1:IF L[II].NROBJ>0THEN BEGIN
467 I:=INPUTINT('EDIT WHICH OBJECT','',1,1,L[II].NROBJ);
470 2:IF L[II].NROBJ>0THEN BEGIN
471 I:=INPUTINT('DELETE WHICH OBJECT','0=CANCEL',0,0,L[II].NROBJ);
473 I4:=INPUTINT('PLEASE CONFIRM OBJECT TO *REMOVE*','ENTER 0 TO CANCEL',0,0,L[II].NROBJ);
475 DEC(L[II].NROBJ); FOR I:=I4 TO L[II].NROBJ DO L[II].OBJ[I]:=L[II].OBJ[I+1];
480 INC(L[II].NROBJ); I:=L[II].NROBJ; L[II].OBJ[I].TYP:=0; EDITOBJ;
483 I4:=INPUTINT('ENTER OBJECT TO HIGHLIGHT','0 FOR NONE',0,0,L[II].NROBJ);
487 UNTIL III=-1; III:=0;
490 FUNCTION BYTE2STR(SPRITE,SPRSIZE:BYTE):STRING;
491 VAR SPRTEMP:STRING[8];
495 FOR SPRTEMP2:=1TO 8-SPRSIZE DO SPRITE:=SPRITE SHR 1;
496 FOR SPRTEMP2:=9-SPRSIZE TO 8DO BEGIN
497 IF SPRITE MOD 2=1THEN SPRTEMP:='X'+SPRTEMP ELSE SPRTEMP:='�'+SPRTEMP;
498 SPRITE:=SPRITE SHR 1;
503 FUNCTION BYTE2BIN(BYI1:BYTE):LONGINT;
504 VAR BYI2:BYTE; BYI3:LONGINT;
507 FOR BYI2:=0TO 7DO BEGIN
508 IF BYI1 AND 1=1THEN BYI3:=BYI3+POW(10,BYI2);
514 FUNCTION STR2BYTE(SPRITE:STRING):BYTE;
515 VAR SPRTEMP,SPRTEMP2:BYTE;
517 SPRTEMP:=0; SPRTEMP2:=1;
518 FOR SPRTEMP2:=1TO LENGTH(SPRITE)DO
519 IF SPRITE[SPRTEMP2]='1'THEN INC(SPRTEMP,1SHL(8-SPRTEMP2));
526 TITLEBAR(0,'EDIT SPRITE');
527 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': SPRITE SIZE ');
528 TEXTCOLOR(3); IF L[II].SPRSIZE=0THEN WRITELN('(',B.SPRSIZE,')')
529 ELSE WRITELN('(',L[II].SPRSIZE,')');
530 IF L[II].SPRSIZE=0THEN BEGIN
531 TEXTCOLOR(7); WRITE('2: EDIT SPRITE'); TEXTCOLOR(3); WRITELN(' (DEFAULT)');
532 END {DEF SPR} ELSE FOR I:=1TO L[II].SPRSIZE DO BEGIN
533 TEXTCOLOR(14); WRITE(I+1); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3);
534 WRITELN(BYTE2STR(L[II].SPRITE[I],L[II].SPRSIZE));
537 III:=EDITMENU(1+L[II].SPRSIZE,0);
539 I:=INPUTINT('ENTER NEW SPRITE SIZE','MAXIMUM HEIGHT AND WIDTH; 0=DEFAULT',0,B.SPRSIZE,8);
540 IF I>L[II].SPRSIZE THEN FOR I4:=L[II].SPRSIZE+1TO I DO L[II].SPRITE[I4]:=0;
542 END {SIZE} ELSE IF III>1THEN BEGIN
543 S:=INPUTSTR('ENTER NEW LINE #'+NR(III-1)+' OF SPRITE','EXAMPLE: 100101 = X��X�X',
544 ZERO(BYTE2BIN(L[II].SPRITE[III-1]),8),8);
545 L[II].SPRITE[III-1]:=STR2BYTE(S);
547 UNTIL III=-1; III:=0;
550 PROCEDURE EDITBOUNCIES;
553 TITLEBAR(0,'EDIT BALLS IN LEVEL #'+NR(II));
554 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': CREATE BALL');
555 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITELN(': DELETE BALL');
556 FOR III:=1TO L[II].NRBALLS DO BEGIN
557 TEXTCOLOR(14); WRITE(III+2); TEXTCOLOR(7); WRITE(': BALL #',III,' (');
558 TEXTCOLOR(3); WRITE(L[II].BALLS[III].X); TEXTCOLOR(7); WRITE(',');
559 TEXTCOLOR(3); WRITE(L[II].BALLS[III].Y); TEXTCOLOR(7); WRITE(') DIR ');
560 TEXTCOLOR(3); WRITELN(L[II].BALLS[III].D);
563 III:=EDITMENU(2+L[II].NRBALLS,0);
566 L[II].BALLS[L[II].NRBALLS].X:=INPUTINT('ENTER X','WHERE THE BALL STARTS BOUNCING',0,63,255);
567 L[II].BALLS[L[II].NRBALLS].Y:=INPUTINT('ENTER Y','',0,27,255);
568 L[II].BALLS[L[II].NRBALLS].D:=INPUTINT('ENTER DIRECTION','0/1:DOWN; 2/3:UP; 1/3:RIGHT; 0/2:LEFT',0,0,3);
569 END {CREATE} ELSE IF III=2THEN BEGIN
570 III:=INPUTINT('ENTER THE BOUNCY BALL TO REMOVE','(0 CANCELS)',0,0,L[II].NRBALLS);
572 DEC(L[II].NRBALLS); FOR I4:=III TO L[II].NRBALLS DO L[II].BALLS[I4]:=L[II].BALLS[I4+1];
574 END {DELETE} ELSE IF III>0THEN BEGIN
575 L[II].BALLS[III-2].X:=INPUTINT('ENTER X','NOTE THE BOUNCY BALLS WILL PROBABLY BOLDLY GO SOME OTHER PLACE ANYWAY',
576 0,L[II].BALLS[III-2].X,255);
577 L[II].BALLS[III-2].Y:=INPUTINT('ENTER Y','',0,L[II].BALLS[III-2].Y,255);
578 L[II].BALLS[III-2].D:=INPUTINT('ENTER DIRECTION','0/1:DOWN; 2/3:UP; 1/3:RIGHT; 0/2:LEFT',0,L[II].BALLS[III-2].D,3);
580 UNTIL III=-1; III:=0;
586 TITLEBAR(0,'EDIT WORMS IN LEVEL #'+NR(II));
587 IF II>B.LSINGLE THEN III:=4 ELSE III:=1;
588 FOR III:=1TO III DO BEGIN
589 TEXTCOLOR(14); WRITE(III SHL 1-1); TEXTCOLOR(7);
590 WRITE(': WORM #',III,' DIRECTION '); TEXTCOLOR(3);
591 WRITELN('(',L[II].W[III].D,')');
592 TEXTCOLOR(14); WRITE(III SHL 1); TEXTCOLOR(7);
593 WRITE(': WORM #',III,' POSITION '); TEXTCOLOR(3);
594 WRITELN('(',L[II].W[III].X,',',L[II].W[III].Y,')');
597 IF III=4THEN III:=EDITMENU(8,4)ELSE III:=EDITMENU(2,4);
600 I:=INPUTINT('ENTER WORM #'+NR(III SHR 1+1)+' STARTING DIRECTION',
601 '0=DOWN; 64=RIGHT; 128=UP; 192=LEFT',0,L[II].W[III SHR 1+1].D,255);
602 L[II].W[III SHR 1+1].D:=I;
605 I:=INPUTINT('ENTER WORM #'+NR(III SHR 1)+' BEGIN X-POSITION',
606 'SCREEN = 2-'+NR(L[II].FIELDX-3)+'; CENTER = '+NR((L[II].FIELDX-1)SHR 1),
607 2,L[II].W[III SHR 1].X,L[II].FIELDX-3);
608 L[II].W[III SHR 1].X:=I;
609 I:=INPUTINT('ENTER WORM #'+NR(III SHR 1)+' BEGIN Y-POSITION',
610 'SCREEN = 2-'+NR(L[II].FIELDY-3)+'; CENTER = '+NR((L[II].FIELDY-1)SHR 1),
611 2,L[II].W[III SHR 1].Y,L[II].FIELDY-3);
612 L[II].W[III SHR 1].Y:=I;
615 UNTIL III=-1; III:=0;
621 L[II].SIZE:=12+L[II].NRBALLS*3+L[II].SPRSIZE+L[II].NROBJ*5;
622 IF II>B.LSINGLE THEN INC(L[II].SIZE,9);
623 TITLEBAR(3,'EDIT LEVEL #'+NR(II));
624 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': DESCRIPTION ');
625 TEXTCOLOR(3); WRITELN('(',L[II].NAME,')');
626 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': NUMBER OF PEAS ');
627 TEXTCOLOR(3); WRITELN('(',L[II].PEAS,')');
628 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITE(': GAME DELAY ');
629 TEXTCOLOR(3); WRITELN('(',L[II].DELAY,')');
630 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': GROWTH ');
631 TEXTCOLOR(3); WRITELN('(',L[II].GROWTH,'+',L[II].BSIZE,')');
632 TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7); WRITE(': SPRITE ');
633 TEXTCOLOR(3); IF L[II].SPRSIZE=0THEN WRITELN('(DEFAULT)')
634 ELSE WRITELN('(',L[II].SPRSIZE,')');
635 TEXTCOLOR(14); WRITE('6'); TEXTCOLOR(7); WRITE(': BOUNCY BALLS ');
636 TEXTCOLOR(3); WRITELN('(',L[II].NRBALLS,')');
637 TEXTCOLOR(14); WRITE('7'); TEXTCOLOR(7); WRITE(': WORMS '); TEXTCOLOR(3);
638 IF II>B.LSINGLE THEN BEGIN
639 WRITELN('(',L[II].W[1].D,';',L[II].W[2].D,';',L[II].W[3].D,';',L[II].W[4].D,')');
640 END {FOUR WORMS} ELSE
641 WRITELN('(',L[II].W[1].X,',',L[II].W[1].Y,':',L[II].W[1].D,')');
642 TEXTCOLOR(14); WRITE('8'); TEXTCOLOR(7); WRITE(': FIELD SIZE ');
643 TEXTCOLOR(3); WRITELN('(',L[II].FIELDX,',',L[II].FIELDY,')');
644 TEXTCOLOR(14); WRITE('9'); TEXTCOLOR(7); WRITE(': OBJECTS ');
645 TEXTCOLOR(3); WRITE('(',L[II].NROBJ,')');
649 1:L[II].NAME:=INPUTSTR('ENTER DESCRIPTION FOR THIS LEVEL',
650 'THIS WON''T BE DISPLAYED DURING THE GAME,IT''S JUST TO MAKE EDITING EASIER',L[II].NAME,22); {DESCR}
651 2:L[II].PEAS:=INPUTINT('ENTER TOTAL NUMBER OF PEAS','TOO MANY PEAS WILL MAKE A LEVEL BORING',1,L[II].PEAS,255);
652 3:L[II].DELAY:=INPUTINT('ENTER NEW DELAY','0=FASTEST; 4=AVERAGE; 10=SLOW',0,L[II].DELAY,255);
654 L[II].GROWTH:=INPUTINT('ENTER GROWTH PER PEA','0=NO GROWTH; 15=NORMAL',0,L[II].GROWTH,255);
655 L[II].BSIZE:=INPUTINT('ENTER WORM BEGIN SIZE','15=NORMAL; TOO SHORT WORMS WILL BE HARD TO PLAY WITH',
662 FOR III:=L[II].NROBJ DOWNTO 1DO
663 IF L[II].OBJ[III].Y2+L[II].OBJ[III].Y1=255THEN BEGIN
664 DEC(L[II].NROBJ); FOR I4:=III TO L[II].NROBJ DO L[II].OBJ[I4]:=L[II].OBJ[I4+1];
665 END; {REMOVE OLD BARS}
666 L[II].FIELDX:=INPUTINT('ENTER FIELD WIDTH','128=ONE SCREEN; MORE WILL SCROLL THE SCREEN',5,L[II].FIELDX,255);
667 IF L[II].FIELDX<128THEN BEGIN
668 INC(L[II].NROBJ); L[II].OBJ[L[II].NROBJ].X1:=L[II].FIELDX;
669 L[II].OBJ[L[II].NROBJ].Y2:=255; L[II].OBJ[L[II].NROBJ].TYP:=3;
670 L[II].OBJ[L[II].NROBJ].X2:=127; L[II].OBJ[L[II].NROBJ].Y1:=0;
672 L[II].FIELDY:=INPUTINT('ENTER FIELD HEIGHT','57=ONE SCREEN; MORE WILL SCROLL THE SCREEN',5,L[II].FIELDY,255);
673 IF L[II].FIELDY<57THEN BEGIN
674 INC(L[II].NROBJ); L[II].OBJ[L[II].NROBJ].X1:=2;
675 L[II].OBJ[L[II].NROBJ].Y2:=255-L[II].FIELDY;
676 L[II].OBJ[L[II].NROBJ].X2:=L[II].FIELDX-1; L[II].OBJ[L[II].NROBJ].TYP:=3;
677 L[II].OBJ[L[II].NROBJ].Y1:=L[II].FIELDY;
683 UNTIL III=-1; III:=0;
687 LABEL EDITHLVL1,EDITHLVL2;
690 TITLEBAR(1,'EDIT LEVELS');
691 IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
692 WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT LEVEL');
693 IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
694 WRITE('2'); TEXTCOLOR(7); WRITELN(': COPY LEVEL');
695 IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
696 WRITE('3'); TEXTCOLOR(7); WRITELN(': MOVE LEVEL');
697 IF B.LTOTAL>0THEN TEXTCOLOR(14)ELSE TEXTCOLOR(7);
698 WRITE('4'); TEXTCOLOR(7); WRITELN(': DELETE LEVEL');
699 TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7); WRITELN(': CREATE SINGLEPLAYER LEVEL');
700 TEXTCOLOR(14); WRITE('6'); TEXTCOLOR(7); WRITELN(': CREATE MULTIPLAYER LEVEL');
701 TEXTCOLOR(7); WRITE('7'); TEXTCOLOR(7); WRITELN(': CREATE CTF LEVEL');
702 TEXTCOLOR(7); WRITELN; III:=EDITMENU(6,5);
705 1:IF B.LTOTAL>0THEN BEGIN
706 II:=INPUTINT('EDIT WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
707 IF II<>0THEN EDITLEVEL;
709 2:IF B.LTOTAL>0THEN BEGIN
710 II:=INPUTINT('COPY WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
713 IF II<=B.LSINGLE THEN BEGIN
715 FOR I:=B.LTOTAL DOWNTO B.LSINGLE+1DO L[I]:=L[I-1];
716 L[B.LSINGLE]:=L[II]; II:=B.LSINGLE
718 FOR I:=2TO 7DO IF B.LTO[I]=B.LMULTI THEN BEGIN
719 INC(B.LTO[I]); IF B.LFROM[I]=0THEN INC(B.LFROM[I]);
721 INC(B.LMULTI); L[B.LTOTAL]:=L[II]; II:=B.LTOTAL;
723 L[II].NAME:='Copy of '+L[II].NAME;
726 3:IF B.LTOTAL>0THEN BEGIN
727 I:=INPUTINT('MOVE WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
729 II:=INPUTINT('NEW LEVEL NUMBER','ENTER 0 TO CANCEL',0,0,B.LTOTAL);
730 IF((I<=B.LSINGLE)AND(II<=B.LSINGLE))
731 OR((I>B.LSINGLE)AND(II>B.LSINGLE))THEN BEGIN
732 LTEMP:=L[I]; IF II>I THEN FOR I4:=I TO II-1DO L[I4]:=L[I4+1]
733 ELSE FOR I4:=I DOWNTO II+1DO L[I4]:=L[I4-1];
738 4:IF B.LTOTAL>0THEN BEGIN
739 II:=INPUTINT('DELETE WHICH LEVEL','0=CANCEL',0,0,B.LTOTAL);
741 I:=INPUTINT('PLEASE CONFIRM LEVEL TO *REMOVE*','ENTER 0 TO CANCEL',0,0,B.LTOTAL);
743 IF I<=B.LSINGLE THEN DEC(B.LSINGLE)ELSE
744 IF I<=B.LMULTI+B.LSINGLE THEN DEC(B.LMULTI)ELSE
746 DEC(B.LTOTAL); FOR I:=II TO B.LTOTAL DO L[I]:=L[I+1];
748 IF B.LTO[I]>B.LMULTI THEN B.LTO[I]:=B.LMULTI;
749 IF B.LFROM[I]>B.LTO[I]THEN B.LFROM[I]:=B.LTO[I];
755 INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE;
756 IF B.LFROM[1]=0THEN B.LFROM[1]:=1;
757 FOR I:=B.LTOTAL DOWNTO II+1DO L[I]:=L[I-1];
758 L[II].NAME:='Level #'+NR(II);
759 L[II].PEAS:=8; L[II].DELAY:=4; L[II].GROWTH:=15; L[II].BSIZE:=15;
760 L[II].SPRSIZE:=0; L[II].NRBALLS:=0; L[II].W[1].D:=0; L[II].W[1].X:=63;
761 L[II].W[1].Y:=2; L[II].FIELDX:=128; L[II].FIELDY:=57; L[II].NROBJ:=0;
765 FOR I:=2TO 7DO IF B.LTO[I]=B.LMULTI THEN BEGIN
766 INC(B.LTO[I]); IF B.LFROM[I]=0THEN INC(B.LFROM[I]);
768 INC(B.LTOTAL); INC(B.LMULTI); II:=B.LSINGLE+B.LMULTI;
769 FOR I:=B.LTOTAL DOWNTO II+1DO L[I]:=L[I-1];
770 L[II].NAME:='Arena #'+NR(B.LMULTI);
771 L[II].DELAY:=4; L[II].GROWTH:=15; L[II].BSIZE:=15; L[II].SPRSIZE:=0;
772 L[II].W[1].D:=$40; L[II].W[1].Y:=28; L[II].W[1].X:=2;
773 L[II].W[2].D:=$C0; L[II].W[2].Y:=28; L[II].W[2].X:=125;
774 L[II].W[3].D:=$00; L[II].W[3].Y:=02; L[II].W[3].X:=63;
775 L[II].W[4].D:=$80; L[II].W[4].Y:=54; L[II].W[4].X:=63;
776 L[II].NRBALLS:=0; L[II].FIELDX:=128; L[II].FIELDY:=57;
777 L[II].NROBJ:=0; EDITLEVEL;
780 UNTIL III=-1; III:=0;
786 TITLEBAR(0,'CHANGE DEFAULTS');
787 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': HISCORE NAME ');
788 TEXTCOLOR(3); WRITELN('(',B.HINAME,')');
789 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': END TYPE ');
790 TEXTCOLOR(3); WRITELN('(',ENDTYPE[B.ENDTYPE],')');
793 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITE(': EDIT MESSAGE ');
794 TEXTCOLOR(3); WRITE('(',COPY(B.ENDDATA,1,18));
795 IF LENGTH(B.ENDDATA)>18THEN WRITELN('...)')ELSE WRITELN(')');
797 ELSE BEGIN TEXTCOLOR(7); WRITELN('3: CONFIGURE END'); END; {NOTN}
799 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': SPRITE SIZE ');
800 TEXTCOLOR(3); WRITELN('(',B.SPRSIZE,')');
801 FOR I:=1TO B.SPRSIZE DO BEGIN
802 TEXTCOLOR(14); WRITE(I+4); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3);
803 WRITELN(BYTE2STR(B.SPRITE[I],B.SPRSIZE));
806 III:=EDITMENU(4+B.SPRSIZE,0);
809 S:=INPUTSTR('DEFAULT NAME OF HISCORES','LENGTH 3 CHARS',B.HINAME,3);
810 FOR I:=1TO 3DO B.HINAME[I]:=S[I];
813 FOR II:=0TO 1DO WRITE(NR(II)+': '+ENDTYPE[II]+CC(' ',40-ORD(ENDTYPE[II,0])));
814 B.ENDTYPE:=INPUTINT('ENTER NEW END TYPE',S,0,0,1);
815 IF B.ENDTYPE=1THEN B.ENDDATA:='Congratulations!!';
818 B.ENDDATA:=INPUTSTR('ENTER NEW END MESSAGE','MAX 255 CHARS','Congratulations!!',255);
820 I:=INPUTINT('ENTER THE DEFAULT SPRITE SIZE','CAN BE CHANGED PER LEVEL',1,B.SPRSIZE,8);
821 IF I>B.SPRSIZE THEN FOR I4:=B.SPRSIZE+1TO I DO B.SPRITE[I4]:=0;
824 ELSE IF III>4THEN BEGIN
825 S:=INPUTSTR('ENTER NEW LINE #'+NR(III-4)+' OF SPRITE','EXAMPLE: 100101 = X��X�X',
826 ZERO(BYTE2BIN(B.SPRITE[III-4]),8),8);
827 B.SPRITE[III-4]:=STR2BYTE(S);
830 UNTIL III=-1; III:=0;
836 TITLEBAR(4,UPCS(B.NAME));
837 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT TITLE');
838 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITELN(': DEFAULTS');
839 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITELN(': GAME TYPES');
840 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': LEVELS');
841 TEXTCOLOR(3); WRITE(' (',B.LTOTAL,')');
845 1:B.NAME:=INPUTSTR('ENTER NEW TITLE FOR THIS LEVELFILE','NOTE TI-86 DISPLAYS ONLY 22 CHARS ON THEFIRST LINE',
851 UNTIL III=-1; III:=0;
856 ASSIGN(F,FILENAME+'.LVL'); {$I-} RESET(F,1); {$I+} I:=IORESULT;
858 TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
859 WRITELN('FAILED OPENING LEVEL FILE!'); WRITELN('RUNTIME ERROR #',I); HALT;
861 {$I-} BLOCKREAD(F,B,SIZEOF(B));
862 FOR I:=1TO B.LTOTAL DO BLOCKREAD(F,L[I],SIZEOF(L[I])); {$I+}
863 IF(IORESULT<>0)OR(B.HEAD<>HEADEDIT)THEN BEGIN
864 TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7);
865 WRITELN('ERROR READING LEVEL FILE!');
868 IF B.VERSION<>HEADVERSION THEN BEGIN
869 WRITELN('CAN''T READ FILE VERSION ',B.VERSION,'.'); CLOSE(F); HALT;
875 ASSIGN(F,FILENAME+'.LVL'); REWRITE(F,1);
876 BLOCKWRITE(F,B,SIZEOF(B));
877 FOR I:=1TO B.LTOTAL DO BLOCKWRITE(F,L[I],SIZEOF(L[I])); CLOSE(F);
882 PROCEDURE SAVELEVEL(SAVEWORMS:BYTE);
884 BLOCKWRITE(FF,L[II].PEAS,1);
885 BLOCKWRITE(FF,L[II].DELAY,1);
886 BLOCKWRITE(FF,L[II].GROWTH,1);
887 BLOCKWRITE(FF,L[II].BSIZE,1);
888 BLOCKWRITE(FF,L[II].SPRSIZE,1);
889 BLOCKWRITE(FF,L[II].SPRITE,L[II].SPRSIZE);
890 BLOCKWRITE(FF,L[II].NRBALLS,1);
891 BLOCKWRITE(FF,L[II].BALLS,L[II].NRBALLS*3);
892 BLOCKWRITE(FF,L[II].W[1].D,3*SAVEWORMS); {D,X,Y}
893 BLOCKWRITE(FF,L[II].FIELDX,2); {FIELDX,FIELDY}
894 FOR I:=1TO L[II].NROBJ DO BEGIN
895 IF L[II].OBJ[I].TYP>0THEN BEGIN
896 BLOCKWRITE(FF,L[II].OBJ[I].TYP,4);
897 IF(L[II].OBJ[I].TYP=3)AND(L[II].OBJ[I].Y2+L[II].OBJ[I].Y1=255)THEN BEGIN
898 I4:=MAX(57,L[II].FIELDY)-L[II].OBJ[I].Y1; BLOCKWRITE(FF,I4,1);
899 END {OFFSCREEN} ELSE BLOCKWRITE(FF,L[II].OBJ[I].Y2,1);
902 I:=0; BLOCKWRITE(FF,I,1); {LVL END}
903 END; {COMMONSAVELEVEL}
905 ASSIGN(FF,FILENAME+'.86S'); REWRITE(FF,1);
907 BLOCKWRITE(FF,HEAD86S[1],ORD(HEAD86S[0])); {86S-HEADER}
908 ISTACK:=COMPSIZE; BLOCKWRITE(FF,ISTACK,2); {FILE LENGTH (x+$12)}
909 I:=$000C; BLOCKWRITE(FF,I,2); {STRING ID}
910 DEC(ISTACK,$10); BLOCKWRITE(FF,ISTACK,2); {DATA LENGTH (x+2)}
912 I:=$080C; BLOCKWRITE(FF,I,2); {STRING ID}
913 S:=LOCS(FILENAME); BLOCKWRITE(FF,S[1],8); {PRGNAME}
914 BLOCKWRITE(FF,ISTACK,2); {DATA LENGTH (x+2)}
915 DEC(ISTACK,2); BLOCKWRITE(FF,ISTACK,2); {PROG LENGTH (x)}
917 C:='w'; BLOCKWRITE(FF,C,1); {WORM ID}
918 I:=HEADVERSION; BLOCKWRITE(FF,I,1); {VERSION}
919 BLOCKWRITE(FF,B.NAME[1],ORD(B.NAME[0])); {TITLE}
920 I:=0; BLOCKWRITE(FF,I,1); {STRING TERMINATOR #0}
921 I:=1+B.SPRSIZE+2; FOR II:=B.LFROM[1]TO B.LTOTAL DO I:=I+L[II].SIZE;
922 BLOCKWRITE(FF,I,2); {SIZE}
924 I2:=0; I:=$F401+B.SPRSIZE;
925 IF B.LSINGLE=0THEN BLOCKWRITE(FF,I2,2)ELSE BEGIN
926 BLOCKWRITE(FF,I,2); FOR II:=B.LFROM[1]TO B.LSINGLE DO INC(I,L[II].SIZE);
927 END; {SINGLLVLS} INC(I,2);
928 ISTACK:=I; FOR II:=2TO 7DO BEGIN
929 I:=ISTACK; IF B.LFROM[II]=0THEN I:=0 ELSE
930 FOR III:=B.LSINGLE TO B.LSINGLE+B.LFROM[II]-2DO
934 FOR II:=B.LSINGLE+B.LMULTI+1TO B.LTOTAL DO INC(ISTACK,L[II].SIZE);
935 I:=0; IF B.LCTF=0THEN BLOCKWRITE(FF,I,2)ELSE BLOCKWRITE(FF,ISTACK,2);
937 FOR II:=1TO 7DO BEGIN
938 IF B.LFROM[II]=0THEN I:=0 ELSE I:=B.LTO[II]-B.LFROM[II]+1;
941 BLOCKWRITE(FF,B.LCTF,1);
943 BLOCKWRITE(FF,B.SPRSIZE,1);
944 BLOCKWRITE(FF,B.SPRITE,B.SPRSIZE);
947 FOR II:=B.LFROM[1]TO B.LSINGLE DO SAVELEVEL(1); {LEVELS SINGLEPL}
948 I:=255; BLOCKWRITE(FF,I,1); {END}
949 I:=$C9; BLOCKWRITE(FF,I,1); {RET}
952 FOR II:=B.LSINGLE+1TO B.LSINGLE+B.LMULTI DO SAVELEVEL(4); {LEVELS MULTIPL}
954 I:=0; I2:=1; IF B.LFROM[2]>0THEN I2:=I2+1+B.LTO[2]-B.LFROM[2];
955 IF B.LFROM[3]>0THEN I2:=I2+1+B.LTO[3]-B.LFROM[3];
956 FOR II:=1TO I2 DO BEGIN BLOCKWRITE(FF,I,2); BLOCKWRITE(FF,B.HINAME,3); END; {HI}
958 SEEK(FF,$37); I2:=0; I:=0;
959 REPEAT INC(I,I2); BLOCKREAD(FF,I2,1,ISTACK); UNTIL ISTACK<>1;
960 BLOCKWRITE(FF,I,2); {CHECKSUM}
966 TITLEBAR(0,'CHOOSE LEVELFILE');
967 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': COMPILE, SAVE AND QUIT');
968 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': SAVE ');
969 TEXTCOLOR(3); WRITELN(FILENAME,'.LVL');
970 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITELN(': QUIT');
971 TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITELN(': CONTINUE EDITING');
972 WRITELN; III:=EDITMENU(4,0);
975 FILESAVE; FILECOMP; HALT;
980 WRITE('REALLY QUIT '); TEXTCOLOR(8); WRITE('[Y/N]'); TEXTCOLOR(7);
981 WRITE('> '); REPEAT C:=READKEY; UNTIL(UPCASE(C)='Y')OR(UPCASE(C)='N');
982 IF UPCASE(C)<>'Y'THEN III:=0;
992 TITLEBAR(0,'CHOOSE LEVELFILE');
993 TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': CREATE NEW FILE');
994 TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITELN(': EDIT EXISTING');
995 TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITE(': EDIT'); TEXTCOLOR(3);
996 WRITE(' WORMLVL1.LVL');
1001 FILENAME:=INPUTSTR('ENTER LEVELNAME','8 CHARS MAX; W/O EXTENSION','WORMLVL1',8);
1002 IF NOT FILEEXIST(FILENAME+'.LVL')THEN FILESAVE;
1003 OPENFILE; EDITMAIN; EDITQUIT;
1006 FILENAME:=INPUTSTR('ENTER FILENAME','W/O EXTENSION','WORMLVL1',8);
1007 OPENFILE; EDITMAIN; EDITQUIT;
1010 FILENAME:='WORMLVL1'; OPENFILE; EDITMAIN; EDITQUIT;
1018 MAINTITLE; EDITFILE;