X-Git-Url: http://git.shiar.nl/wormy.git/blobdiff_plain/05b2b45114015912ccf5db24096b386eace99029..8f37ce5d3f4fb337115fbe7bd092fbc5b66b0085:/wormedit.pas diff --git a/wormedit.pas b/wormedit.pas index 22918c0..016174a 100644 --- a/wormedit.pas +++ b/wormedit.pas @@ -1,5 +1,28 @@ 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'); @@ -7,15 +30,15 @@ CONST GAMETYPE:ARRAY[1..8]OF STRING[12] = OBJTYPE:ARRAY[0..4]OF STRING[8] = ('NONE','LINE','FAT LINE','BAR','CIRCLE'); - ENDTYPE:ARRAY[-1..0]OF STRING[8] = - ('MESSAGE','NONE'); + ENDTYPE:ARRAY[0..1]OF STRING[8] = + ('NONE','MESSAGE'); HEAD86S:STRING[53] = ('**TI86**'+#$1A+#$A+#0+ {HEADER} - 'Levelfile for Worm 0á93 made with WormEdit'); {COMMENT} + 'Levelfile for Worm 0á94 made with WormEdit'); {COMMENT} - HEADEDIT = ('WormEditá93'+#0+'LVL'); - HEADVERSION = 93; + HEADEDIT = ('WormEditá94'+#0+'LVL'); + HEADVERSION = 94; B:RECORD HEAD:ARRAY[1..15]OF CHAR; @@ -28,20 +51,23 @@ CONST GAMETYPE:ARRAY[1..8]OF STRING[12] = SPRITE:ARRAY[1..8]OF BYTE; ENDTYPE:INTEGER; ENDDATA:STRING[255]; + HINAME:ARRAY[1..3]OF CHAR; END {B} = (HEAD:HEADEDIT; 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 11110000 11110000 01100000} - ENDTYPE:0); + ENDTYPE:1; + ENDDATA:''; + HINAME:'WOR'); LVLPOS:BYTE = 1; OBJPOS:BYTE = 1; @@ -52,41 +78,22 @@ VAR I,I2:WORD; 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]; + LVLDISP:BYTE; 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 '); TEXTCOLOR(1); WRITE('>ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ'); WINDOW(41,2,41,25); TEXTCOLOR(7); TEXTBACKGROUND(0); WRITE(CC('³',23)); WINDOW(1,25,80,25); TEXTBACKGROUND(1); CLRSCR; - GOTOXY(75,1); TEXTCOLOR(0); WRITE('v0.93'); TEXTBACKGROUND(0); + GOTOXY(75,1); TEXTCOLOR(0); WRITE('v0.94'); TEXTBACKGROUND(0); END; {MAINTITLE} PROCEDURE CIRCLE(X,Y,Z,COL:BYTE); @@ -118,7 +125,7 @@ BEGIN 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); @@ -159,15 +166,19 @@ BEGIN 1:WRITE('PRESS OR 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} PROCEDURE DISPLEVELS; BEGIN - WINDOW(42,3,80,13); TEXTBACKGROUND(0); CLRSCR; + WINDOW(42,3,80,13); TEXTCOLOR(7); TEXTBACKGROUND(0); CLRSCR; IF B.LTOTAL<1THEN WRITELN('NONE PRESENT')ELSE FOR II:=LVLPOS TO MIN(B.LTOTAL,LVLPOS+9)DO BEGIN - WRITE(II); TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7); + IF LVLDISP=1THEN WRITE(II) {CONTINOUS} + ELSE IF II>B.LSINGLE THEN WRITE(II-B.LSINGLE)ELSE WRITE(II); {SEPERATE} + TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7); END; {DISP LEVELS} END; {DISPLEVELS} @@ -176,23 +187,29 @@ VAR EDITOK:SHORTINT; BEGIN EDITOK:=0; REPEAT WINDOW(39,1,39,1); GOTOXY(1,1); REPEAT UNTIL KEYPRESSED; C:=READKEY; - IF C=' 'THEN EDITOK:=10; {10} - IF(C>='1')AND(C<=CHR(EDITMENUMAX+48))THEN EDITOK:=ORD(C)-48; {1..<=9} - IF(C=#27)OR(C='-')OR(C='+')THEN EDITOK:=-1; {EXIT} + IF C=' 'THEN EDITOK:=10 {10} ELSE + IF(C>='1')AND(C<=CHR(EDITMENUMAX+48))THEN EDITOK:=ORD(C)-48 {1..<=9} ELSE + IF(C=#27)OR(C='-')OR(C='+')THEN EDITOK:=-1 {EXIT} ELSE + IF UPCASE(C)='H'THEN HELPBAR(HELPPAGE) ELSE IF C=#0THEN BEGIN C:=READKEY; - IF(C=#80)AND(LVLPOS1)THEN BEGIN DEC(LVLPOS); DISPLEVELS; END; {DOWN} + IF HELPPAGE=5THEN BEGIN + IF(C=#80)AND(LVLPOS1)THEN BEGIN DEC(LVLPOS); DISPLEVELS; END {UP} ELSE + END; {LEVELS DISPED} IF C=#59THEN HELPBAR(HELPPAGE); END; {EXTENDED} - IF UPCASE(C)='H'THEN HELPBAR(HELPPAGE); UNTIL EDITOK<>0; EDITMENU:=EDITOK; END; {EDITMENU} 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])+5; + IF B.LFROM[2]>0THEN I:=I+((1+B.LTO[2]-B.LFROM[2])*5); + IF B.LFROM[3]>0THEN I:=I+((1+B.LTO[3]-B.LFROM[3])*5); + 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} @@ -204,21 +221,22 @@ BEGIN TEXTCOLOR(15); TEXTBACKGROUND(1); CASE BAR OF 1:BEGIN - WRITE('LEVELS',' ':39-6); DISPLEVELS; + WRITE('LEVELS',' ':39-6); LVLDISP:=1; DISPLEVELS; END; {1:SINGLVLS} 2:BEGIN 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 @@ -239,12 +257,7 @@ BEGIN WRITE(' BYTES'); END; {4:FILE} 5:BEGIN - WRITE('LEVELS',' ':39-6); TEXTCOLOR(7); TEXTBACKGROUND(0); - IF B.LTOTAL<1THEN WRITELN('NONE PRESENT')ELSE - FOR II:=1TO B.LTOTAL DO BEGIN - IF II>B.LSINGLE THEN WRITE(II-B.LSINGLE)ELSE WRITE(II); - TEXTCOLOR(3); WRITELN(': '+L[II].NAME); TEXTCOLOR(7); - END; {DISP LEVELS} + WRITE('LEVELS',' ':39-6); LVLDISP:=2; DISPLEVELS; END; {5:LEVELS} END; {BAR} WINDOW(1,2,40,24); @@ -319,7 +332,7 @@ BEGIN TEXTCOLOR(7); WRITE('8: CTF '); TEXTCOLOR(3); IF B.LCTF=0THEN WRITE('(NO LEVELS)')ELSE WRITE('(',B.LCTF,')'); - III:=EDITMENU(8,0); + III:=EDITMENU(8,5); IF III=1THEN BEGIN B.LFROM[1]:=INPUTINT('ENTER LEVELS TO SKIP','USE THIS TO TEMPORARILY REMOVE THE FIRSTFEW LEVELS', 0,0,B.LSINGLE-1); INC(B.LFROM[1]); @@ -341,36 +354,43 @@ 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); @@ -385,30 +405,33 @@ BEGIN 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].Y20THEN 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 @@ -697,6 +723,18 @@ 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 @@ -714,7 +752,8 @@ BEGIN END; {} END; {DELETE} 5:BEGIN - INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE; + INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE; + IF B.LFROM[1]=0THEN B.LFROM[1]:=1; FOR I:=B.LTOTAL DOWNTO II+1DO L[I]:=L[I-1]; L[II].NAME:='Level #'+NR(II); L[II].PEAS:=8; L[II].DELAY:=4; L[II].GROWTH:=15; L[II].BSIZE:=15; @@ -741,79 +780,73 @@ BEGIN UNTIL III=-1; III:=0; END; {EDITLVL} -PROCEDURE EDITDSPR; -BEGIN - REPEAT - TITLEBAR(0,'EDIT DEFAULT SPRITE'); - TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': SPRITE SIZE '); - TEXTCOLOR(3); WRITELN('(',B.SPRSIZE,')'); - FOR I:=1TO B.SPRSIZE DO BEGIN - TEXTCOLOR(14); WRITE(I+1); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3); - WRITELN(BYTE2STR(B.SPRITE[I],B.SPRSIZE)); - END; {DISP SPRITE} - - III:=EDITMENU(1+B.SPRSIZE,0); - IF III=1THEN BEGIN - I:=INPUTINT('ENTER THE DEFAULT SPRITE SIZE','CAN BE CHANGED PER LEVEL',1,B.SPRSIZE,8); - IF I>B.SPRSIZE THEN FOR I4:=B.SPRSIZE+1TO I DO B.SPRITE[I4]:=0; - B.SPRSIZE:=I; - END {SIZE} ELSE IF III>1THEN BEGIN - S:=INPUTSTR('ENTER NEW LINE #'+NR(III-1)+' OF SPRITE','EXAMPLE: 100101 = XúúXúX', - ZERO(BYTE2BIN(B.SPRITE[III-1]),8),8); - B.SPRITE[III-1]:=STR2BYTE(S); - END; {APP} - UNTIL III=-1; III:=0; -END; {EDITDSPR} - -PROCEDURE EDITSPEND; +PROCEDURE EDITSETS; BEGIN REPEAT - TITLEBAR(0,'SINGLEPLAYER ENDING'); - TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': END TYPE '); - TEXTCOLOR(3); WRITELN(' (',ENDTYPE[B.ENDTYPE],')'); TEXTCOLOR(14); + TITLEBAR(0,'CHANGE DEFAULTS'); + TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITE(': HISCORE NAME '); + TEXTCOLOR(3); WRITELN('(',B.HINAME,')'); + TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': END TYPE '); + TEXTCOLOR(3); WRITELN('(',ENDTYPE[B.ENDTYPE],')'); CASE B.ENDTYPE OF - -1:BEGIN - WRITE('2'); TEXTCOLOR(7); WRITE(': EDIT MESSAGE'); - TEXTCOLOR(3); WRITE(' (',COPY(B.ENDDATA,1,18)); + 1:BEGIN + TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITE(': EDIT MESSAGE '); + TEXTCOLOR(3); WRITE('(',COPY(B.ENDDATA,1,18)); IF LENGTH(B.ENDDATA)>18THEN WRITELN('...)')ELSE WRITELN(')'); END; {MSG} + ELSE BEGIN TEXTCOLOR(7); WRITELN('3: CONFIGURE END'); END; {NOTN} END; {TYPE} + TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': SPRITE SIZE '); + TEXTCOLOR(3); WRITELN('(',B.SPRSIZE,')'); + FOR I:=1TO B.SPRSIZE DO BEGIN + TEXTCOLOR(14); WRITE(I+4); TEXTCOLOR(7); WRITE(': EDIT '); TEXTCOLOR(3); + WRITELN(BYTE2STR(B.SPRITE[I],B.SPRSIZE)); + END; {DISP SPRITE} - III:=EDITMENU(2,0); + III:=EDITMENU(4+B.SPRSIZE,0); CASE III OF 1:BEGIN - FOR II:=0TO 1DO WRITE(NR(II)+': '+ENDTYPE[-II]+CC(' ',40-ORD(ENDTYPE[-II,0]))); + S:=INPUTSTR('DEFAULT NAME OF HISCORES','LENGTH 3 CHARS',B.HINAME,3); + FOR I:=1TO 3DO B.HINAME[I]:=S[I]; + END; {HINAME} + 2:BEGIN + FOR II:=0TO 1DO WRITE(NR(II)+': '+ENDTYPE[II]+CC(' ',40-ORD(ENDTYPE[II,0]))); B.ENDTYPE:=INPUTINT('ENTER NEW END TYPE',S,0,0,1); - IF B.ENDTYPE=-1THEN B.ENDDATA:='Congratulations!!'; + IF B.ENDTYPE=1THEN B.ENDDATA:='Congratulations!!'; END; {TITLE} - 2:IF B.ENDTYPE=-1THEN + 3:IF B.ENDTYPE=1THEN B.ENDDATA:=INPUTSTR('ENTER NEW END MESSAGE','MAX 255 CHARS','Congratulations!!',255); + 4:BEGIN + I:=INPUTINT('ENTER THE DEFAULT SPRITE SIZE','CAN BE CHANGED PER LEVEL',1,B.SPRSIZE,8); + IF I>B.SPRSIZE THEN FOR I4:=B.SPRSIZE+1TO I DO B.SPRITE[I4]:=0; + B.SPRSIZE:=I; + END; {SPRSIZE} + ELSE IF III>4THEN BEGIN + S:=INPUTSTR('ENTER NEW LINE #'+NR(III-4)+' OF SPRITE','EXAMPLE: 100101 = XúúXúX', + ZERO(BYTE2BIN(B.SPRITE[III-4]),8),8); + B.SPRITE[III-4]:=STR2BYTE(S); + END; {SPREDIT} END; {HANDLE} UNTIL III=-1; III:=0; -END; {EDITSPEND} - +END; {EDITSETS} PROCEDURE EDITMAIN; BEGIN REPEAT TITLEBAR(4,UPCS(B.NAME)); TEXTCOLOR(14); WRITE('1'); TEXTCOLOR(7); WRITELN(': EDIT TITLE'); - TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITE(': DEFAULT SPRITE'); - TEXTCOLOR(3); WRITELN(' (',B.SPRSIZE,')'); + TEXTCOLOR(14); WRITE('2'); TEXTCOLOR(7); WRITELN(': DEFAULTS'); TEXTCOLOR(14); WRITE('3'); TEXTCOLOR(7); WRITELN(': GAME TYPES'); - TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': SP ENDING'); - TEXTCOLOR(3); WRITELN(' (',ENDTYPE[B.ENDTYPE],')'); - TEXTCOLOR(14); WRITE('5'); TEXTCOLOR(7); WRITE(': LEVELS'); + TEXTCOLOR(14); WRITE('4'); TEXTCOLOR(7); WRITE(': LEVELS'); TEXTCOLOR(3); WRITE(' (',B.LTOTAL,')'); - III:=EDITMENU(5,3); + III:=EDITMENU(4,3); CASE III OF 1:B.NAME:=INPUTSTR('ENTER NEW TITLE FOR THIS LEVELFILE','NOTE TI-86 DISPLAYS ONLY 22 CHARS ON THEFIRST LINE', B.NAME,32); {TITLE} - 2:EDITDSPR; + 2:EDITSETS; 3:EDITGAME; - 4:EDITSPEND; - 5:EDITLVL; + 4:EDITLVL; END; {HANDLE} UNTIL III=-1; III:=0; END; {EDITMAIN} @@ -825,7 +858,8 @@ BEGIN TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7); WRITELN('FAILED OPENING LEVEL FILE!'); WRITELN('RUNTIME ERROR #',I); HALT; END; {CAN'T OPEN} - {$I-} BLOCKREAD(F,B,SIZEOF(B)); BLOCKREAD(F,L,SIZEOF(L)); {$I+} + {$I-} BLOCKREAD(F,B,SIZEOF(B)); + FOR I:=1TO B.LTOTAL DO BLOCKREAD(F,L[I],SIZEOF(L[I])); {$I+} IF(IORESULT<>0)OR(B.HEAD<>HEADEDIT)THEN BEGIN TEXTCOLOR(15); WRITE('WARNING!! '); TEXTCOLOR(7); WRITELN('ERROR READING LEVEL FILE!'); @@ -839,30 +873,51 @@ END; {OPENFILE} PROCEDURE FILESAVE; BEGIN ASSIGN(F,FILENAME+'.LVL'); REWRITE(F,1); - BLOCKWRITE(F,B,SIZEOF(B)); BLOCKWRITE(F,L,SIZEOF(L)); CLOSE(F); + BLOCKWRITE(F,B,SIZEOF(B)); + FOR I:=1TO B.LTOTAL DO BLOCKWRITE(F,L[I],SIZEOF(L[I])); CLOSE(F); END; {FILESAVE} 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} @@ -888,45 +943,17 @@ BEGIN 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} - + IF B.LFROM[1]>0THEN + 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} + IF B.LMULTI>0THEN + 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 BEGIN BLOCKWRITE(FF,I,2); BLOCKWRITE(FF,B.HINAME,3); END; {HI} SEEK(FF,$37); I2:=0; I:=0; REPEAT INC(I,I2); BLOCKREAD(FF,I2,1,ISTACK); UNTIL ISTACK<>1;