[tt]
'A couple hours of hardcore coding & tweaking resulted
'in this. It could probably be mode significantly faster,
'this is more a proof-of-concept work -- a check to make
'sure that I'm still capable of programming these kinds of
'things ;D Enjoy, logiclrd
DECLARE SUB initscreen ()
DECLARE SUB loadfont ()
DIM SHARED font%(1 TO 41, 9, 11)
CONST MAXACTIVE% = 267
CONST MAXSTREAM% = 40
TYPE activeposition
bitmap(9, 11) AS INTEGER
desiredbitmap(9, 11) AS INTEGER
x AS INTEGER
y AS INTEGER
a AS INTEGER
END TYPE
TYPE streamtype
x AS INTEGER
y AS INTEGER
taily AS INTEGER
a AS INTEGER
END TYPE
z% = MAXACTIVE%
DIM SHARED active(z%) AS activeposition, whichactive%(63, 39)
DIM SHARED stream(MAXSTREAM%) AS streamtype, freeactive%(MAXACTIVE%)
DIM SHARED freecolumn%(63), mask%(61), numfreeactives%, numfreecolumns%
loadfont
SCREEN 12
OUT &H3C8, 7
OUT &H3C9, 0
OUT &H3C9, 0
OUT &H3C9, 0
LINE (0, 0)-(9, 11), 7, BF
GET (0, 0)-(9, 11), mask%
LINE (0, 0)-(9, 11), 0, BF
FOR i% = 0 TO 15
OUT &H3C8, i%
OUT &H3C9, 0
OUT &H3C9, i% * 63 \ 15
OUT &H3C9, 0
NEXT i%
FOR i% = 0 TO 63
freecolumn%(i%) = i%
FOR j% = 0 TO 39
whichactive%(i%, j%) = -1
NEXT j%
NEXT i%
FOR i% = 1 TO MAXACTIVE%
freeactive%(i%) = i%
NEXT i%
numfreecolumns% = 64
numfreeactives% = MAXACTIVE% + 1
initscreen
DO
st# = TIMER
IF numfreecolumns% THEN
FOR i% = 0 TO MAXSTREAM%
IF stream(i%).a = 0 THEN
r% = INT(RND * numfreecolumns%)
stream(i%).x = freecolumn%(r%)
numfreecolumns% = numfreecolumns% - 1
freecolumn%(r%) = freecolumn%(numfreecolumns%)
stream(i%).taily = -(INT(RND * 15) + 10)
stream(i%).y = -1
stream(i%).a = 1
EXIT FOR
END IF
NEXT i%
END IF
FOR i% = 0 TO MAXSTREAM%
IF stream(i%).a THEN
IF INT(RND * RND * RND * RND * RND * RND * 7) = 0 THEN stream(i%).y = stream(i%).y + 1
IF INT(RND * RND * RND * RND * RND * RND * 7) = 0 THEN
stream(i%).taily = stream(i%).taily + 1
IF stream(i%).taily = 2 THEN
freecolumn%(numfreecolumns%) = stream(i%).x
numfreecolumns% = numfreecolumns% + 1
END IF
IF stream(i%).taily > 0 THEN
IF stream(i%).taily <= 40 THEN
a% = whichactive%(stream(i%).x, stream(i%).taily - 1)
IF a% >= 0 THEN
active(a%).a = 0
whichactive%(active(a%).x, active(a%).y) = -1
freeactive%(numfreeactives%) = a%
numfreeactives% = numfreeactives% + 1
END IF
END IF
IF stream(i%).taily >= 40 THEN stream(i%).a = 0
PUT (stream(i%).x * 10, stream(i%).taily * 12 - 12), mask%, AND
END IF
END IF
IF (stream(i%).y >= 0) AND (stream(i%).y < 40) THEN
a% = whichactive%(stream(i%).x, stream(i%).y)
IF a% = -1 THEN
IF numfreeactives% = 0 THEN
maxage% = -1
maxagei% = INT(RND * (MAXACTIVES% + 1))
FOR j% = 0 TO MAXACTIVES%
IF active(j%).a > maxage% THEN
maxage% = active(j%).a
maxagei% = j%
END IF
NEXT j%
active(maxagei%).a = 0
whichactive%(active(maxagei%).x, active(maxagei%).y) = -1
freeactive%(numfreeactives%) = maxagei%
numfreeactives% = numfreeactives% + 1
END IF
numfreeactives% = numfreeactives% - 1
a% = freeactive%(numfreeactives%)
whichactive%(stream(i%).x, stream(i%).y) = a%
active(a%).a = 1
active(a%).x = stream(i%).x
bx% = stream(i%).x * 10
active(a%).y = stream(i%).y
by% = stream(i%).y * 12
FOR x% = 0 TO 9
FOR y% = 0 TO 11
active(a%).bitmap(x%, y%) = POINT(bx% + x%, by% + y%)
active(a%).desiredbitmap(x%, y%) = 0
NEXT y%
NEXT x%
END IF
c% = INT(RND * 41) + 1
FOR x% = 0 TO 9
FOR y% = 0 TO 11
bb% = active(a%).bitmap(x%, y%)
db% = active(a%).desiredbitmap(x%, y%)
sum% = bb% + db%
max% = (sum% + ABS](bb% - db%)) \ 2
b% = max% + (sum% - max%) \ 3
IF b% >= 15 THEN active(a%).bitmap(x%, y%) = 15 ELSE active(a%).bitmap(x%, y%) = b%
active(a%).desiredbitmap(x%, y%) = font%(c%, x%, y%)
NEXT y%
NEXT x%
END IF
END IF
NEXT i%
FOR i% = 0 TO MAXACTIVE%
IF active(i%).a THEN
active(i%).a = active(i%).a + 1
bx% = active(i%).x * 10
by% = active(i%).y * 12
correct% = 0
FOR x% = 0 TO 9
FOR y% = 0 TO 11
bb% = active(i%).bitmap(x%, y%)
db% = active(i%).desiredbitmap(x%, y%)
IF bb% > db% THEN
bb% = bb% - 2
IF bb% < db% THEN bb% = db%
ELSE
bb% = db%
END IF
sum% = bb% + db%
max% = (sum% + ABS(bb% - db%)) \ 2
b% = max% + (sum% - max%) \ 3
IF b% >= 15 THEN PSET (bx% + x%, by% + y%), 15 ELSE PSET (bx% + x%, by% + y%), b%
IF active(i%).bitmap(x%, y%) <= bb% THEN
correct% = correct% + 1
END IF
active(i%).bitmap(x%, y%) = bb%
NEXT y%
NEXT x%
IF correct% = 120 THEN
active(i%).a = 0
whichactive%(active(i%).x, active(i%).y) = -1
freeactive%(numfreeactives%) = i%
numfreeactives% = numfreeactives% + 1
END IF
END IF
NEXT i%
WHILE (TIMER = st#): WEND
LOOP UNTIL LEN(INKEY$)
SCREEN 0: WIDTH 80
DATA CD00610,F7030000,30000007,DD03,880880,98087100,E27000F,A9000AD2,40076000
DATA CF5000B1,450BCD93,F001D73,F001,0,0,DC000070,7A2000,5B000904,6A000
DATA 781005B,6200FB00,5B000E,5B00DA72,6A0000,8530005B,1F00C580,10F8,F0,0,0
DATA B042000,C07000F,9430D844,80DA9000,E2000F9,5B0,5B000,F9800000,20000000
DATA C3100086,64FA4400,251000E7,BD,0,0,DF00220,10A84000,5B000E92,69100
DATA CF50005B,30005B00,5B0094,5B009430,CF5000,6A0005B,84109930,F002300E,C,0,0
DATA 220,EE640EE,C7009F20,94300D,E2FD4DC7,D94E1700,5EF70000,C70000DA,97FF2D
DATA 5B000DC7,ED730,23056,CF00,0,0,220,EE640DF,C7005500,5B000D,E2FD4DC7
DATA D94E1700,5EF70000,C70000DA,FF2D,DC7,CFED730,F0023000,C,0,0,FC033000
DATA CF8000F,A060D763,A0EC6000,6,5B0,6105B000,6A0AF00,70BC6030,DC7000DC
DATA 72FCE800,143000E8,FCD,0,0,40C0310,BAA20FD,5B00E665,5B000,5B0005B
DATA 5000BB00,9B0005,5B000570,5B000,5B0005B,750B9840,B0140C8,CF05,0,0
DATA F0000400,E405100D,A0E,DC7,DC700,DC70000,C7000000,D,DC7,DC700,FED50500
DATA 5000C,CF0,0,0,13000,6000EE,CEA6,5B00,5B0000,5B000000,C4000,5B0005B
DATA B0005B00,781005,E880B070,AF530000,F,0,0,4FD0040,FCA651FD,5B00E908,B140
DATA B055B,73BB00,605D0000,5B0000F9,8800,EC6005B,90ED9741,ED0041CB,C130,0,0
DATA DF00220,A624000,B000000A,5,5B0,5B000,5B00000,B000F100,5B0005,5B0005B0
DATA 97230,23056,CF00,0,0,3000FD22,7D93C1,BCBE8F83,B093C80E,94B80876,E4A75B0
DATA 1715B094,5B09437,B0943AD9,94300005,340DE9A2,DE03173,FC014,0,0,400DF40
DATA 1B7842DF,DB008E45,DC7008,DC70957B,7EB75B00,805B00DC,5B00DC78,DC3040
DATA DB08005B,B2ED9930,ED0230D6,FE30,0,0,0,1710000,88100F9F,70F7910F,952000EB
DATA 790,5B079,7905B00,80790000,862000F9,910F8810,8100F7,EAF,0,0,0,F074000
DATA 43000EAE,F88109,A2400943,60094300,C8300CE,630009F1,D0A,943,94300,F074000
DATA F7,0,0,0,1710000,88100F9F,70F8810F,871000EB,790,5B079,7905B00,80790000
DATA 871000F9,910F8810,7200F7,50000E81,D3DCB7,BC23FD71,0,F0F19100,6A0000BC
DATA BE700,6A0006A,15006A00,10DD000A,6A0000AB,A240,CF5006A,80006A00,D9E29108
DATA F6920,0,0,0,810000,8900091D,5740F,880006A,BD800,5400000,F9F,20069100
DATA DC7000B3,A00F6830,1242006,E90,0,0,0,1019000,5B0AB1F,B0943DC7,943DC705
DATA 1DC70B50,C70000D2,D,DC7,DC700,DC70000,1640000,F7F,0,0,0,37F29000
DATA 9430AB16,3005B000,5B00094,B0009430,943005,943005B0,2005B000,6A00086
DATA 430F8900,810009,9E,0,0,0,ACF7400,CF5C9146,B14000,7900079,710F9800
DATA 9520008,90000EB7,7907,B10F50,7090000,7000000,9,0,0,0,17FF7400,88E7019
DATA 70B14000,CE68F9EB,87FACF50,16C240F9,D6200797,67D2F,7252709,FA07FA00
DATA AD90007,AD9,0,0,0,C909200,9520AB29,95200,880B23,FA304000,BA000000
DATA 5000000B,EB4E,FA70B23,80009520,AB09208,7E29,0,0,0,C909200,87107E56,88000
DATA F980B14,CE3C7000,DA000000,9,DC7,DC700,DC70000,1640000,F7F,0,0,0,FB0000
DATA 5B0007F0,A1500,77205B,6A0E200,A8000000,5000000E,C40B0,5B00862,B0006A00
DATA F83005,420,0,0,0,B5100000,F,916,EF3000,86C33000,A420000,FA7,8800,880000
DATA FB600000,F3000000,E,0,0,0,0,F1000AD9,A0600,C140655,437B00F,D95F30DE
DATA 9E020CF4,E8827,A60790,20079000,62000E0,DBF1,0,0,0,C4000,F7A000A6
DATA 600F8900,91D7030A,B4020E01,B50F,F1A60FD4,D50FD400,CE231D1,F7C21692
DATA F4197EA2,E20C0,0,0,0,220F1000,D3609C52,AD60EF,DD3300,9430000,D6000000,D
DATA 79,C130,C4000,0,0,0,0,F3000000,E,646,6820,F7A000,DA180000,4B510000
DATA D30000ED,FC50,FA7000,F9800000,A0000000,6,F10,0,C40000,25000000,9
DATA 200E2C31,B96010D6,90009610,9430F8,E1100790,CF500,880000,FA700000
DATA D4000000,F,0,0,FA700000,C0000000,AA,10EE34D0,404B4125,5CD5E400,6A000083
DATA 7000DA90,4C0DC,8260B14,5372C130,5000000F,FC,0,0,EF3000,62800000,B0000000
DATA F6,7E122D18,7340D230,900D3000,BC,592,E8A00,DB8000,FB42000,0,0,0,97100000
DATA 9F8000F,44000E7B,5B08,21BA2871,57FB200F,9520F00,43000079,7909,880000
DATA CF500000,50000000,B,0,0,0,21040000,2400F712,FED,93332000,D850E140
DATA D00D30F0,F4,763,E9900,B14000,C040000,F0100000,0,0,0,46000000,6,673
DATA 7F1E6311,F84FD090,81000000,D3000F17,80853691,F805A1EA,7E8393D,D4000E11,F
DATA 0,0,0,0,C9000AF7,7540B,8440B05,340C0400,CF50009,C8000934,B050C,CD70FF2
DATA 6A000000,50000000,B0,C13,F010,B1400000,30000000,67,20DDC820,FE9200F7
DATA 95285300,48710000,222EE3C5,23FEB01D,B140FC,B1400000,60000000,A0,CE60,0
DATA F1000,990F1000,763F674E,727943,5B00097,E7000000,3000000B,94,853,B140
DATA FF200,0,0,0,0,93400000,93000000,410000B9,E670,F314C000,B60211F,70DC6CE1
DATA 8,DD6,6910,F98000,EE40000,0,0,0
SUB initscreen
DIM orderx%(2559), ordery%(2559)
FOR iterate% = 1 TO 300
IF numfreecolumns% THEN
FOR i% = 0 TO MAXSTREAM%
IF stream(i%).a = 0 THEN
r% = INT(RND * numfreecolumns%)
stream(i%).x = freecolumn%(r%)
numfreecolumns% = numfreecolumns% - 1
freecolumn%(r%) = freecolumn%(numfreecolumns%)
stream(i%).taily = -(INT(RND * 15) + 10)
stream(i%).y = -1
stream(i%).a = 1
EXIT FOR
END IF
NEXT i%
END IF
FOR i% = 0 TO MAXSTREAM%
IF stream(i%).a THEN
IF INT(RND * RND * RND * RND * RND * 7) = 0 THEN stream(i%).y = stream(i%).y + 1
IF INT(RND * RND * RND * RND * RND * 7) = 0 THEN
stream(i%).taily = stream(i%).taily + 1
IF stream(i%).taily = 2 THEN
freecolumn%(numfreecolumns%) = stream(i%).x
numfreecolumns% = numfreecolumns% + 1
END IF
IF stream(i%).taily >= 40 THEN stream(i%).a = 0
END IF
END IF
NEXT i%
NEXT iterate%
p% = 0
FOR x% = 0 TO 63
FOR y% = 0 TO 39
orderx%(p%) = x%
ordery%(p%) = y%
p% = p% + 1
NEXT y%
NEXT x%
FOR p% = 2559 TO 1 STEP -1
r% = INT(RND * p%)
SWAP orderx%(r%), orderx%(p%)
SWAP ordery%(r%), ordery%(p%)
NEXT p%
FOR p% = 0 TO 2559
x% = orderx%(p%)
y% = ordery%(p%)
bx% = x% * 10
by% = y% * 12
c% = INT(RND * 41) + 1
FOR sx% = 0 TO 9
FOR sy% = 0 TO 11
PSET (bx% + sx%, by% + sy%), font%(c%, sx%, sy%)
NEXT sy%
NEXT sx%
FOR i% = 0 TO MAXSTREAM%
IF stream(i%).a THEN
IF x% = stream(i%).x THEN
IF (stream(i%).taily <= y%) AND (stream(i%).y >= y%) THEN EXIT FOR
END IF
END IF
NEXT i%
IF i% > MAXSTREAM% THEN PUT (bx%, by%), mask%, AND
NEXT p%
END SUB
SUB loadfont
FOR i% = 1 TO 41
x% = 0: y% = 0
FOR j% = 1 TO 120 STEP 8
READ thisset$
FOR k% = 1 TO 8
IF LEN(thisset$) THEN
thiscode% = (thiscode% + VAL("&H" + RIGHT$(thisset$, 1))) AND 15
thisset$ = LEFT$(thisset$, LEN(thisset$) - 1)
END IF
font%(i%, x%, y%) = thiscode%
x% = x% + 1
IF x% = 10 THEN x% = 0: y% = y% + 1
NEXT k%
NEXT j%
NEXT i%
END SUB