To run online, click here: RUN ONLINE
	
	
	
	
	
Code:
' PROGRAM Cannonball
' Demo for the Pascalated language
' 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>
'--- Pascalated Boriel ---
'#define CONST     CONST
#define VAR       DIM
#define INTEGER   LONG
#define REAL      FLOAT
#define BOOLEAN   LONG
#define TYPE      AS
#define REPEAT    DO
#define UNTIL     LOOP UNTIL
#define PROCEDURE SUB
#define PROGRAM   REM
VAR     TRUE      TYPE INTEGER = 1 
VAR     FALSE     TYPE INTEGER = 0 
' Variable Declarations
CONST gravity TYPE REAL = 9.8
CONST power TYPE REAL = 10.0
CONST k TYPE REAL = 0.04
VAR near TYPE BOOLEAN
' Variable Declarations
VAR enemies TYPE INTEGER 
VAR angle TYPE REAL
VAR G,H TYPE REAL ' target coordinates
PROCEDURE GameOver
INK 1
PRINT AT 21,0;" Well done!"
PRINT AT 21,17;" Goodbye!"
END PROCEDURE
PROCEDURE Boom
LET enemies=enemies-1
INK 0
PRINT PAPER 6;AT 0,15;" Enemies: ";enemies;"  "
INK 3
OVER 1
CIRCLE G,H,4
REM +
PLOT G+5,H: DRAW 5,0
PLOT G,H+5: DRAW 0,5
PLOT G-5,H: DRAW -5,0
PLOT G,H-5: DRAW 0,-5
REM X
PLOT G+5,H+5: DRAW 5,5
PLOT G-5,H+5: DRAW -5,5
PLOT G-5,H-5: DRAW -5,-5
PLOT G+5,H-5: DRAW 5,-5
OVER 0
:FOR q=5 TO 1 STEP -.4: BEEP .01,q: NEXT q
PAUSE 88
END PROCEDURE
PROCEDURE DrawShot
VAR X,Y TYPE REAL
VAR X0,Y0 TYPE REAL
VAR X1,Y1 TYPE REAL
VAR DX,DY TYPE REAL
' 
LET X=0.0 : LET DX=power*COS(angle)
LET Y=88.0 : LET DY=power*SIN(angle)
LET X1=X : LET Y1 = Y
LET X0=X1 : LET Y0 = Y1
INK 3
PLOT X1,Y1
REPEAT 
  DRAW X1-X0,Y1-Y0
  LET X0=X1 : LET Y0 = Y1
  LET DY=DY-k*gravity : REM gravity
  LET X=X+DX : REM differential increment
  LET Y=Y+DY : REM differential increment
  LET X1=INT(X+0.5)
  LET Y1=INT(Y+0.5)
  IF Y1>175 THEN LET Y1=175
  LET dist = SQR( (Y-H)*(Y-H) + (X-G)*(X-G) )
  LET near = dist < 0.5*(ABS(DY)+ABS(DX)) 
UNTIL X>255 OR Y<0 OR near
END PROCEDURE
PROCEDURE InputAngle
REPEAT 
  PRINT AT 21,0;"Angle = ";
  angle = VAL INPUT(9)
UNTIL angle>-90 AND angle<90
PRINT angle
LET angle = angle*PI/180 : REM degrees to radians
RANDOMIZE
END PROCEDURE
PROCEDURE SetTarget
LET G=INT (RND*120+60)
LET H=INT (RND*110+35)
INK 1
CIRCLE G,H,4
END PROCEDURE
PROCEDURE DrawScreen
CLS
PRINT INVERSE 1;" CANNONBALL ";
PRINT AT 23,1;INK 6;"Pascalated BASIC Contest demo";
INK 0
PRINT PAPER 6;AT 0,15;" Enemies: ";enemies;"  "
PLOT 0,0: DRAW 0,175: PLOT 0,88: DRAW 255,0
END PROCEDURE
PROCEDURE Shot
DrawScreen
SetTarget
InputAngle
DrawShot
IF near THEN Boom
END PROCEDURE
PROCEDURE InitVariables
LET enemies = 10
RANDOMIZE
END PROCEDURE
PROCEDURE PlayGame
InitVariables
REPEAT 
  Shot
UNTIL enemies = 0
GameOver
END PROCEDURE
PROGRAM CANNONBALL
REM BALA 5 - differential version
REM (c) 2023 by Zarsoft
PlayGame
' last 2 lines are going to be deleted
PRINT AT 23,0;
END PROGRAM
