wormedit 0.95.1908
authorMischa Poslawsky <wormy@shiar.org>
Sat, 8 Sep 2001 21:03:26 +0000 (23:03 +0200)
committerMischa Poslawsky <wormy@shiar.org>
Mon, 2 Mar 2009 21:31:52 +0000 (22:31 +0100)
wormedit.pas
wormy001.lvl

index 98979d8edda72e968e5e08f3d702cb3d8e69d973..abba5230c02a221113026fc745b1ff547048c1a9 100644 (file)
@@ -45,6 +45,7 @@ CONST GAMETYPE:ARRAY[1..8]OF STRING[12] =
        HEAD:ARRAY[1..15]OF CHAR;
        VERSION:BYTE;
        NAME:STRING[32];
+       DESC:STRING[64];
        LSINGLE,LMULTI,LRACE,LCTF,LTOTAL:BYTE;
        LFROM:ARRAY[1..8]OF BYTE;
        LTO:ARRAY[1..8]OF BYTE;
@@ -58,6 +59,7 @@ CONST GAMETYPE:ARRAY[1..8]OF STRING[12] =
        (HEAD:HEADEDIT;
         VERSION:HEADVERSION;
         NAME:'Custom Worm Level';
+        DESC:'Not done yet. Obviously.';
         LSINGLE:0; LMULTI:0; LRACE:0; LCTF:0; LTOTAL:0;
         LFROM:(0,0,0,0,0,0,0,0);
         LTO:(0,0,0,0,0,0,0,0);
@@ -94,6 +96,8 @@ VAR I,I2:WORD;
 
     L:ARRAY[1..64]OF ONELEVEL;
     LTEMP:ONELEVEL;
+    USEMOUSE:BOOLEAN;
+    QUITOK:BOOLEAN;
 
     FSIZE:LONGINT;
     FILENAME:STRING[8];
@@ -138,8 +142,60 @@ BEGIN {JUST_A_SIMPLE_LINE_PROCEDURE}
   END; {DRAW_THE_LINE}
 END; {LINE}
 
+PROCEDURE PPLINE(X,Y,XX,YY:INTEGER;COL:BYTE);
+VAR LINE1,LINE2,SX,SY,SXY,SYX,DX1,DX2,DY1,DY2:INTEGER;
+BEGIN {SPECIAL LINE}
+  SX:=XX-X; SY:=YY-Y; DX1:=SGN(SX); DX2:=DX1; DY1:=SGN(SY); DY2:=0;
+  SXY:=ABS(SX); SYX:=ABS(SY);
+  IF SYX>SXY THEN BEGIN
+    DY2:=DY1; DX2:=0; LINE1:=SXY; SXY:=SYX; SYX:=LINE1;
+  END; {VERTICAL_LINE}
+  LINE1:=SXY SHR 1;
+  FOR LINE2:=0TO SXY DO BEGIN
+    PUTPIXEL(X,Y,GETPIXEL(X,Y,VGA)OR 1-COL,PTR(VGA,0));
+    LINE1:=LINE1+SYX;
+    IF LINE1<SXY THEN BEGIN
+      INC(X,DX2); INC(Y,DY2);
+    END {STRAIGT_AHEAD} ELSE BEGIN
+      LINE1:=LINE1-SXY;
+      INC(X,DX1); INC(Y,DY1);
+    END; {NEXT_STEP}
+  END; {DRAW_THE_LINE}
+END; {PPLINE}
+PROCEDURE PPCIRCLE(X,Y,Z,COL:BYTE);
+VAR XX,YY,ZZ:INTEGER;
+BEGIN
+  XX:=-1; YY:=Z; ZZ:=-Z;
+  REPEAT
+    INC(XX);
+    PPLINE(X-XX,Y+YY,X+XX,Y+YY,COL); PPLINE(X-XX,Y-YY,X+XX,Y-YY,COL);
+    PPLINE(X-YY,Y+XX,X+YY,Y+XX,COL); PPLINE(X-YY,Y-XX,X+YY,Y-XX,COL);
+    IF ZZ>=0 THEN BEGIN ZZ:=ZZ-(YY SHL 1)+2; DEC(YY); END;
+    ZZ:=ZZ+(XX SHL 1)+3;
+  UNTIL XX>=YY;
+END; {PPCIRCLE}
+
+PROCEDURE PPDISPOBJ(OBJ:INTEGER;COL:BYTE);
+VAR Y:BYTE;
+BEGIN
+  CASE L[II].OBJ[OBJ].TYP OF
+    1:PPLINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2,COL);
+    2:BEGIN
+      PPLINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2,COL);
+      PPLINE(L[II].OBJ[OBJ].X1+1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2+1,L[II].OBJ[OBJ].Y2,COL);
+      PPLINE(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);
+      PPLINE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1+1,L[II].OBJ[OBJ].X2,L[II].OBJ[OBJ].Y2+1,COL);
+    END; {FATLINE}
+    3:BEGIN
+      FOR Y:=L[II].OBJ[OBJ].Y1 TO L[II].OBJ[OBJ].Y1+L[II].OBJ[OBJ].Y2-1DO
+       PPLINE(L[II].OBJ[OBJ].X1,MIN(Y,191),L[II].OBJ[OBJ].X2,MIN(Y,191),COL);
+    END; {BOX}
+    4:PPCIRCLE(L[II].OBJ[OBJ].X1,L[II].OBJ[OBJ].Y1,L[II].OBJ[OBJ].X2,COL);
+  END; {OBJECT TYPE}
+END; {DISPOBJ}
+
 PROCEDURE DISPMAP(OBJ:INTEGER;WHERE:POINTER);
