(***************************************************************************
*  Programme : turboMCP.mod (not "Master Control Programme" but            *
*                            "Modula-2 Cycle Power)                        *
*  Usage     : turboMCP                                                    *
*  Version   : V1.57                                                       *
*  Date      : 22.-26.03.1989, 09.04.1989                                  *
*  Author    : Jörg Sixt                                                   *
*  Purpose   : a TRON-like game for two players                            *
*  Language  : Modula-2,AMSoft  PD-Version from Fish 113                   *
*  Bugs      : Can't use devices with the demo-version                     *
***************************************************************************)

MODULE turboMCP;

FROM SYSTEM    IMPORT ADR;
FROM Intuition IMPORT ScreenPtr,NewScreen,ScreenFlagSet,OpenScreen,CloseScreen;
FROM Graphics  IMPORT RastPortPtr,ViewModeSet,SetRast,Move,Text,SetAPen,
                      ReadPixel,WritePixel,SetRGB4,ViewPortPtr ;

CONST   WHAT             = 200;

VAR  Taste [12577793] : CHAR;
     Help             : ARRAY[0..25] OF CHAR ;
     MyScrPtr         : ScreenPtr ;
     MyNewScr         : NewScreen ;
     Rast             : RastPortPtr ;
     Viewer           : ViewPortPtr ;
     x                : ARRAY [1..2] OF INTEGER [-1..320] ;
     y                : ARRAY [1..2] OF INTEGER [-1..WHAT] ;
     vx,vy            : ARRAY [1..2] OF INTEGER [-1..1] ;
     Level            : INTEGER [1..10] ;
     i                : INTEGER [1..2] ;
     ExtraWurst       : LONGINT ;
     crash            : BOOLEAN ;
     Color            : INTEGER [-1..15] ;
     Cycle            : INTEGER [-1..15] ;

PROCEDURE SleepTight ;
     BEGIN
          Help[0] := Taste ;
          REPEAT  UNTIL (Help[0] # Taste) ;
     END SleepTight ;


BEGIN
     WITH MyNewScr DO       (* My first Modula-Screen -> a historical moment !! *)
        leftEdge     :=   0 ; topEdge  :=    0 ;
        width        := 320 ; height   := WHAT ; depth := 2 ;
        detailPen    :=   0 ; blockPen :=    0 ;
        viewModes    := ViewModeSet   {} ;
        type         := ScreenFlagSet {} ;
        defaultTitle := NIL ; gadgets  := NIL  ; customBitMap := NIL ;
     END ;

     MyScrPtr := OpenScreen (MyNewScr)   ;
     IF (MyScrPtr = NIL) THEN HALT ; END ;
     Rast     := ADR(MyScrPtr^.rastPort) ;
     Viewer   := ADR(MyScrPtr^.viewPort) ;

     SetRGB4 (Viewer,0, 0, 0, 0) ; SetRGB4 (Viewer,1,15,15,15) ;
     SetRGB4 (Viewer,2,15, 0, 0) ; SetRGB4 (Viewer,3, 0,15, 0) ;

     LOOP
        SetAPen (Rast,1)   ;
        Move (Rast,68, 80) ; Text (Rast,ADR("Modula  Cycle like  Power"),25) ;
        Move (Rast,72,110) ; Text (Rast,ADR("by  sick amiga software")  ,23) ;
        x[1]  :=  39   ; y[1]  := 100 ; vx[1] :=  0 ; vy[1] :=-1 ;
        x[2]  := 279   ; y[2]  := 100 ; vx[2] :=  0 ; vy[2] :=-1 ;
        crash := FALSE ; Level :=  10 ; Color := 15 ; SleepTight ;
        REPEAT
           CASE Taste OF
            (* ESC    *) 165C : EXIT |
            (* SPACE  *) 177C : SleepTight |
            (* CTRL   *)  71C : SetRast (Rast,0) |
            (* UP1    *) 333C : IF vy[1]=0 THEN vx[1]:= 0 ; vy[1]:=-1 ; END |
            (* DOWN1  *) 233C : IF vy[1]=0 THEN vx[1]:= 0 ; vy[1]:= 1 ; END |
            (* RIGHT1 *) 273C : IF vx[1]=0 THEN vx[1]:= 1 ; vy[1]:= 0 ; END |
            (* LEFT1  *) 275C : IF vx[1]=0 THEN vx[1]:=-1 ; vy[1]:= 0 ; END |
            (* UP2    *) 147C : IF vy[2]=0 THEN vx[2]:= 0 ; vy[2]:=-1 ; END |
            (* DOWN2  *) 145C : IF vy[2]=0 THEN vx[2]:= 0 ; vy[2]:= 1 ; END |
            (* RIGHT2 *) 143C : IF vx[2]=0 THEN vx[2]:= 1 ; vy[2]:= 0 ; END |
            (* LEFT2  *) 141C : IF vx[2]=0 THEN vx[2]:=-1 ; vy[2]:= 0 ; END |
            (* Funkey *) 115C..137C :
                                IF ODD(ORD(Taste)) THEN
                                   Level := (ORD(Taste)-75) DIV 2;
                                END |
           ELSE
            (* otherwise the runtime system gets crazy *)
           END;
           FOR i := 1 TO 2 DO
              x[i] := x[i]+vx[i] ; y[i] := y[i]+vy[i] ;
              IF  x[i] =  -1  THEN x[i] :=    319 ; END ;
              IF  x[i] = 320  THEN x[i] :=      0 ; END ;
              IF  y[i] =  -1  THEN y[i] := WHAT-1 ; END ;
              IF  y[i] = WHAT THEN y[i] :=      0 ; END ;
              IF ReadPixel(Rast,x[i],y[i]) # 0 THEN
                 SetAPen (Rast,1)      ; SetRGB4 (Viewer,1,15,15,15) ;
                 crash    := TRUE      ; Help     := "Crash ! Looser is   " ;
                 Help[19] := CHR(i+48) ; Help[20] := "!" ;
                 Move (Rast,84,30)     ; Text (Rast,ADR(Help[0]),21) ;
                 SleepTight            ; SetRast (Rast,0) ;
              ELSE
                 SetAPen(Rast,i+1) ;
                 ExtraWurst := WritePixel(Rast,x[i],y[i]) ;
              END ;
           END;
           IF Color = 15 THEN Cycle := -1 ; END ;
           IF Color =  0 THEN Cycle :=  1 ; END ;
           Color   := Color + Cycle ;
           SetRGB4 (Viewer,1,Color,Color,Color) ;
           FOR ExtraWurst := 0 TO Level*300 DO (* nothing *) END ;
        UNTIL crash ;
     END ;
     CloseScreen (MyScrPtr) ;
END turboMCP.
