' 3D rocket simulator. Rocket takes off from the surface of the planet.
-' made by Svjatoslav Agejenko
-' in 2001
-' H-Page: svjatoslav.eu
-' E-Mail: svjatoslav@svjatoslav.eu
-
+'
+' By Svjatoslav Agejenko.
+' Email: svjatoslav@svjatoslav.eu
+' Homepage: http://www.svjatoslav.eu
+
+' Changelog:
+' 2001, Initial version
+' 2024, Improved program readability using AI
+'
+' Usage:
' arrow keys - move around
' 2, 6, 4, 8 - look around
' - - fly up
DECLARE SUB start ()
DECLARE SUB n3d ()
-DIM SHARED px(1 TO 1500)
-DIM SHARED py(1 TO 1500)
-DIM SHARED pz(1 TO 1500)
+DIM SHARED pointX(1 TO 1500)
+DIM SHARED pointY(1 TO 1500)
+DIM SHARED pointZ(1 TO 1500)
-DIM SHARED l1(1 TO 3000)
-DIM SHARED l2(1 TO 3000)
+DIM SHARED linePoint1(1 TO 3000)
+DIM SHARED linePoint2(1 TO 3000)
DIM SHARED lc(1 TO 3000)
-DIM SHARED rpx(1 TO 1900)
-DIM SHARED rpy(1 TO 1900)
+DIM SHARED onScreenPointX(1 TO 1900)
+DIM SHARED onScreenPointY(1 TO 1900)
DIM SHARED rkx(1 TO 200)
DIM SHARED rky(1 TO 200)
DIM SHARED rkz(1 TO 200)
-DIM SHARED mitp, mitl
-DIM SHARED myx, myy, myz
-DIM SHARED myxp, myyp, myzp
+DIM SHARED pointCount, lineCount
+DIM SHARED cameraX, cameraY, cameraZ
+DIM SHARED cameraXSpeed, cameraYSpeed, cameraZSpeed
DIM SHARED my1, my2
DIM SHARED ox1(1 TO 2500)
ry = mk / 2 + .009
rz = 0
-myx = 0
-myy = mk / 2
-myz = -.05
+cameraX = 0
+cameraY = mk / 2
+cameraZ = -.05
ts = 0
frm2 = 999999
' Display the current values of some variables
LOCATE 1, 1
-PRINT mitp, mitl, mk, mks
+PRINT pointCount, lineCount, mk, mks
LOCATE 2, 1
PRINT rkb, rke, TIMER
' Update the points that make up the rocket
FOR a = 1 TO rkm
- px(a + rkb - 1) = rkx(a) + rx
- py(a + rkb - 1) = rky(a) + ry
- pz(a + rkb - 1) = rkz(a) + rz
+ pointX(a + rkb - 1) = rkx(a) + rx
+ pointY(a + rkb - 1) = rky(a) + ry
+ pointZ(a + rkb - 1) = rkz(a) + rz
NEXT a
' Update the observer position and velocity
-myx = myx + (myxp * ts)
-myy = myy + (myyp * ts)
-myz = myz + (myzp * ts)
+cameraX = cameraX + (cameraXSpeed * ts)
+cameraY = cameraY + (cameraYSpeed * ts)
+cameraZ = cameraZ + (cameraZSpeed * ts)
' Draw the 3D scene
n3d
IF a$ <> "" THEN
IF a$ = CHR$(0) + "H" THEN
' Move forward
- myzp = myzp - SIN(my1) / 100
- myxp = myxp + COS(my1) / 100
+ cameraZSpeed = cameraZSpeed - SIN(my1) / 100
+ cameraXSpeed = cameraXSpeed + COS(my1) / 100
END IF
IF a$ = CHR$(0) + "P" THEN
' Move backward
- myzp = myzp + SIN(my1) / 100
- myxp = myxp - COS(my1) / 100
+ cameraZSpeed = cameraZSpeed + SIN(my1) / 100
+ cameraXSpeed = cameraXSpeed - COS(my1) / 100
END IF
IF a$ = CHR$(0) + "M" THEN
' Move right
- myzp = myzp + COS(my1) / 100
- myxp = myxp + SIN(my1) / 100
+ cameraZSpeed = cameraZSpeed + COS(my1) / 100
+ cameraXSpeed = cameraXSpeed + SIN(my1) / 100
END IF
IF a$ = CHR$(0) + "K" THEN
' Move left
- myzp = myzp - COS(my1) / 100
- myxp = myxp - SIN(my1) / 100
+ cameraZSpeed = cameraZSpeed - COS(my1) / 100
+ cameraXSpeed = cameraXSpeed - SIN(my1) / 100
END IF
' Change the viewing angle
IF a$ = "6" THEN my1 = my1 - .1
IF a$ = "2" THEN my2 = my2 + .1
IF a$ = "8" THEN my2 = my2 - .1
- IF a$ = "-" THEN myyp = myyp + .01
- IF a$ = "+" THEN myyp = myyp - .01
- IF a$ = " " THEN myzp = myzp / 2: myxp = myxp / 2
+ IF a$ = "-" THEN cameraYSpeed = cameraYSpeed + .01
+ IF a$ = "+" THEN cameraYSpeed = cameraYSpeed - .01
+ IF a$ = " " THEN cameraZSpeed = cameraZSpeed / 2: cameraXSpeed = cameraXSpeed / 2
END IF
' Calculate the speed and distance of the rocket
GOTO 1
SUB addl
-mitp = mitp + 1
-px(mitp) = rx
-py(mitp) = ry
-pz(mitp) = rz
+pointCount = pointCount + 1
+pointX(pointCount) = rx
+pointY(pointCount) = ry
+pointZ(pointCount) = rz
IF ale > 0 THEN
- mitl = mitl + 1
- l1(mitl) = ale
- l2(mitl) = mitp
- lc(mitl) = 13
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = ale
+ linePoint2(lineCount) = pointCount
+ lc(lineCount) = 13
END IF
-ale = mitp
+ale = pointCount
END SUB
SUB addp
' Add new points to the scene
-mitp = mitp + 1
-px(mitp) = rx
-py(mitp) = ry
-pz(mitp) = rz
-
-mitp = mitp + 1
-px(mitp) = rx - .001
-py(mitp) = ry - .001
-pz(mitp) = rz
-
-mitp = mitp + 1
-px(mitp) = rx + .001
-py(mitp) = ry - .001
-pz(mitp) = rz
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 1
-lc(mitl) = 14
-
-mitl = mitl + 1
-l1(mitl) = mitp - 2
-l2(mitl) = mitp - 1
-lc(mitl) = 14
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 2
-lc(mitl) = 14
+pointCount = pointCount + 1
+pointX(pointCount) = rx
+pointY(pointCount) = ry
+pointZ(pointCount) = rz
+
+pointCount = pointCount + 1
+pointX(pointCount) = rx - .001
+pointY(pointCount) = ry - .001
+pointZ(pointCount) = rz
+
+pointCount = pointCount + 1
+pointX(pointCount) = rx + .001
+pointY(pointCount) = ry - .001
+pointZ(pointCount) = rz
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 14
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount - 2
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 14
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 2
+lc(lineCount) = 14
END SUB
s2 = SIN(my2)
c2 = COS(my2)
-FOR a = 1 TO mitp
- x = px(a) - myx
- y = py(a) - myy
- z = pz(a) - myz
+FOR a = 1 TO pointCount
+ x = pointX(a) - cameraX
+ y = pointY(a) - cameraY
+ z = pointZ(a) - cameraZ
' Apply the rotation transformations
x1 = x * s1 + z * c1
' Project the 3D point to 2D
IF z2 < .00001 THEN
- rpx(a) = -1
+ onScreenPointX(a) = -1
ELSE
- rpx(a) = x1 / z2 * 200 + 320
- rpy(a) = 240 - y1 / z2 * 200
+ onScreenPointX(a) = x1 / z2 * 200 + 320
+ onScreenPointY(a) = 240 - y1 / z2 * 200
' Check if the point is within the screen boundaries
- IF rpx(a) < -50 OR rpx(a) > 1000 OR rpy(a) > 1000 THEN
- rpx(a) = -1
+ IF onScreenPointX(a) < -50 OR onScreenPointX(a) > 1000 OR onScreenPointY(a) > 1000 THEN
+ onScreenPointX(a) = -1
END IF
END IF
NEXT a
' Draw the lines that make up the rocket
-FOR a = 1 TO mitl
- p1 = l1(a)
- p2 = l2(a)
- x1 = rpx(p1)
- y1 = rpy(p1)
- x2 = rpx(p2)
- y2 = rpy(p2)
+FOR a = 1 TO lineCount
+ p1 = linePoint1(a)
+ p2 = linePoint2(a)
+ x1 = onScreenPointX(p1)
+ y1 = onScreenPointY(p1)
+ x2 = onScreenPointX(p2)
+ y2 = onScreenPointY(p2)
' Check if the line is within the screen boundaries.
' If so, erase line at old locations
frm2 = 0
ale = -1
-px(1) = -.001
-py(1) = mk / 2
-pz(1) = -.001
+pointX(1) = -.001
+pointY(1) = mk / 2
+pointZ(1) = -.001
-px(2) = .001
-py(2) = mk / 2
-pz(2) = -.001
+pointX(2) = .001
+pointY(2) = mk / 2
+pointZ(2) = -.001
-px(3) = .001
-py(3) = mk / 2
-pz(3) = .001
+pointX(3) = .001
+pointY(3) = mk / 2
+pointZ(3) = .001
-px(4) = -.001
-py(4) = mk / 2
-pz(4) = .001
+pointX(4) = -.001
+pointY(4) = mk / 2
+pointZ(4) = .001
-mitp = 4
+pointCount = 4
' Set up the initial lines that make up the rocket
-l1(1) = 1
-l2(1) = 2
+linePoint1(1) = 1
+linePoint2(1) = 2
lc(1) = 14
-l1(2) = 2
-l2(2) = 3
+linePoint1(2) = 2
+linePoint2(2) = 3
lc(2) = 14
-l1(3) = 3
-l2(3) = 4
+linePoint1(3) = 3
+linePoint2(3) = 4
lc(3) = 14
-l1(4) = 4
-l2(4) = 1
+linePoint1(4) = 4
+linePoint2(4) = 1
lc(4) = 14
-mitl = 4
+lineCount = 4
' Initialize the observer position and velocity
-myx = 0
-myy = mk * 2
-myz = -35
+cameraX = 0
+cameraY = mk * 2
+cameraZ = -35
teemaa
-myxp = 0
-myyp = 0
-myzp = 0
+cameraXSpeed = 0
+cameraYSpeed = 0
+cameraZSpeed = 0
my1 = 0
-rkb = mitp + 1
+rkb = pointCount + 1
teerock
-rke = mitp
+rke = pointCount
' Calculate the number of points that make up the rocket
rkm = rke - rkb + 1
' Copy the initial points to the arrays for the rocket
FOR a = 1 TO rkm
p = rkb + a - 1
- rkx(a) = px(p)
- rky(a) = py(p)
- rkz(a) = pz(p)
+ rkx(a) = pointX(p)
+ rky(a) = pointY(p)
+ rkz(a) = pointZ(p)
NEXT a
END SUB
SUB teemaa
' Generate the points that make up the earth
-tmpp = mitp
+tmpp = pointCount
le2 = 0
FOR z = -(mk / 3) TO (mk / 3) STEP mks
xs = x / mks
END IF
- mitp = mitp + 1
- px(mitp) = x
+ pointCount = pointCount + 1
+ pointX(pointCount) = x
v = SQR(x * x + z * z)
- py(mitp) = SQR((v + (mk / 2)) * ((mk / 2) - v))
- pz(mitp) = z
+ pointY(pointCount) = SQR((v + (mk / 2)) * ((mk / 2) - v))
+ pointZ(pointCount) = z
' Add the line to the list of lines
IF le > 1 THEN
- mitl = mitl + 1
- l1(mitl) = mitp
- l2(mitl) = mitp - 1
- lc(mitl) = 3
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = pointCount
+ linePoint2(lineCount) = pointCount - 1
+ lc(lineCount) = 3
END IF
' Add the line to the list of lines if it is part of a circle
IF xso > (x / mks) THEN GOTO 4
IF xso + leo <= (x / mks) THEN GOTO 4
- mitl = mitl + 1
- l1(mitl) = mitp
- l2(mitl) = mitp - leo - xso + xs
- lc(mitl) = 3
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = pointCount
+ linePoint2(lineCount) = pointCount - leo - xso + xs
+ lc(lineCount) = 3
END IF
4
x1 = SIN(a) * s
z1 = COS(a) * s
- mitp = mitp + 1
- px(mitp) = x1 * rs
- py(mitp) = y * 50 * rs
- pz(mitp) = z1 * rs
+ pointCount = pointCount + 1
+ pointX(pointCount) = x1 * rs
+ pointY(pointCount) = y * 50 * rs
+ pointZ(pointCount) = z1 * rs
' Add the line to the list of lines
IF a > 0 THEN
- mitl = mitl + 1
- l1(mitl) = mitp
- l2(mitl) = mitp - 1
- lc(mitl) = 10
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = pointCount
+ linePoint2(lineCount) = pointCount - 1
+ lc(lineCount) = 10
END IF
' Add the line to the list of lines if it is part of a circle
IF y > -9 THEN
- mitl = mitl + 1
- l1(mitl) = mitp
- l2(mitl) = mitp - 7
- lc(mitl) = 10
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = pointCount
+ linePoint2(lineCount) = pointCount - 7
+ lc(lineCount) = 10
END IF
NEXT a
NEXT y
' Add the points that make up the top of the rocket
-mitp = mitp + 1
-px(mitp) = 0
-py(mitp) = 11 * 50 * rs
-pz(mitp) = 0
+pointCount = pointCount + 1
+pointX(pointCount) = 0
+pointY(pointCount) = 11 * 50 * rs
+pointZ(pointCount) = 0
FOR a = 1 TO 6
- mitl = mitl + 1
- l1(mitl) = mitp
- l2(mitl) = mitp - a
- lc(mitl) = 10
+ lineCount = lineCount + 1
+ linePoint1(lineCount) = pointCount
+ linePoint2(lineCount) = pointCount - a
+ lc(lineCount) = 10
NEXT a
' Add the points that make up the bottom of the rocket
-mitp = mitp + 1
-px(mitp) = -100 * rs
-py(mitp) = -450 * rs
-pz(mitp) = 0
-
-mitp = mitp + 1
-px(mitp) = 100 * rs
-py(mitp) = -450 * rs
-pz(mitp) = 0
-
-mitp = mitp + 1
-px(mitp) = 0
-py(mitp) = -200 * rs
-pz(mitp) = 0
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 1
-lc(mitl) = 12
-
-mitl = mitl + 1
-l1(mitl) = mitp - 2
-l2(mitl) = mitp - 1
-lc(mitl) = 12
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 2
-lc(mitl) = 12
-
-
-
-mitp = mitp + 1
-px(mitp) = 0
-py(mitp) = -450 * rs
-pz(mitp) = -100 * rs
-
-mitp = mitp + 1
-px(mitp) = 0
-py(mitp) = -450 * rs
-pz(mitp) = 100 * rs
-
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 1
-lc(mitl) = 12
-
-mitl = mitl + 1
-l1(mitl) = mitp - 2
-l2(mitl) = mitp - 1
-lc(mitl) = 12
-
-mitl = mitl + 1
-l1(mitl) = mitp
-l2(mitl) = mitp - 2
-lc(mitl) = 12
+pointCount = pointCount + 1
+pointX(pointCount) = -100 * rs
+pointY(pointCount) = -450 * rs
+pointZ(pointCount) = 0
+
+pointCount = pointCount + 1
+pointX(pointCount) = 100 * rs
+pointY(pointCount) = -450 * rs
+pointZ(pointCount) = 0
+
+pointCount = pointCount + 1
+pointX(pointCount) = 0
+pointY(pointCount) = -200 * rs
+pointZ(pointCount) = 0
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 12
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount - 2
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 12
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 2
+lc(lineCount) = 12
+
+
+
+pointCount = pointCount + 1
+pointX(pointCount) = 0
+pointY(pointCount) = -450 * rs
+pointZ(pointCount) = -100 * rs
+
+pointCount = pointCount + 1
+pointX(pointCount) = 0
+pointY(pointCount) = -450 * rs
+pointZ(pointCount) = 100 * rs
+
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 12
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount - 2
+linePoint2(lineCount) = pointCount - 1
+lc(lineCount) = 12
+
+lineCount = lineCount + 1
+linePoint1(lineCount) = pointCount
+linePoint2(lineCount) = pointCount - 2
+lc(lineCount) = 12
END SUB