-VAR OBJ2:INTEGER;
+VAR OBJ2,TI:INTEGER;
 PROCEDURE CIRCLE(X,Y,Z,COL:BYTE);
 VAR XX,YY,ZZ:INTEGER;
 BEGIN
@@ -179,49 +235,51 @@ BEGIN
   END; {OBJECT TYPE}
 END; {DISPOBJ}
 BEGIN {---}
-  I:=7; WHILE I<=255DO BEGIN LINE(I,0,I,191,2,WHERE); INC(I,8); END; {GRID}
-  I:=0; WHILE I<=191DO BEGIN LINE(0,I,255,I,2,WHERE); INC(I,8); END;
-  I:=127; WHILE I<=255DO BEGIN LINE(I,0,I,191,6,WHERE); INC(I,128); END;
-  I:=0; WHILE I<=191DO BEGIN LINE(0,I,255,I,6,WHERE); INC(I,56); END;
-
-  FOR I:=2TO L[II].FIELDX-2DO BEGIN
-    IF I MOD 2=0THEN PUTPIXEL(I,L[II].FIELDY SHR 1,4,WHERE)
-    ELSE PUTPIXEL(I,L[II].FIELDY SHR 1,2,WHERE);
+  TI:=3; WHILE TI<=255DO BEGIN LINE(TI,0,TI,191,18,WHERE); INC(TI,8); END; {GRID}
+  TI:=4; WHILE TI<=191DO BEGIN LINE(0,TI,255,TI,18,WHERE); INC(TI,8); END;
+  TI:=7; WHILE TI<=255DO BEGIN LINE(TI,0,TI,191,2,WHERE); INC(TI,8); END; {GRID}
+  TI:=0; WHILE TI<=191DO BEGIN LINE(0,TI,255,TI,2,WHERE); INC(TI,8); END;
+  TI:=127; WHILE TI<=255DO BEGIN LINE(TI,0,TI,191,6,WHERE); INC(TI,128); END;
+  TI:=0; WHILE TI<=191DO BEGIN LINE(0,TI,255,TI,6,WHERE); INC(TI,56); END;
+
+  FOR TI:=2TO L[II].FIELDX-2DO BEGIN
+    IF TI MOD 2=0THEN PUTPIXEL(TI,L[II].FIELDY SHR 1,4,WHERE)
+    ELSE PUTPIXEL(TI,L[II].FIELDY SHR 1,2,WHERE);
   END; {MID}
   IF L[II].FIELDY MOD 2=0THEN
-    FOR I:=2TO L[II].FIELDX-2DO BEGIN
-      IF I MOD 2=1THEN PUTPIXEL(I,L[II].FIELDY SHR 1-1,4,WHERE)
-      ELSE PUTPIXEL(I,L[II].FIELDY SHR 1-1,2,WHERE);
+    FOR TI:=2TO L[II].FIELDX-2DO BEGIN
+      IF TI MOD 2=1THEN PUTPIXEL(TI,L[II].FIELDY SHR 1-1,4,WHERE)
+      ELSE PUTPIXEL(TI,L[II].FIELDY SHR 1-1,2,WHERE);
     END; {DOUBLEMID}
-  FOR I:=2TO L[II].FIELDY-2DO BEGIN
-    IF I MOD 2=0THEN PUTPIXEL(L[II].FIELDX SHR 1,I,4,WHERE)
-    ELSE PUTPIXEL(L[II].FIELDX SHR 1,I,2,WHERE);
+  FOR TI:=2TO L[II].FIELDY-2DO BEGIN
+    IF TI MOD 2=0THEN PUTPIXEL(L[II].FIELDX SHR 1,TI,4,WHERE)
+    ELSE PUTPIXEL(L[II].FIELDX SHR 1,TI,2,WHERE);
   END; {CENTER}
   IF L[II].FIELDX MOD 2=0THEN
-    FOR I:=2TO L[II].FIELDY-2DO BEGIN
-      IF I MOD 2=1THEN PUTPIXEL(L[II].FIELDX SHR 1-1,I,4,WHERE)
-      ELSE PUTPIXEL(L[II].FIELDX SHR 1-1,I,2,WHERE);
+    FOR TI:=2TO L[II].FIELDY-2DO BEGIN
+      IF TI MOD 2=1THEN PUTPIXEL(L[II].FIELDX SHR 1-1,TI,4,WHERE)
+      ELSE PUTPIXEL(L[II].FIELDX SHR 1-1,TI,2,WHERE);
     END; {DOUBLECENTER}
   IF(II>B.LSINGLE+B.LMULTI)AND(II<=B.LSINGLE+B.LMULTI+B.LRACE)THEN BEGIN
     LINE(L[II].FLAG1Y,0,L[II].FLAG1Y,L[II].FLAG1X,22,WHERE);
     LINE(L[II].FLAG1Y,L[II].FLAG1X,L[II].FLAG1Y,L[II].FIELDY-1,24,WHERE);
     LINE(0,L[II].FLAG1X,L[II].FIELDX-1,L[II].FLAG1X,16,WHERE);
   END; {RACE}
