fixed file permissions
[qbasicapps.git] / graphics / 3D / 3dlife.bas
1 DECLARE SUB ruut (x!, y!, z!)\r
2 ' use:\r
3 ' arrow keys - move around\r
4 ' 2, 6, 4, 8 - look around\r
5 ' -          - fly up\r
6 ' +          - fly down\r
7 \r
8 \r
9 \r
10 DECLARE SUB mkkoll ()\r
11 DECLARE SUB putkol ()\r
12 DECLARE SUB rend ()\r
13 DECLARE SUB env ()\r
14 DECLARE SUB start ()\r
15 DIM SHARED npo, nlo, np, nl\r
16 DIM SHARED px(1 TO 3000)\r
17 DIM SHARED py(1 TO 3000)\r
18 DIM SHARED pz(1 TO 3000)\r
19 DIM SHARED rpx(1 TO 7000)\r
20 DIM SHARED rpy(1 TO 7000)\r
21 DIM SHARED orpx(0 TO 9000)\r
22 DIM SHARED orpy(0 TO 9000)\r
23 DIM SHARED onp\r
24 DIM SHARED lin1(1 TO 3800)\r
25 DIM SHARED lin2(1 TO 3800)\r
26 DIM SHARED linc(1 TO 3800)\r
27 DIM SHARED olin1(1 TO 3800)\r
28 DIM SHARED olin2(1 TO 3800)\r
29 DIM SHARED onl\r
30 DIM SHARED myx, myy, myz\r
31 DIM SHARED myxs, myys, myzs\r
32 DIM SHARED an1, an2\r
33 DIM SHARED an1s, an2s\r
34 DIM SHARED frm\r
35 \r
36 DIM SHARED life(1 TO 50, 1 TO 50)\r
37 DIM SHARED life2(1 TO 50, 1 TO 50)\r
38 \r
39 \r
40 \r
41 start\r
42 'env\r
43 \r
44 an1 = 1.5\r
45 1\r
46 frm = frm + 1\r
47 \r
48 mkkoll\r
49 rend\r
50 \r
51 myx = SIN(frm / 20) * 12\r
52 myy = SIN(frm / 50) * 10 + 15\r
53 myz = COS(frm / 20) * 12\r
54 \r
55 an1 = an1 - .05\r
56 an2 = 2.2 + SIN(frm / 50) / 2\r
57 \r
58 a$ = INKEY$\r
59 IF a$ <> "" THEN\r
60   SYSTEM\r
61 END IF\r
62 GOTO 1\r
63 \r
64 SUB env\r
65 \r
66 FOR z = -5 TO 5\r
67 FOR x = -5 TO 5\r
68 np = np + 1\r
69 px(np) = x\r
70 py(np) = 0\r
71 pz(np) = z\r
72 IF x > -5 THEN\r
73 nl = nl + 1\r
74 lin1(nl) = np\r
75 lin2(nl) = np - 1\r
76 linc(nl) = 1\r
77 END IF\r
78 IF z > -5 THEN\r
79 nl = nl + 1\r
80 lin1(nl) = np\r
81 lin2(nl) = np - 11\r
82 linc(nl) = 1\r
83 END IF\r
84 NEXT x\r
85 NEXT z\r
86 \r
87 npo = np\r
88 nlo = nl\r
89 \r
90 \r
91 END SUB\r
92 \r
93 SUB env1\r
94 \r
95 np = 1\r
96 px(np) = -2\r
97 py(np) = 0\r
98 pz(np) = 0\r
99 np = np + 1\r
100 px(np) = 2\r
101 py(np) = 0\r
102 pz(np) = 0\r
103 \r
104 nl = 1\r
105 lin1(nl) = 1\r
106 lin2(nl) = 2\r
107 linc(nl) = 14\r
108 \r
109 END SUB\r
110 \r
111 SUB mkkoll\r
112 np = npo\r
113 nl = nlo\r
114 \r
115 FOR y = 1 TO 50\r
116   FOR x = 1 TO 50\r
117     IF life(x, y) = 1 THEN\r
118        v = ABS(x - 26) + ABS(y - 26) + frm\r
119        ruut x - 25, SIN(v / 5) * 5, y - 25\r
120     END IF\r
121  NEXT x\r
122 NEXT y\r
123 \r
124 \r
125 \r
126 IF frm \ 10 = frm / 10 THEN\r
127 \r
128 FOR y = 2 TO 49\r
129 FOR x = 2 TO 49\r
130 c = life(x - 1, y - 1)\r
131 c = c + life(x, y - 1)\r
132 c = c + life(x + 1, y - 1)\r
133 c = c + life(x - 1, y)\r
134 c = c + life(x + 1, y)\r
135 c = c + life(x - 1, y + 1)\r
136 c = c + life(x, y + 1)\r
137 c = c + life(x + 1, y + 1)\r
138 \r
139 IF life(x, y) = 1 THEN\r
140   IF (c > 3) OR (c < 2) THEN life2(x, y) = 0 ELSE life2(x, y) = 1\r
141 ELSE\r
142   IF c = 3 THEN life2(x, y) = 1 ELSE life2(x, y) = 0\r
143 END IF\r
144 NEXT x\r
145 NEXT y\r
146 \r
147 \r
148 FOR y = 1 TO 50\r
149 FOR x = 1 TO 50\r
150   life(x, y) = life2(x, y)\r
151 NEXT x\r
152 NEXT y\r
153 END IF\r
154 \r
155 END SUB\r
156 \r
157 SUB rend\r
158 \r
159 \r
160 s1 = SIN(an1)\r
161 c1 = COS(an1)\r
162 s2 = SIN(an2)\r
163 c2 = COS(an2)\r
164 \r
165 FOR a = 1 TO np\r
166 x = px(a) + myx\r
167 y = py(a) - myy\r
168 z = pz(a) + myz\r
169       \r
170 x1 = x * s1 - z * c1\r
171 z1 = x * c1 + z * s1\r
172 y1 = y * s2 - z1 * c2\r
173 z2 = y * c2 + z1 * s2\r
174     \r
175 IF z2 < .5 THEN\r
176 rpx(a) = -1\r
177 ELSE\r
178 rpx(a) = 320 + (x1 / z2 * 400)\r
179 rpy(a) = 240 - (y1 / z2 * 400)\r
180 END IF\r
181 NEXT a\r
182     \r
183 \r
184 FOR a = 1 TO nl\r
185 l1 = olin1(a)\r
186 l2 = olin2(a)\r
187 \r
188 IF orpx(l1) = -1 OR orpx(l2) = -1 THEN  ELSE LINE (orpx(l1), orpy(l1))-(orpx(l2), orpy(l2)), 0\r
189 l1 = lin1(a)\r
190 l2 = lin2(a)\r
191 IF rpx(l1) = -1 OR rpx(l2) = -1 THEN  ELSE LINE (rpx(l1), rpy(l1))-(rpx(l2), rpy(l2)), linc(a)\r
192 NEXT\r
193 \r
194 IF nl < onl THEN\r
195 FOR a = nl + 1 TO onl\r
196 l1 = olin1(a)\r
197 l2 = olin2(a)\r
198 IF orpx(l1) = -1 OR orpx(l2) = -1 THEN  ELSE LINE (orpx(l1), orpy(l1))-(orpx(l2), orpy(l2)), 0\r
199 NEXT\r
200 END IF\r
201 \r
202 FOR a = 1 TO np\r
203 orpx(a) = rpx(a)\r
204 orpy(a) = rpy(a)\r
205 NEXT a\r
206 onp = np\r
207 \r
208 FOR a = 1 TO nl\r
209 olin1(a) = lin1(a)\r
210 olin2(a) = lin2(a)\r
211 NEXT a\r
212 onl = nl\r
213 \r
214 END SUB\r
215 \r
216 SUB ruut (x, y, z)\r
217 \r
218 v = 3\r
219 \r
220 nl = nl + 1\r
221 lin1(nl) = np + 1\r
222 lin2(nl) = np + 2\r
223 linc(nl) = v\r
224 \r
225 nl = nl + 1\r
226 lin1(nl) = np + 2\r
227 lin2(nl) = np + 3\r
228 linc(nl) = v\r
229 \r
230 nl = nl + 1\r
231 lin1(nl) = np + 3\r
232 lin2(nl) = np + 4\r
233 linc(nl) = v\r
234 \r
235 nl = nl + 1\r
236 lin1(nl) = np + 4\r
237 lin2(nl) = np + 1\r
238 linc(nl) = v\r
239 \r
240 nl = nl + 1\r
241 lin1(nl) = np + 5\r
242 lin2(nl) = np + 6\r
243 linc(nl) = v\r
244 \r
245 nl = nl + 1\r
246 lin1(nl) = np + 6\r
247 lin2(nl) = np + 7\r
248 linc(nl) = v\r
249 \r
250 nl = nl + 1\r
251 lin1(nl) = np + 7\r
252 lin2(nl) = np + 8\r
253 linc(nl) = v\r
254 \r
255 nl = nl + 1\r
256 lin1(nl) = np + 8\r
257 lin2(nl) = np + 5\r
258 linc(nl) = v\r
259 \r
260 nl = nl + 1\r
261 lin1(nl) = np + 1\r
262 lin2(nl) = np + 5\r
263 linc(nl) = v\r
264 \r
265 nl = nl + 1\r
266 lin1(nl) = np + 2\r
267 lin2(nl) = np + 6\r
268 linc(nl) = v\r
269 \r
270 nl = nl + 1\r
271 lin1(nl) = np + 3\r
272 lin2(nl) = np + 7\r
273 linc(nl) = v\r
274 \r
275 nl = nl + 1\r
276 lin1(nl) = np + 4\r
277 lin2(nl) = np + 8\r
278 linc(nl) = v\r
279 \r
280 np = np + 1\r
281 px(np) = x - .5\r
282 py(np) = y\r
283 pz(np) = z - .5\r
284 \r
285 np = np + 1\r
286 px(np) = x + .5\r
287 py(np) = y\r
288 pz(np) = z - .5\r
289 \r
290 np = np + 1\r
291 px(np) = x + .5\r
292 py(np) = y\r
293 pz(np) = z + .5\r
294 \r
295 np = np + 1\r
296 px(np) = x - .5\r
297 py(np) = y\r
298 pz(np) = z + .5\r
299 \r
300 \r
301 np = np + 1\r
302 px(np) = x - .5\r
303 py(np) = y + 1\r
304 pz(np) = z - .5\r
305 \r
306 np = np + 1\r
307 px(np) = x + .5\r
308 py(np) = y + 1\r
309 pz(np) = z - .5\r
310 \r
311 np = np + 1\r
312 px(np) = x + .5\r
313 py(np) = y + 1\r
314 pz(np) = z + .5\r
315 \r
316 np = np + 1\r
317 px(np) = x - .5\r
318 py(np) = y + 1\r
319 pz(np) = z + .5\r
320 \r
321 \r
322 END SUB\r
323 \r
324 SUB start\r
325 SCREEN 12\r
326 npo = 0\r
327 nlo = 0\r
328 np = npo\r
329 nl = nlo\r
330 kolm = 50\r
331 \r
332 myx = 4\r
333 myy = 15\r
334 myz = 17\r
335 an1 = 3.14 / 2 - .29\r
336 an2 = an1 + 1\r
337 \r
338 FOR a = 1 TO 1000\r
339 linc(a) = 4\r
340 NEXT a\r
341 \r
342 FOR a = 1 TO 1000\r
343 olin1(a) = 1\r
344 olin2(a) = 1\r
345 NEXT a\r
346 \r
347 \r
348 OPEN "3dlife.dat" FOR INPUT AS #1\r
349 y = 20\r
350 3\r
351 IF EOF(1) <> 0 THEN GOTO 4\r
352 x = 20\r
353 \r
354 LINE INPUT #1, a$\r
355 FOR b = 1 TO LEN(a$)\r
356   c$ = RIGHT$(LEFT$(a$, b), 1)\r
357   IF c$ = "#" THEN life(x, y) = 1\r
358   x = x + 1\r
359 NEXT b\r
360 \r
361 y = y + 1\r
362 GOTO 3\r
363 4\r
364 CLOSE #1\r
365 \r
366 END SUB\r
367 \r