1 ' Ray casting engine, written by Svjatoslav Agejenko
\r
2 ' E-mail: svjatoslav@svjatoslav.eu
\r
3 ' Homepage: svjatoslav.eu
\r
6 ' Quality will be automatically adjusted,
\r
7 ' to keep constant framerate.
\r
9 ' at least P 200 MHz in DOS mode should be nice.
\r
12 ' Arrow keys - move around
\r
13 ' 4, 6 - turn left, right
\r
14 ' 8, 2 - look up, down
\r
15 ' Enter - Toggle full quality
\r
16 ' Space - jump up (fly)
\r
17 ' ESC - exit program
\r
19 DECLARE SUB makeland ()
\r
20 DECLARE FUNCTION getcol! (r!, g!, b!)
\r
22 DECLARE SUB traceline (x%, y%, xl)
\r
23 DECLARE SUB dispframe ()
\r
24 DECLARE SUB tower (x%, y%)
\r
25 DECLARE SUB square (x1%, y1%, x2%, y2%, c%, h%)
\r
26 DECLARE SUB displand ()
\r
27 DECLARE SUB start ()
\r
28 DECLARE SUB setupal ()
\r
30 DIM SHARED landh(0 TO 180, 0 TO 180)
\r
31 DIM SHARED landc(0 TO 180, 0 TO 180)
\r
33 DIM SHARED zmyx, zmyy, zmyz
\r
34 DIM SHARED myx, myy, myz
\r
35 DIM SHARED zmyan, myan2
\r
36 DIM SHARED ste, stem, dist
\r
37 DIM SHARED tim$, frm, frmrate
\r
39 frmrate = 10 ' Desired framerate.
\r
40 ' Lower framerate, better quality
\r
52 IF tim$ <> TIME$ THEN
\r
54 IF frm > frmrate THEN ste = ste - 1 ELSE ste = ste + 1
\r
55 IF ste < 1 THEN ste = 1
\r
72 CASE CHR$(0) + "H" ' foward
\r
73 zmyx = SIN(zmyan) * 3 + zmyx
\r
74 zmyy = COS(zmyan) * 3 + zmyy
\r
75 CASE CHR$(0) + "P" ' backward
\r
76 zmyx = -SIN(zmyan) * 3 + zmyx
\r
77 zmyy = -COS(zmyan) * 3 + zmyy
\r
78 CASE CHR$(0) + "K" ' left
\r
79 zmyx = COS(zmyan) * 3 + zmyx
\r
80 zmyy = -SIN(zmyan) * 3 + zmyy
\r
81 CASE CHR$(0) + "M" ' left
\r
82 zmyx = -COS(zmyan) * 3 + zmyx
\r
83 zmyy = SIN(zmyan) * 3 + zmyy
\r
86 CASE CHR$(13) ' full quality
\r
88 CASE CHR$(27) ' exit
\r
93 IF zmyx > 170 THEN zmyx = 170
\r
94 IF zmyy > 170 THEN zmyy = 170
\r
95 IF zmyx < 10 THEN zmyx = 10
\r
96 IF zmyy < 10 THEN zmyy = 10
\r
100 IF zmyz < landh(myx, myy) + 10 THEN zmyz = landh(myx, myy) + 10: zmyzs = (zmyzs / 2) + .2
\r
112 FOR z = .5 TO -.5 STEP zst
\r
113 traceline SIN(zmyan + z) * dist + myx, COS(zmyan + z) * dist + myy, l
\r
124 IF z > 120 THEN zs = .7
\r
125 IF z > 160 THEN zs = .6
\r
126 FOR zx = 0 TO 180 STEP zs
\r
127 y1 = landh(zx, z) - 80
\r
130 zx2 = zx1 / z1 * 190
\r
131 zy2 = y1 / z1 * 190
\r
133 LINE (zx2 + 160, 40 - zy2)-(zx2 + 160, 200), landc(zx, z)
\r
138 PRINT "Press any key to continue..."
\r
143 FUNCTION getcol (r, g, b)
\r
144 IF r < 0 THEN r = 0
\r
145 IF g < 0 THEN g = 0
\r
146 IF b < 0 THEN b = 0
\r
147 IF r > 255 THEN r = 255
\r
148 IF g > 255 THEN g = 255
\r
149 IF b > 255 THEN b = 255
\r
150 getcol = INT(r / 43) * 36 + INT(g / 43) * 6 + INT(b / 43)
\r
156 square 0, 0, 180, 180, 15, 0
\r
160 x1 = (x \ 10) MOD 2
\r
161 y1 = (y \ 10) MOD 2
\r
162 c = (x1 + y1) MOD 2
\r
164 landc(x, y) = getcol(0, 0, 250)
\r
166 landc(x, y) = getcol(50, 50, 50)
\r
173 v = SQR((ABS(50 - y)) ^ 2 + (ABS(130 - x)) ^ 2)
\r
174 h = SQR((60 - v) * (60 + v)) - 35
\r
175 IF h > 0 THEN landh(x, y) = h
\r
185 landc(x, y) = getcol(SIN((x + y) / 2) * 125 + 125, SIN(x / 2) * 125 + 125, SIN(y / 2) * 125 + 125)
\r
186 landh(x, y) = 50 - x
\r
190 FOR za = 0 TO 20 STEP .1
\r
191 x = SIN(za) * (1 + (za * 2)) + 100
\r
192 y = COS(za) * (1 + (za * 2)) + 100
\r
194 landc(x + 1, y) = 200
\r
195 landc(x, y + 1) = 200
\r
196 landc(x + 1, y + 1) = 200
\r
216 SUB square (x1, y1, x2, y2, c, h)
\r
229 PRINT "please wait..."
\r
247 FOR a = 10 TO 0 STEP -1
\r
248 square x - a, y - a, x + a, y + a, getcol(100, 0, a * 20), 20 - a
\r
251 square x - 11, y - 11, x - 9, y - 9, getcol(255, 0, 0), 20
\r
252 square x + 9, y - 11, x + 11, y - 9, getcol(0, 255, 0), 20
\r
253 square x - 11, y + 9, x - 9, y + 11, getcol(0, 0, 255), 20
\r
254 square x + 9, y + 9, x + 11, y + 11, getcol(255, 255, 0), 20
\r
259 SUB traceline (x, y, xl%)
\r
262 zpr = myx / (myx - x)
\r
264 y = myy - ((myy - y) * zpr)
\r
268 zpr = myy / (myy - y)
\r
270 x = myx - ((myx - x) * zpr)
\r
274 zpr = (180 - myx) / (x - myx)
\r
276 y = myy - ((myy - y) * zpr)
\r
280 zpr = (180 - myy) / (y - myy)
\r
282 x = myx - ((myx - x) * zpr)
\r
285 lp = SQR(ABS(myx - x) ^ 2 + ABS(myy - y) ^ 2)
\r
297 cx% = xp% * a% / lp% + imyx%
\r
298 cy% = yp% * a% / lp% + imyy%
\r
299 yn% = imyan2% - ((landh(cx%, cy%) - imyz%) / a%) * 300
\r
301 LINE (xl%, yn%)-(xl% + istem%, yo% - 1), landc(cx%, cy%), BF
\r
305 LINE (xl%, yo% - 1)-(xl% + istem%, 0), 0, BF
\r