-  IF II<=B.LSINGLE THEN I:=1 ELSE I:=4;
-  FOR I:=1TO I DO BEGIN
-    CIRCLE(L[II].W[I].X,L[II].W[I].Y,2,14);
-    LINE(L[II].W[I].X,L[II].W[I].Y,L[II].W[I].X+ROUND(SIN(L[II].W[I].D/128*PI)*20),
-      L[II].W[I].Y+ROUND(COS(L[II].W[I].D/128*PI)*20),16,WHERE);
-    LINE(L[II].W[I].X,L[II].W[I].Y,L[II].W[I].X+ROUND(SIN((L[II].W[I].D-13)/128*PI)*15),
-      L[II].W[I].Y+ROUND(COS((L[II].W[I].D-13)/128*PI)*15),14,WHERE);
-    LINE(L[II].W[I].X,L[II].W[I].Y,L[II].W[I].X+ROUND(SIN((L[II].W[I].D+13)/128*PI)*15),
-      L[II].W[I].Y+ROUND(COS((L[II].W[I].D+13)/128*PI)*15),14,WHERE);
-    PUTPIXEL(L[II].W[I].X,L[II].W[I].Y,0,WHERE);
+  IF II<=B.LSINGLE THEN TI:=1 ELSE TI:=4;
+  FOR TI:=1TO TI DO BEGIN
+    CIRCLE(L[II].W[TI].X,L[II].W[TI].Y,2,14);
+    LINE(L[II].W[TI].X,L[II].W[TI].Y,L[II].W[TI].X+ROUND(SIN(L[II].W[TI].D/128*PI)*20),
+      L[II].W[TI].Y+ROUND(COS(L[II].W[TI].D/128*PI)*20),16,WHERE);
+    LINE(L[II].W[TI].X,L[II].W[TI].Y,L[II].W[TI].X+ROUND(SIN((L[II].W[TI].D-13)/128*PI)*15),
+      L[II].W[TI].Y+ROUND(COS((L[II].W[TI].D-13)/128*PI)*15),14,WHERE);
+    LINE(L[II].W[TI].X,L[II].W[TI].Y,L[II].W[TI].X+ROUND(SIN((L[II].W[TI].D+13)/128*PI)*15),
+      L[II].W[TI].Y+ROUND(COS((L[II].W[TI].D+13)/128*PI)*15),14,WHERE);
+    PUTPIXEL(L[II].W[TI].X,L[II].W[TI].Y,0,WHERE);
   END; {WORMS}
   IF II>B.LSINGLE+B.LMULTI+B.LRACE THEN BEGIN
-    IF L[II].SPRSIZE>0THEN I:=L[II].SPRSIZE ELSE I:=B.SPRSIZE;
-    DRAW4PIX(L[II].FLAG1X,L[II].FLAG1Y,I,I,22); {FLAGS}
-    DRAW4PIX(L[II].FLAG2X,L[II].FLAG2Y,I,I,24);
+    IF L[II].SPRSIZE>0THEN TI:=L[II].SPRSIZE ELSE TI:=B.SPRSIZE;
+    DRAW4PIX(L[II].FLAG1X,L[II].FLAG1Y,TI,TI,22); {FLAGS}
+    DRAW4PIX(L[II].FLAG2X,L[II].FLAG2Y,TI,TI,24);
   END; {DRAW FLAGS}
   LINE(0,0,255,0,8,WHERE); LINE(0,1,255,1,8,WHERE); {BORDERS}
   LINE(0,2,0,190-3,8,WHERE); LINE(1,2,1,190-3,8,WHERE);
@@ -238,15 +296,18 @@ END; {DISPMAP}
 PROCEDURE DISPMAPMCGA(OBJ:INTEGER);
 BEGIN
   SETMCGA;
