DECLARE SUB ruut (x!, y!, z!) ' use: ' arrow keys - move around ' 2, 6, 4, 8 - look around ' - - fly up ' + - fly down DECLARE SUB mkkoll () DECLARE SUB putkol () DECLARE SUB rend () DECLARE SUB env () DECLARE SUB start () DIM SHARED npo, nlo, np, nl DIM SHARED px(1 TO 3000) DIM SHARED py(1 TO 3000) DIM SHARED pz(1 TO 3000) DIM SHARED rpx(1 TO 7000) DIM SHARED rpy(1 TO 7000) DIM SHARED orpx(0 TO 9000) DIM SHARED orpy(0 TO 9000) DIM SHARED onp DIM SHARED lin1(1 TO 3800) DIM SHARED lin2(1 TO 3800) DIM SHARED linc(1 TO 3800) DIM SHARED olin1(1 TO 3800) DIM SHARED olin2(1 TO 3800) DIM SHARED onl DIM SHARED myx, myy, myz DIM SHARED myxs, myys, myzs DIM SHARED an1, an2 DIM SHARED an1s, an2s DIM SHARED frm DIM SHARED life(1 TO 50, 1 TO 50) DIM SHARED life2(1 TO 50, 1 TO 50) start 'env an1 = 1.5 1 frm = frm + 1 mkkoll rend myx = SIN(frm / 20) * 12 myy = SIN(frm / 50) * 10 + 15 myz = COS(frm / 20) * 12 an1 = an1 - .05 an2 = 2.2 + SIN(frm / 50) / 2 a$ = INKEY$ IF a$ <> "" THEN SYSTEM END IF GOTO 1 SUB env FOR z = -5 TO 5 FOR x = -5 TO 5 np = np + 1 px(np) = x py(np) = 0 pz(np) = z IF x > -5 THEN nl = nl + 1 lin1(nl) = np lin2(nl) = np - 1 linc(nl) = 1 END IF IF z > -5 THEN nl = nl + 1 lin1(nl) = np lin2(nl) = np - 11 linc(nl) = 1 END IF NEXT x NEXT z npo = np nlo = nl END SUB SUB env1 np = 1 px(np) = -2 py(np) = 0 pz(np) = 0 np = np + 1 px(np) = 2 py(np) = 0 pz(np) = 0 nl = 1 lin1(nl) = 1 lin2(nl) = 2 linc(nl) = 14 END SUB SUB mkkoll np = npo nl = nlo FOR y = 1 TO 50 FOR x = 1 TO 50 IF life(x, y) = 1 THEN v = ABS(x - 26) + ABS(y - 26) + frm ruut x - 25, SIN(v / 5) * 5, y - 25 END IF NEXT x NEXT y IF frm \ 10 = frm / 10 THEN FOR y = 2 TO 49 FOR x = 2 TO 49 c = life(x - 1, y - 1) c = c + life(x, y - 1) c = c + life(x + 1, y - 1) c = c + life(x - 1, y) c = c + life(x + 1, y) c = c + life(x - 1, y + 1) c = c + life(x, y + 1) c = c + life(x + 1, y + 1) IF life(x, y) = 1 THEN IF (c > 3) OR (c < 2) THEN life2(x, y) = 0 ELSE life2(x, y) = 1 ELSE IF c = 3 THEN life2(x, y) = 1 ELSE life2(x, y) = 0 END IF NEXT x NEXT y FOR y = 1 TO 50 FOR x = 1 TO 50 life(x, y) = life2(x, y) NEXT x NEXT y END IF END SUB SUB rend s1 = SIN(an1) c1 = COS(an1) s2 = SIN(an2) c2 = COS(an2) FOR a = 1 TO np x = px(a) + myx y = py(a) - myy z = pz(a) + myz x1 = x * s1 - z * c1 z1 = x * c1 + z * s1 y1 = y * s2 - z1 * c2 z2 = y * c2 + z1 * s2 IF z2 < .5 THEN rpx(a) = -1 ELSE rpx(a) = 320 + (x1 / z2 * 400) rpy(a) = 240 - (y1 / z2 * 400) END IF NEXT a FOR a = 1 TO nl l1 = olin1(a) l2 = olin2(a) IF orpx(l1) = -1 OR orpx(l2) = -1 THEN ELSE LINE (orpx(l1), orpy(l1))-(orpx(l2), orpy(l2)), 0 l1 = lin1(a) l2 = lin2(a) IF rpx(l1) = -1 OR rpx(l2) = -1 THEN ELSE LINE (rpx(l1), rpy(l1))-(rpx(l2), rpy(l2)), linc(a) NEXT IF nl < onl THEN FOR a = nl + 1 TO onl l1 = olin1(a) l2 = olin2(a) IF orpx(l1) = -1 OR orpx(l2) = -1 THEN ELSE LINE (orpx(l1), orpy(l1))-(orpx(l2), orpy(l2)), 0 NEXT END IF FOR a = 1 TO np orpx(a) = rpx(a) orpy(a) = rpy(a) NEXT a onp = np FOR a = 1 TO nl olin1(a) = lin1(a) olin2(a) = lin2(a) NEXT a onl = nl END SUB SUB ruut (x, y, z) v = 3 nl = nl + 1 lin1(nl) = np + 1 lin2(nl) = np + 2 linc(nl) = v nl = nl + 1 lin1(nl) = np + 2 lin2(nl) = np + 3 linc(nl) = v nl = nl + 1 lin1(nl) = np + 3 lin2(nl) = np + 4 linc(nl) = v nl = nl + 1 lin1(nl) = np + 4 lin2(nl) = np + 1 linc(nl) = v nl = nl + 1 lin1(nl) = np + 5 lin2(nl) = np + 6 linc(nl) = v nl = nl + 1 lin1(nl) = np + 6 lin2(nl) = np + 7 linc(nl) = v nl = nl + 1 lin1(nl) = np + 7 lin2(nl) = np + 8 linc(nl) = v nl = nl + 1 lin1(nl) = np + 8 lin2(nl) = np + 5 linc(nl) = v nl = nl + 1 lin1(nl) = np + 1 lin2(nl) = np + 5 linc(nl) = v nl = nl + 1 lin1(nl) = np + 2 lin2(nl) = np + 6 linc(nl) = v nl = nl + 1 lin1(nl) = np + 3 lin2(nl) = np + 7 linc(nl) = v nl = nl + 1 lin1(nl) = np + 4 lin2(nl) = np + 8 linc(nl) = v np = np + 1 px(np) = x - .5 py(np) = y pz(np) = z - .5 np = np + 1 px(np) = x + .5 py(np) = y pz(np) = z - .5 np = np + 1 px(np) = x + .5 py(np) = y pz(np) = z + .5 np = np + 1 px(np) = x - .5 py(np) = y pz(np) = z + .5 np = np + 1 px(np) = x - .5 py(np) = y + 1 pz(np) = z - .5 np = np + 1 px(np) = x + .5 py(np) = y + 1 pz(np) = z - .5 np = np + 1 px(np) = x + .5 py(np) = y + 1 pz(np) = z + .5 np = np + 1 px(np) = x - .5 py(np) = y + 1 pz(np) = z + .5 END SUB SUB start SCREEN 12 npo = 0 nlo = 0 np = npo nl = nlo kolm = 50 myx = 4 myy = 15 myz = 17 an1 = 3.14 / 2 - .29 an2 = an1 + 1 FOR a = 1 TO 1000 linc(a) = 4 NEXT a FOR a = 1 TO 1000 olin1(a) = 1 olin2(a) = 1 NEXT a OPEN "3dlife.dat" FOR INPUT AS #1 y = 20 3 IF EOF(1) <> 0 THEN GOTO 4 x = 20 LINE INPUT #1, a$ FOR b = 1 TO LEN(a$) c$ = RIGHT$(LEFT$(a$, b), 1) IF c$ = "#" THEN life(x, y) = 1 x = x + 1 NEXT b y = y + 1 GOTO 3 4 CLOSE #1 END SUB