Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pascalated ZX BASIC Demo #22 - Eagle 1
#1
To run online, click here: RUN ONLINE


Code:
' PROGRAM Eagle1 (Lander) ' (c) ZarSoft 2022 Pascalated BASIC ' (c) ZarSoft 2023 Pascalated Boriel ZX BASIC ' Written by Ze Oliveira ' Pascalated Sinclair BASIC (c) 1987 by ZarSoft ' Pascalated BASIC Converter (c) 2021 by Zarsoft ' Pascalated Boriel (c) 2023 by ZarSoft ' ZX BASIC Compiler (c) 2008 by Boriel #include <input.bas>  ' number = VAL INPUT(12) #include <screen.bas> ' SCREEN$ function #include <attr.bas>   ' ATTR function '--- Pascalated Boriel --- #define PROGRAM   REM #define BEGIN REM '#define CONST     CONST #define VAR       DIM #define INTEGER   LONG #define REAL      FLOAT #define CHAR      STRING '#define STRING    STRING #define BOOLEAN   UBYTE #define TYPE      AS '#define WHILE    WHILE #define REPEAT    DO #define UNTIL     LOOP UNTIL #define PROCEDURE  SUB CONST   TRUE      TYPE BOOLEAN = 1 CONST   FALSE     TYPE BOOLEAN = 0 PROGRAM Eagle1 ' CONSTant declarations REM CONSTant declarations CONST black = 0 CONST blue = 1 CONST red = 2 CONST magenta = 3 CONST green = 4 CONST cyan = 5 CONST yellow = 6 CONST white = 7 CONST Gravity TYPE REAL = 1.62 ' gravity on the moon CONST K TYPE REAL = 0.25 CONST Thrust TYPE REAL = 1.1 CONST MaxFuel TYPE REAL = 300 ' VAR - Global variables REM VARiable declarations VAR MinSpeed TYPE REAL = 999 VAR MaxScore TYPE INTEGER = -1 VAR U$(10) ' DIM U$(8,5) : REM Sprites, upper line VAR V$(10) ' DIM V$(8,5) : REM Sprites, bottom line VAR x TYPE INTEGER VAR y TYPE REAL VAR yy TYPE INTEGER VAR Fuel TYPE REAL VAR DY TYPE REAL VAR Landed TYPE BOOLEAN VAR Score TYPE INTEGER VAR T TYPE INTEGER VAR Message TYPE INTEGER PROCEDURE TRON (m$ TYPE STRING) PRINT AT 23,0;INK 5;m$; PAUSE 0 END PROCEDURE PROCEDURE GetReady PRINT AT 11,0;INK 5;"Press 1 to start" REPEAT   PAUSE 0 UNTIL INKEY$ = "1" PRINT AT 11,0;INK 5;"                " END PROCEDURE PROCEDURE Report IF ABS DY < MinSpeed THEN LET MinSpeed = ABS DY LET Score = INT(0.5+(2000+Fuel)/(2^ABS DY)) IF Score <= 1 THEN LET Score = 0 IF Score > MaxScore THEN LET MaxScore = Score PRINT INK 6;AT 1,0;"Height:  ";0;"  " PRINT INK 4;AT 3,0;"MinSpeed:";(STR$ MinSpeed+"    ")(0 TO 2) PRINT INK 4;AT 4,0;"MaxScore:";MaxScore; IF Score = 0   LET m$ = "You fell like a rock!"   LET n$ = "Press 0 to Thrust."   PRINT AT 21,15;OVER 1;PAPER 8;INK 3;"     "; ELSEIF Score < 500   LET m$ = "You are a beginner."   LET n$ = "Try to be an amateur."   PRINT AT 21,15;OVER 1;PAPER 8;INK 6;"     "; ELSEIF Score < 1000   LET m$ = "You are an amateur."   LET n$ = "Try to be a professional."   PRINT AT 21,15;OVER 1;PAPER 8;INK 5;"     "; ELSE   LET m$ = "You are a professional!"   LET n$ = "You are wasting your time here!"   PRINT AT 21,15;OVER 1;PAPER 8;INK 4;"     "; ENDIF PRINT AT 6,0;INK 3;"Score: ";Score PRINT AT 8,0;INK 6;m$ PRINT AT 9,0;INK 6;n$ BEEP 0.1,0: BEEP 0.1,20: BEEP 0.1,10 REM wait a few seconds LET T = PEEK 23672 + 3*50 IF T > 255 THEN LET T = T - 255 REPEAT   PAUSE 1 UNTIL ABS (T - PEEK 23672) < 5 GetReady PRINT AT 6,0;"            " PRINT AT 8,0;INK 4;"                               " PRINT AT 9,0;INK 4;"                               " PRINT AT 20,15;"     "; PRINT AT 21,15;"     "; END PROCEDURE FUNCTION DataStory TYPE STRING VAR r$ TYPE STRING IF Message = 1   r$ = "Hello!" ELSEIF Message = 2   r$ = "Hello!" + CHR(13) + "Do you read me?" ELSEIF Message = 3   r$ = "This is Dr Helena Russel," ELSEIF Message = 4   r$ = "This is Dr Helena Russel," + CHR(13) + "calling Moonbase Alpha." ELSEIF Message = 5   r$ = "We are in danger:" ELSEIF Message = 6   r$ = "We are in danger:" + CHR(13) + "Pilot Alan Carter is sick." ELSEIF Message = 7   r$ = "You need to land the Eagle 1" ELSEIF Message = 8   r$ = "You need to land the Eagle 1" + CHR(13) + "by remote control." ELSEIF Message = 9   r$ = "You are our only hope." + CHR(13) + "God help us!" ENDIF RETURN r$ END FUNCTION PROCEDURE ClearStory PRINT AT  8,0; PRINT " ";TAB 0;" ";TAB 0; PRINT " ";TAB 0;" ";TAB 0; END PROCEDURE PROCEDURE TellStory VAR m$ TYPE STRING ClearStory m$ = DataStory PRINT AT  8,0;INK 6;m$ BEEP 0.1,0: BEEP 0.1,20: BEEP 0.1,10 PAUSE 3*50 LET Message = Message + 1 END PROCEDURE PROCEDURE DrawScreen PRINT PAPER 2;INK 0;BRIGHT 1;AT 0, 22;" EAGLE 1 " PRINT INK 6;AT 0,0;"Fuel:    ";Fuel;" " PRINT INK 6;AT 1,0;"Height:  ";ABS INT y;" " PRINT INK 5;AT 2,0;"Speed:   ";(STR$ ABS DY+"    ")(0 TO 2) END PROCEDURE PROCEDURE InitVariables LET x = 150 LET y = 175-8 LET yy = y LET Fuel = MaxFuel LET DY = 0 LET Landed = FALSE END PROCEDURE PROCEDURE Lander VAR lin TYPE INTEGER VAR ix TYPE INTEGER InitVariables DrawScreen IF MaxScore < 0 THEN GetReady REPEAT   LET k$ = INKEY$   IF k$ = "0" AND Fuel > 0     BEEP .01,30: LET DY = DY + Thrust : LET Fuel = Fuel - 10   ELSE     BEEP .01,-28   ENDIF    LET DY = DY - K*Gravity : REM Gravity   LET y = y + DY   LET yy = INT(y+0.5)   IF yy < 0 THEN LET yy = 0 : LET Landed = TRUE   IF yy > 175-8 THEN LET yy = 175-8   LET lin = 21-INT (yy/8)   LET ix = 1+yy-8*INT(yy/8)   POKE 23606,88 : POKE 23607,251 : REM Sprite   PRINT AT lin-1,15;U$(ix)(1 TO 5)   PRINT AT lin,15;V$(ix)(1 TO 5)   IF lin > 1 THEN PRINT AT lin-2,15;"     "; : IF ABS DY > 8 THEN PRINT AT lin-3,15;"     ";   IF lin < 21 THEN PRINT AT lin+1,15;"     ";   POKE 23606,0 : POKE 23607,60 : REM ZX Chars   PRINT INK 6;AT 0,0;"Fuel:    ";Fuel;" "   PRINT INK 6;AT 1,0;"Height:  ";ABS INT y;" "   PRINT INK 5;AT 2,0;"Speed:   ";(STR$ ABS DY+"   ")(0 TO 2) UNTIL Landed Report END PROCEDURE PROCEDURE RestoreData (s TYPE INTEGER) VAR b,r,n TYPE INTEGER RESTORE FOR b=1 TO s   FOR r=0 TO 4     READ n   NEXT r NEXT b END PROCEDURE PROCEDURE InitSprites CONST RAMTOP = 23730 : REM (87,255) = 65367 = 65535-21*8 CONST SIZE = 936 : REM 96*8 + 21*8 CONST NEWTOP = 64599 : REM 65535-936 REM CLEAR 64599 CONST CHARS = 23606 : REM (0,61-1) = 15616-256 CONST CharsUDG = 65368 : REM USR "A" = 65368 = 65536-21*8 CONST CharsSprites = 64600 : REM 65536-21*8-96*8 REM CharsSprites POKE = (344,251) VAR s,b,r,n TYPE INTEGER VAR dest TYPE INTEGER LET Message = 0 TellStory ' INIT STRINGS FOR s=0 TO 7   LET U$(s+1) = ":12345"   LET V$(s+1) = ":12345" NEXT s REM Define Lines LET n=32 FOR s=0 TO 7   FOR c=0 TO 4     LET U$(s+1)(c+1) = CHR$(n)     LET n = n+1   NEXT c   FOR c=0 TO 4     LET V$(s+1)(c+1) = CHR$(n)     LET n = n+1   NEXT c NEXT s REM Define Sprites FOR s=7 TO 0 STEP -1   TellStory   RestoreData(s)   LET dest = CharsSprites + 2*5*8*s   REM upper line   FOR b=0 TO 7     FOR r=0 TO 4       READ n       POKE dest+b+r*8,n       'TRON("POKE "+STR$ (dest+b+r*8) )     NEXT r   NEXT b   LET dest = dest + 5*8   REM bottom line   FOR b=0 TO 7     FOR r=0 TO 4       READ n       POKE dest+b+r*8,n       'TRON("POKE "+STR$ (dest+b+r*8) )     NEXT r   NEXT b   REM print eagle   POKE 23606,88 : POKE 23607,251 : REM Sprite   PRINT AT 0,15;V$(s+1)(1 TO );   POKE 23606,0 : POKE 23607,60 : REM ZX Chars   'TRON("s "+STR$ s) NEXT s ' show sprites IF FALSE   CLS   c = 1   FOR s=0 TO 7     ' upper     c = 3-c: PAPER c     PRINT U$(s+1);":";     POKE 23606,88 : POKE 23607,251 : REM Sprite     PRINT U$(s+1)(1 TO );     POKE 23606,0 : POKE 23607,60 : REM ZX Chars     PRINT ":"     ' bottom     c = 3-c: PAPER c     PRINT V$(s+1);":";     POKE 23606,88 : POKE 23607,251 : REM Sprite     PRINT V$(s+1)(1 TO );     POKE 23606,0 : POKE 23607,60 : REM ZX Chars     PRINT ":"   NEXT s   PAUSE 0   CLS ENDIF END PROCEDURE PROCEDURE DataSprite DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 01111111, BIN 11111111, BIN 11111111, BIN 11100001 DATA BIN 00011110, BIN 11111111, BIN 11111111, BIN 11111111, BIN 11110111 DATA BIN 01111111, BIN 11111111, BIN 11111111, BIN 11111111, BIN 11111111 DATA BIN 01111111, BIN 11111111, BIN 11111111, BIN 11111111, BIN 11110111 DATA BIN 00011110, BIN 11111111, BIN 11111111, BIN 11111111, BIN 11100001 DATA BIN 00000000, BIN 00011110, BIN 00000000, BIN 00001111, BIN 00000000 DATA BIN 00000000, BIN 00001100, BIN 00000000, BIN 00000110, BIN 00000000 DATA BIN 00000000, BIN 00011110, BIN 00000000, BIN 00001111, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 DATA BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000, BIN 00000000 END PROCEDURE PROCEDURE LoadBackground BORDER 0 : PAPER 0 : INK 7 : CLS LOAD "" SCREEN$ END PROCEDURE PROGRAM Eagle1 REM CLEAR 64599 POKE 23606,0 : POKE 23607,60 : REM ZX Chars PRINT AT 23,0;INK 3;"Pascalated Boriel ZX BASIC demo"; PAUSE 2*50 LoadBackground InitSprites ClearStory REPEAT   Lander UNTIL FALSE GameOver END PROGRAM
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)