-  SETPAL(2,16,0,0); {GRID}  SETPAL(4,24,0,0); {MID}  SETPAL(6,32,0,0); {MAINGRID}
-  SETPAL(8,63,63,63); {BORDER}
-  SETPAL(10,48,48,48); {OBJ} SETPAL(12,63,63,20); {HL_OBJ}  SETPAL(14,63,0,0); {STARTPOS}
-  SETPAL(16,63,16,0); {STLN}SETPAL(22,0,0,63); {FLAG1}    SETPAL(24,0,63,0); {FLAG2}
-
-  SETPAL(1,32,0,0); {BACK}
-  SETPAL(3,40,0,0); {GRID} SETPAL(3,44,0,0); {GRID}  SETPAL(5,48,0,0); {MAINGRID} SETPAL(9,63,0,0); {BORDER}
-  SETPAL(11,63,0,0); {OBJ} SETPAL(13,63,0,0); {HL_OBJ} SETPAL(15,63,0,0); {STARTPOS}
-  SETPAL(17,52,0,0); {STLN}SETPAL(23,63,0,0); {FLAG1}    SETPAL(25,63,0,0); {FLAG2}
+  SETPAL(0,0,0,0); {BACK}      SETPAL(1,32,0,0); {BACK}
+  SETPAL(2,12,0,0); {GRID}     SETPAL(3,38,0,0); {GRID}
+  SETPAL(4,20,0,0); {MID}      SETPAL(5,40,0,0); {MID}
+  SETPAL(6,28,0,0); {MAINGRID} SETPAL(7,44,0,0); {MAINGRID}
+  SETPAL(8,63,63,63); {BORDER} SETPAL(9,63,0,0); {BORDER}
+  SETPAL(10,48,48,48); {OBJ}   SETPAL(11,63,0,0); {OBJ}
+  SETPAL(12,63,63,20); {HL_OBJ}        SETPAL(13,63,16,0); {HL_OBJ}
+  SETPAL(14,48,32,0);          SETPAL(15,44,0,0); {STLN}
+  SETPAL(16,48,48,0);          SETPAL(17,52,0,0); {STARTPOS}
+  SETPAL(18,8,0,0);            SETPAL(19,36,0,0); {SUBGRID}
+  SETPAL(22,0,0,63); {FLAG1}   SETPAL(23,63,0,0); {FLAG1}
+  SETPAL(24,0,63,0); {FLAG2}   SETPAL(25,63,0,0); {FLAG2}
   DISPMAP(OBJ,PTR(VGA,0));
 END; {DISPMAPMCGA}
 
@@ -258,7 +319,7 @@ VAR VIRT:^SCRN;
     I1,I1X,I1Y:BYTE;
 BEGIN
   NEW(VIRT);
-  FOR I:=0 TO 199DO FOR I2:=0 TO 319DO VIRT^[I,I2]:=0; DISPMAP(OBJ,VIRT);
+  FOR TI:=0 TO 199DO FOR I2:=0 TO 319DO VIRT^[I,I2]:=0; DISPMAP(OBJ,VIRT);
   WINDOW(1,3,80,20);
   FOR I:=0 TO 19DO FOR I2:=0 TO 79DO BEGIN
     I1X:=ROUND(I2*L[II].FIELDX/80); I1Y:=ROUND(I*L[II].FIELDY/20);
@@ -274,51 +335,99 @@ BEGIN
     WRITE('�');
   END;
   DISPOSE(VIRT);}
-PROCEDURE PPLINE(X,Y,XX,YY:INTEGER;COL:BYTE);
-VAR LINE1,LINE2,SX,SY,SXY,SYX,DX1,DX2,DY1,DY2:INTEGER;
-BEGIN {SPECIAL LINE}
-  SX:=XX-X; SY:=YY-Y; DX1:=SGN(SX); DX2:=DX1; DY1:=SGN(SY); DY2:=0;
-  SXY:=ABS(SX); SYX:=ABS(SY);
-  IF SYX>SXY THEN BEGIN
-    DY2:=DY1; DX2:=0; LINE1:=SXY; SXY:=SYX; SYX:=LINE1;
-  END; {VERTICAL_LINE}
-  LINE1:=SXY SHR 1;
-  FOR LINE2:=0TO SXY DO BEGIN
-    PUTPIXEL(X,Y,GETPIXEL(X,Y,VGA)OR 1-COL,PTR(VGA,0));
-    LINE1:=LINE1+SYX;
-    IF LINE1<SXY THEN BEGIN
-      INC(X,DX2); INC(Y,DY2);
-    END {STRAIGT_AHEAD} ELSE BEGIN
-      LINE1:=LINE1-SXY;
-      INC(X,DX1); INC(Y,DY1);
-    END; {NEXT_STEP}
-  END; {DRAW_THE_LINE}
-END; {PPLINE}
 BEGIN
   DISPMAPMCGA(OBJ); CLRKEY;
   REPEAT
-    GETMOUSEPOS(MX,MY,M1,M2); MX:=MX SHR 1; {MY:=MY SHR 1;}
-    PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0));
-    DELAY(10);
-    PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0));
-    IF M1 THEN PPLINE(MXX,MYY,MX,MY,0);
-    IF M2 THEN PPLINE(MXX,MYY,MX,MY,1);
-    MXX:=MX; MYY:=MY;
+    IF USEMOUSE THEN BEGIN
+      GETMOUSEPOS(MX,MY,M1,M2); MX:=MX SHR 1; {MY:=MY SHR 1;}
+      PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0));
+      DELAY(10);
+      PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0));
+      IF M1 THEN PPLINE(MXX,MYY,MX,MY,0);
+      IF M2 THEN PPLINE(MXX,MYY,MX,MY,1);
+      MXX:=MX; MYY:=MY;
+    END; {MOUSE}
   UNTIL KEYPRESSED; MAINTITLE;
 END; {DISP1MAP}
 
-PROCEDURE MAPOBJ(OBJ,XMIN,XDEF,XMAX,YMIN,YDEF,YMAX:INTEGER);
+PROCEDURE MAPOBJ(OBJ,OBJSUB:INTEGER);
 VAR M1,M2:BOOLEAN;
+    MXX,MYY:WORD;
+    XMIN,XDEF,XMAX,YMIN,YDEF,YMAX:INTEGER;
 BEGIN
   DISPMAPMCGA(OBJ); CLRKEY;
+  IF OBJSUB=0THEN BEGIN
+    XDEF:=L[II].OBJ[OBJ].X1; YDEF:=L[II].OBJ[OBJ].Y1;
+  END {FROM} ELSE BEGIN
+    XDEF:=L[II].OBJ[OBJ].X2; YDEF:=L[II].OBJ[OBJ].Y2;
+  END; {TO}
+  CASE L[II].OBJ[OBJ].TYP OF
+    1:BEGIN XMIN:=2; XMAX:=L[II].FIELDX-3; YMIN:=2; YMAX:=L[II].FIELDY-3;
+    END; {LINE}
+    2:BEGIN XMIN:=2; XMAX:=L[II].FIELDX-4; YMIN:=2; YMAX:=L[II].FIELDY-4;
+    END; {FATTY}
+    3:BEGIN XMIN:=2; XMAX:=L[II].FIELDX-1; YMIN:=2; YMAX:=L[II].FIELDY-2;
+      IF OBJSUB=0THEN YMAX:=L[II].OBJ[OBJ].Y1+L[II].OBJ[OBJ].Y2-1
+      ELSE YMIN:=L[II].OBJ[OBJ].Y1+1;
+    END; {BOX}
+    4:BEGIN XMIN:=0;
+      IF OBJSUB=0THEN BEGIN
+       XMAX:=255; YMIN:=0; YMAX:=255;
+      END {POS} ELSE BEGIN
+        XMAX:=120; XDEF:=ABS(INTEGER(L[II].OBJ[OBJ].X1)-L[II].OBJ[OBJ].X2);
+        YMIN:=L[II].OBJ[OBJ].Y1; YDEF:=L[II].OBJ[OBJ].Y1; YMAX:=L[II].OBJ[OBJ].Y1;
+      END; {SIZE}
+    END; {CIRCLE}
+  END; {TYPE}
+  MY:=YDEF;
+  IF USEMOUSE THEN BEGIN MX:=XDEF SHL 1; MOUSE(4,MX,MX,MX,MY); END; {INITMOUSE}
+  MX:=XDEF;
   REPEAT
-    GETMOUSEPOS(MX,MY,M1,M2); MX:=MX SHR 1; {MY:=MY SHR 1;}
-    IF MX<XMIN THEN MX:=XMIN; IF MX>XMAX THEN MX:=XMAX;
-    IF MY<YMIN THEN MY:=YMIN; IF MY>YMAX THEN MY:=YMAX;
-    IF M2 THEN BEGIN MX:=XDEF; MY:=YDEF; END; {R_BUTTON}
-    PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0)); DELAY(10);
-    PUTPIXEL(MX,MY,GETPIXEL(MX,MY,VGA)XOR 1,PTR(VGA,0));
-  UNTIL(KEYPRESSED)OR(M1); MAINTITLE;
+    PPDISPOBJ(OBJ,0);
+    IF USEMOUSE THEN BEGIN
+      REPEAT GETMOUSEPOS(MX,MY,M1,M2);
+      UNTIL(MX<>MXX)OR(MY<>MYY)OR(M1)OR(M2)OR(KEYPRESSED);
+      MXX:=MX; MYY:=MY; MX:=MX SHR 1;
+      IF KEYPRESSED THEN BEGIN C:=READKEY;
+       IF(C=#13)OR(C=' ')THEN M1:=TRUE; IF(C=#27)OR(C='+')THEN M2:=TRUE;
+      END; {KEYS}
+    END {MOUSE} ELSE BEGIN
+      REPEAT UNTIL KEYPRESSED; C:=READKEY;
+      IF(C=#13)OR(C=' ')THEN M1:=TRUE ELSE M1:=FALSE;
+      IF(C=#27)OR(C='+')THEN M2:=TRUE ELSE M2:=FALSE;
+      IF C='2'THEN INC(MY); {DOWN} IF C='8'THEN DEC(MY); {UP}
+      IF C='4'THEN DEC(MX); {L}    IF C='6'THEN INC(MX); {R}
+      IF C=#0THEN BEGIN  C:=READKEY;
+        IF C=#80 THEN INC(MY); {DOWN} IF C=#72 THEN DEC(MY); {UP}
+        IF C=#75 THEN DEC(MX); {L}    IF C=#77 THEN INC(MX); {R}
+      END; {EXTENDED}
+    END; {KEYB}
+    IF NOT M1 THEN BEGIN
+      IF MX<XMIN THEN MX:=XMIN; IF MX>XMAX THEN MX:=XMAX;
+      IF MY<YMIN THEN MY:=YMIN; IF MY>YMAX THEN MY:=YMAX;
+      IF M2 THEN BEGIN MX:=XDEF; MY:=YDEF; END; {R_BUTTON}
+      IF(USEMOUSE)AND((MX<>MXX)OR(MY<>MYY))THEN BEGIN
+       MX:=MX SHL 1; MOUSE(4,MX,MX,MX,MY); MX:=MX SHR 1;
+      END; {SET_NEW_MOUSE_POS}
+      PPDISPOBJ(OBJ,1);
+      IF OBJSUB=0THEN CASE L[II].OBJ[OBJ].TYP OF
+        3:BEGIN
+         INC(L[II].OBJ[OBJ].Y2,L[II].OBJ[OBJ].Y1-MY);
+         L[II].OBJ[OBJ].X1:=MX; L[II].OBJ[OBJ].Y1:=MY;
+        END; {BOX}
+        ELSE BEGIN L[II].OBJ[OBJ].X1:=MX; L[II].OBJ[OBJ].Y1:=MY; END; {DEF}
+      END {FROM} ELSE  CASE L[II].OBJ[OBJ].TYP OF
+        3:BEGIN L[II].OBJ[OBJ].X2:=MX; L[II].OBJ[OBJ].Y2:=MY-L[II].OBJ[OBJ].Y1;
+        END; {BOX}
+        4:BEGIN L[II].OBJ[OBJ].X2:=ABS(MX-INTEGER(L[II].OBJ[OBJ].X1)); L[II].OBJ[OBJ].Y2:=0; END; {CIRCLE}
+        ELSE BEGIN L[II].OBJ[OBJ].X2:=MX; L[II].OBJ[OBJ].Y2:=MY; END; {DEF}
+      END; {TO}
+    END; {K}
+  UNTIL M1; MAINTITLE;
+  IF(L[II].OBJ[OBJ].TYP=3)AND(L[II].OBJ[OBJ].Y1<0)THEN BEGIN
+    I4:=L[II].OBJ[OBJ].Y1; L[II].OBJ[OBJ].Y1:=L[II].OBJ[OBJ].Y2;
+    L[II].OBJ[OBJ].Y1:=-I4;
+  END; {SWAP Y FOR BOX}
 END; {MAPOBJ}
 
 FUNCTION NR(VALUE:LONGINT):STRING;
@@ -406,7 +515,7 @@ BEGIN
   FOR I4:=1TO L[II].NROBJ DO IF L[II].OBJ[I4].TYP<=0THEN DEC(I,5);
 END; {SIZE OF LEVEL II}
 BEGIN
-  I:=$31+B.SPRSIZE+ORD(B.NAME[0])+5;
+  I:=$31+B.SPRSIZE+ORD(B.NAME[0])+ORD(B.DESC[0])+6;
   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);
   IF B.LFROM[1]>0THEN FOR II:=B.LFROM[1]TO B.LSINGLE DO COMPLEVEL; {SP}
@@ -547,7 +656,7 @@ BEGIN
     END {SINGLEPLAYER} ELSE IF III=7THEN BEGIN
       B.LFROM[7]:=INPUTINT('ENTER STARTING LEVEL','USUALLY 1 UNLESS YOU WANT TO SKIP LEVELS0=NO LEVELS',0,1,B.LRACE);
       IF B.LFROM[7]>0THEN
-        B.LTO[7]:=INPUTINT('ENTER LAST LEVEL','',B.LFROM[7],B.LCTF,B.LCTF);
+        B.LTO[7]:=INPUTINT('ENTER LAST LEVEL','',B.LFROM[7],B.LRACE,B.LRACE);
     END {RACE} ELSE IF III=8THEN BEGIN
       B.LFROM[8]:=INPUTINT('ENTER STARTING LEVEL','USUALLY 1 UNLESS YOU WANT TO SKIP LEVELS0=NO LEVELS',0,1,B.LCTF);
       IF B.LFROM[8]>0THEN
@@ -597,78 +706,51 @@ BEGIN
       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=(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+
-           '   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);
+       IF L[II].OBJ[I].TYP=4THEN BEGIN
+         L[II].OBJ[I].X1:=(L[II].FIELDX-1)SHR 1;
+         L[II].OBJ[I].Y1:=(L[II].FIELDY-1)SHR 1;
+         L[II].OBJ[I].X2:=MIN(L[II].FIELDY-3,L[II].FIELDX-3)SHR 2;
          L[II].OBJ[I].Y2:=0;
        END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
          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);
-         L[II].OBJ[I].Y2:=INPUTINT('ENTER Y2',S,2,(L[II].FIELDY-1)SHR 1,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;
-             L[II].OBJ[I].Y1:=I4;
-           END; {END BEFORE START}
-           L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1;
-         END; {BOX}
+         L[II].OBJ[I].X1:=(L[II].FIELDX-1)SHR 1-(L[II].FIELDX-1)SHR 2;
+         L[II].OBJ[I].Y1:=(L[II].FIELDY-1)SHR 1-(L[II].FIELDY-1)SHR 2;
+         L[II].OBJ[I].X2:=(L[II].FIELDX-1)SHR 1+(L[II].FIELDX-1)SHR 2;
+         L[II].OBJ[I].Y2:=(L[II].FIELDY-1)SHR 1+(L[II].FIELDY-1)SHR 2;
+         IF L[II].OBJ[I].TYP=3THEN
+           L[II].OBJ[I].Y2:=L[II].OBJ[I].Y2-L[II].OBJ[I].Y1; {BOX}
        END; {NORMAL OBJECT}
       END; {TYPE}
-      2,3:BEGIN
+      2:BEGIN
        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
-         IF III=4THEN BEGIN
-           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 {ENTER} ELSE BEGIN
-           MAPOBJ(I,0,L[II].OBJ[I].X1,255,0,L[II].OBJ[I].Y1,255);
-           L[II].OBJ[I].X1:=MX; L[II].OBJ[I].Y1:=MY;
-         END; {SEL}
+       IF L[II].OBJ[I].TYP=4THEN BEGIN
+         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+
+           '   DON''T TRY Y<0; MIGHT CRASH CALC!!!',0,L[II].OBJ[I].Y1,255);
        END {CIRCLE} ELSE IF L[II].OBJ[I].TYP>0THEN BEGIN
-         IF III=4THEN BEGIN
-           IF L[II].OBJ[I].TYP=3THEN
-             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);
-         END {ENTER} ELSE BEGIN
-           MAPOBJ(I,2,L[II].OBJ[I].X1,L[II].FIELDX-I4,2,L[II].OBJ[I].Y1,L[II].FIELDY-I4);
-           L[II].OBJ[I].X1:=MX; L[II].OBJ[I].Y1:=MY;
-         END; {SEL}
+         IF L[II].OBJ[I].TYP=3THEN
+           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}
-      4,5:BEGIN
+      3:MAPOBJ(I,0);
+      4:BEGIN
        IF L[II].OBJ[I].TYP=4 THEN BEGIN
-         IF III=5THEN BEGIN
-           MAPOBJ(I,0,16,255,L[II].OBJ[I].Y1,L[II].OBJ[I].Y1,L[II].OBJ[I].Y1);
-           L[II].OBJ[I].X2:=ABS(INTEGER(L[II].OBJ[I].X1)-MX); {&&&&}
-         END {SEL} ELSE
-           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].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
-         IF III=4THEN 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=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);
-         END {ENTER} ELSE BEGIN
-           MAPOBJ(I,2,L[II].OBJ[I].X2,L[II].FIELDX-I4,2,L[II].OBJ[I].Y2,L[II].FIELDY-I4);
-           L[II].OBJ[I].X2:=MX; L[II].OBJ[I].Y2:=MY;
-         END; {SEL}
+         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=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;
@@ -678,6 +760,7 @@ BEGIN
          END; {BOX}
        END; {NORMAL OBJECT}
       END; {END}
+      5:MAPOBJ(I,1);
       6:DISP1MAP(I);
       7:BEGIN
        L[II].OBJ[I].TYP:=-L[II].OBJ[I].TYP;
@@ -1047,7 +1130,7 @@ BEGIN
       END; {DELETE}
       5:BEGIN
        INC(B.LSINGLE); INC(B.LTOTAL); II:=B.LSINGLE;
-        IF B.LTO[1]=0THEN B.LTO[1]:=1;
+        IF B.LTO[1]=0THEN B.LTO[1]:=1; IF B.LFROM[1]=0THEN B.LFROM[1]:=1;
        FOR I:=B.LTOTAL DOWNTO II+1DO L[I]:=L[I-1];
        L[II].ID:='Level #'+NR(II);
        L[II].PEAS:=8; L[II].DELAY:=4; L[II].GROWTH:=15; L[II].BSIZE:=15;
@@ -1082,8 +1165,7 @@ BEGIN
        L[II].W[3].D:=$40; L[II].W[3].X:=2; L[II].W[3].Y:=35;
        L[II].W[4].D:=$C0; L[II].W[4].X:=125; L[II].W[4].Y:=35;
        L[II].FIELDX:=128; L[II].FIELDY:=57; L[II].NROBJ:=0;
-       L[II].FLAG1X:=8; L[II].FLAG2X:=128-8-B.SPRSIZE;
-       L[II].FLAG1Y:=27; L[II].FLAG2Y:=27;
+       L[II].FLAG1X:=28; L[II].FLAG1Y:=63; L[II].FLAG2X:=0; L[II].FLAG2Y:=0;
        EDITLEVEL;
       END; {CREATE RACE}
       8:BEGIN
@@ -1162,18 +1244,21 @@ BEGIN
   REPEAT
     TITLEBAR(4,UPCS(B.NAME));
     TEXTCOLOR(C_MENU); WRITE('1'); TEXTCOLOR(C_TEXT); WRITELN(': EDIT TITLE');
-    TEXTCOLOR(C_MENU); WRITE('2'); TEXTCOLOR(C_TEXT); WRITELN(': DEFAULTS');
-    TEXTCOLOR(C_MENU); WRITE('3'); TEXTCOLOR(C_TEXT); WRITELN(': GAME TYPES');
-    TEXTCOLOR(C_MENU); WRITE('4'); TEXTCOLOR(C_TEXT); WRITE(': LEVELS');
+    TEXTCOLOR(C_MENU); WRITE('2'); TEXTCOLOR(C_TEXT); WRITELN(': DESCRIPTION');
+    TEXTCOLOR(C_MENU); WRITE('3'); TEXTCOLOR(C_TEXT); WRITELN(': DEFAULTS');
+    TEXTCOLOR(C_MENU); WRITE('4'); TEXTCOLOR(C_TEXT); WRITELN(': GAME TYPES');
+    TEXTCOLOR(C_MENU); WRITE('5'); TEXTCOLOR(C_TEXT); WRITE(': LEVELS');
       TEXTCOLOR(C_VALUE); WRITE(' (',B.LTOTAL,')');
 
     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:EDITSETS;
-      3:EDITGAME;
-      4:EDITLVL;
+      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:B.DESC:=INPUTSTR('ENTER NEW DESCRIPTION FOR THIS LEVELFILE',
+       'DISPLAYED AT THE LEVEL-SELECTION SCREEN.',B.DESC,64); {DESC}
+      3:EDITSETS;
+      4:EDITGAME;
+      5:EDITLVL;
     END; {HANDLE}
   UNTIL III=-1; III:=0;
 END; {EDITMAIN}
@@ -1251,8 +1336,9 @@ BEGIN
 
   C:='w'; BLOCKWRITE(FF,C,1); {WORM ID}
   I:=HEADVERSION; BLOCKWRITE(FF,I,1); {VERSION}
-  BLOCKWRITE(FF,B.NAME[1],ORD(B.NAME[0])); {TITLE}
-  I:=0; BLOCKWRITE(FF,I,1); {STRING TERMINATOR #0}
+  I:=0; BLOCKWRITE(FF,B.NAME[1],ORD(B.NAME[0])); {TITLE}
+  BLOCKWRITE(FF,I,1); {STRING TERMINATOR #0}
+  BLOCKWRITE(FF,B.DESC[1],ORD(B.DESC[0])); {DESCRIPTION} BLOCKWRITE(FF,I,1);
   I:=1+B.SPRSIZE+2;
   FOR II:=B.LFROM[1]TO B.LSINGLE+B.LMULTI DO I:=I+L[II].SIZE;
   IF B.LFROM[7]>0THEN {RACE LEVELS}
@@ -1323,17 +1409,17 @@ BEGIN
     WRITELN; III:=EDITMENU(4,0);
     CASE III OF
       1:BEGIN
-        FILESAVE; FILECOMP; HALT;
+        FILESAVE; FILECOMP; QUITOK:=TRUE;
       END; {COMPILE}
       2:FILESAVE;
       3:BEGIN
        WINDOW(1,8,40,8);
        WRITE('REALLY QUIT '); TEXTCOLOR(C_SUB); WRITE('[Y/N]'); TEXTCOLOR(C_TEXT);
        WRITE('> '); REPEAT C:=READKEY; UNTIL(UPCASE(C)='Y')OR(UPCASE(C)='N');
-       IF UPCASE(C)='Y'THEN HALT;
+       IF UPCASE(C)='Y'THEN QUITOK:=TRUE;
       END; {QUIT}
     END; {HANDLE}
-  UNTIL III=4;
+  UNTIL(III=4)OR(QUITOK);
 END; {EDITQUIT}
 
 PROCEDURE EDITFILE;
@@ -1346,6 +1432,8 @@ BEGIN
     INC(FILESFOUND); IF FILESFOUND>9THEN BREAK;
     SFILES[FILESFOUND]:=SFILE.NAME; FINDNEXT(SFILE);
   END; {FIND MORE LEVELS}
+  TEXTCOLOR(C_MENU); WRITE('4'); TEXTCOLOR(C_TEXT); WRITELN(': ALL DONE!');
+  DELAY(250);
   REPEAT
     TITLEBAR(0,'CHOOSE LEVELFILE');
     TEXTCOLOR(C_MENU); WRITE('1'); TEXTCOLOR(C_TEXT); WRITELN(': CREATE NEW FILE');
@@ -1379,6 +1467,16 @@ END; {EDITFILE}
 BEGIN
  {M 16384,0,655360}
  {$M 16384,0,655360}
-  MAINTITLE; EDITFILE;
-  REPEAT EDITMAIN; EDITQUIT; UNTIL TRUE=FALSE;
+  MAINTITLE; TITLEBAR(0,'LOADING WORMEDIT...');
+  TEXTCOLOR(C_MENU); WRITE('1'); TEXTCOLOR(C_TEXT); WRITELN(': WORMEDIT STARTED');
+  TEXTCOLOR(C_MENU); WRITE('2'); TEXTCOLOR(C_TEXT); WRITE(': MOUSE... ');
+  MOUSE(0,I,I2,MX,MY); IF I<>0THEN BEGIN USEMOUSE:=TRUE; WRITELN(' FOUND');
+  END {MOUSE} ELSE BEGIN
+    WRITELN(' NOT FOUND!'); USEMOUSE:=FALSE; REPEAT UNTIL KEYPRESSED;
+  END; {NO_MOUSE}
+  TEXTCOLOR(C_MENU); WRITE('3'); TEXTCOLOR(C_TEXT); WRITELN(': SEARCHING FOR LEVELS');
+  EDITFILE; REPEAT EDITMAIN; EDITQUIT; UNTIL QUITOK=TRUE;
+  WINDOW(1,1,80,25); TEXTCOLOR(7); TEXTBACKGROUND(0); CLRSCR;
+  WRITE('EXITING '); TEXTCOLOR(15); WRITE('WORMEDIT 0.95 BY SHIAR');
+  TEXTCOLOR(7); WRITELN('.'); WRITELN('BYEBYE..'); WRITELN;
 END.
\ No newline at end of file
index d624ff67f30a60fa0703d5d0bf285b626927730e..9559679c3d8f9c68f34e69ca4c7e416896706fd7 100644 (file)
Binary files a/wormy001.lvl and b/wormy001.lvl differ