DIM SHARED timerCvalue(0 TO 50)
DIM SHARED timerLast
-
pi = 3.14128
turnon
timerinit
s = 50
+' Main loop label
2
s1 = SIN(timerCvalue(1) * 1.3) * .5 + 1.1
s2 = COS(timerCvalue(1) * 1.3) * .5 + 1.1
-
frm = frm + 1
sv1 = 5 * s1
sv2 = 2
sh2 = 1.4
hp = SIN(timerCvalue(1)) * .7
-
+' Draw main object
mo timerCvalue(2), timerCvalue(3), timerCvalue(4), timerCvalue(0), 0
+' Draw ellipses
ellips 100, timerCvalue(6), timerCvalue(7) + 4, 14, .5
ellips 100, timerCvalue(6), timerCvalue(7) + 2, 10, .5
ellips 100, timerCvalue(6), timerCvalue(7), 0, .5
prn timerCvalue(5), 10, "KHK", 7, 250
+' Print messages
prn timerCvalue(8), 130, "Infotehno-", 2, 0
prn timerCvalue(8), 150, " loogia", 2, 0
PCOPY 0, 1
LINE (0, 0)-(319, 199), 15, BF
GOTO 2
-SYSTEM
SUB ellips (x, y, s, v, t)
+ ' Draw an ellipse if x and y are positive
+ IF x > 0 THEN
+ IF y > 0 THEN
+ CIRCLE (x, y), s, v, , , t
+ PAINT (x, y), v
+ END IF
+ END IF
+END SUB
-IF x > 0 THEN
-IF y > 0 THEN
+SUB mo (x, y, an, s, w)
+ depth = depth + 1
-CIRCLE (x, y), s, v, , , t
-PAINT (x, y), v
+ ' If size is less than .2, skip drawing
+ IF s < .2 THEN GOTO 1
-END IF
-END IF
+ ' Determine color based on depth
+ IF depth / 2 = depth \ 2 THEN c = 1 ELSE c = 3
-END SUB
+ CIRCLE (x, y), s, c
+ PAINT (x, y), c
-SUB mo (x, y, an, s, w)
-depth = depth + 1
-IF s < .2 THEN GOTO 1
-
-IF depth / 2 = depth \ 2 THEN c = 1 ELSE c = 3
-
-CIRCLE (x, y), s, c
-PAINT (x, y), c
-
-IF w <> 1 THEN
-x1 = SIN(an) * s * 2.5 + x
-y1 = COS(an) * s * 2.5 + y
-IF w = 3 THEN ns = s / sv2 ELSE ns = s / sv1
-mo x1, y1, an + vp, ns, 3
-END IF
-
-IF w <> 2 THEN
-x1 = SIN(an - pi / 2) * s * 2.5 + x
-y1 = COS(an - pi / 2) * s * 2.5 + y
-IF w = 4 THEN ns = s / sh2 ELSE ns = s / sh1
-mo x1, y1, an + hp, ns, 4
-END IF
-
-IF w <> 3 THEN
-x1 = SIN(an - pi) * s * 2.5 + x
-y1 = COS(an - pi) * s * 2.5 + y
-IF w = 1 THEN ns = s / sv2 ELSE ns = s / sv1
-mo x1, y1, an + vp, ns, 1
-END IF
-
-IF w <> 4 THEN
-x1 = SIN(an - pi * 1.5) * s * 2.5 + x
-y1 = COS(an - pi * 1.5) * s * 2.5 + y
-IF w = 2 THEN ns = s / sh2 ELSE ns = s / sh1
-mo x1, y1, an + hp, ns, 2
-END IF
+ IF w <> 1 THEN
+ x1 = SIN(an) * s * 2.5 + x
+ y1 = COS(an) * s * 2.5 + y
-1
-depth = depth - 1
-END SUB
+ ' Change size based on the value of w
+ IF w = 3 THEN ns = s / sv2 ELSE ns = s / sv1
-SUB playsound (a$)
-SHELL "c:\progra~1\winamp\winamp.exe " + a$
-SCREEN 0
-SCREEN 7, , , 1
+ mo x1, y1, an + vp, ns, 3
+ END IF
-END SUB
+ IF w <> 2 THEN
+ x1 = SIN(an - pi / 2) * s * 2.5 + x
+ y1 = COS(an - pi / 2) * s * 2.5 + y
-SUB prn (x, y, msg$, siz, col1)
-IF x < 0 THEN GOTO prn1
-IF x > 319 THEN GOTO prn1
+ ' Change size based on the value of w
+ IF w = 4 THEN ns = s / sh2 ELSE ns = s / sh1
-DIM bck(10000)
+ mo x1, y1, an + hp, ns, 4
+ END IF
-GET (0, 0)-(100, 7), bck
-LOCATE 1, 1
-PRINT msg$
-
-col = col1
-
-FOR x1 = 0 TO LEN(msg$) * 8 - 1
-FOR y1 = 0 TO 7
- IF POINT(x1, y1) > 0 THEN
- rx = x1 * siz + x
- ry = y1 * siz + y
- IF col1 > 100 THEN col = RND * 4 + 10
- IF col1 > 200 THEN
- LINE (rx, ry)-(rx + siz - 1, ry + siz - 1), col, B
- ELSE
- LINE (rx, ry)-(rx + siz - 1, ry + siz - 1), col, BF
+ IF w <> 3 THEN
+ x1 = SIN(an - pi) * s * 2.5 + x
+ y1 = COS(an - pi) * s * 2.5 + y
+
+ ' Change size based on the value of w
+ IF w = 1 THEN ns = s / sv2 ELSE ns = s / sv1
+
+ mo x1, y1, an + vp, ns, 1
+ END IF
+
+ IF w <> 4 THEN
+ x1 = SIN(an - pi * 1.5) * s * 2.5 + x
+ y1 = COS(an - pi * 1.5) * s * 2.5 + y
+
+ ' Change size based on the value of w
+ IF w = 2 THEN ns = s / sh2 ELSE ns = s / sh1
+
+ mo x1, y1, an + hp, ns, 2
END IF
-' LINE (rx, ry)-(rx + siz - 1, ry + siz - 1), col, BF
- END IF
-NEXT y1
-NEXT x1
+1
+ depth = depth - 1
+END SUB
+
+SUB playsound (a$)
+ SHELL "c:\progra~1\winamp\winamp.exe " + a$
+ ' Temporarily switch to text mode
+ SCREEN 0
+ ' Switch back to graphics mode
+ SCREEN 7, , , 1
+END SUB
-PUT (0, 0), bck, PSET
+SUB prn (x, y, msg$, siz, col1)
+ IF x < 0 THEN GOTO prn1
+ IF x > 319 THEN GOTO prn1
+
+ DIM bck(10000)
+
+ ' Save a portion of the screen to buffer
+ GET (0, 0)-(100, 7), bck
+
+ LOCATE 1, 1
+ PRINT msg$
+
+ col = col1
+
+ FOR x1 = 0 TO LEN(msg$) * 8 - 1
+ FOR y1 = 0 TO 7
+ IF POINT(x1, y1) > 0 THEN
+ ' Calculate the coordinates for the enlarged character
+ rx = x1 * siz + x
+ ry = y1 * siz + y
+
+ IF col1 > 100 THEN
+ col = RND * 4 + 10
+
+ ' Draw a solid box or outlined box based on the color value
+ IF col1 > 200 THEN
+ LINE (rx, ry)-(rx + siz - 1, ry + siz - 1), col, B
+ ELSE
+ LINE (rx, ry)-(rx + siz - 1, ry + siz - 1), col, BF
+ END IF
+ END IF
+ END IF
+ NEXT y1
+ NEXT x1
+
+ ' Restore the saved portion of the screen
+ PUT (0, 0), bck, PSET
prn1:
END SUB
SUB timerAdd (element, time, value)
-FOR a = 0 TO 100
- IF (timerTime(element, a) = 0) AND (timerValue(element, a) = 0) THEN GOTO timer3
-NEXT a
+ FOR a = 0 TO 100
+ IF (timerTime(element, a) = 0) AND (timerValue(element, a) = 0) THEN GOTO timer3
+ NEXT a
+
timer3:
-timerTime(element, a) = time
-timerValue(element, a) = value
+ timerTime(element, a) = time
+ timerValue(element, a) = value
END SUB
SUB timerdisp
-LOCATE 1, 1
+ LOCATE 1, 1
-FOR a = 0 TO 10
- PRINT timerCplace(a), timerCtime(a), timerCvalue(a)
-NEXT a
+ ' Display the current state of timers
+ FOR a = 0 TO 10
+ PRINT timerCplace(a), timerCtime(a), timerCvalue(a)
+ NEXT a
END SUB
SUB timerinit
-timerLast = TIMER
-
-paus = 24
-
-' stuff size
-timerAdd 0, 0, 50
-timerAdd 0, 7, 10
-timerAdd 0, 20, 10
-timerAdd 0, 24, 0
-timerAdd 0, 1000, 0
+ timerLast = TIMER
+ paus = 24
-' stuff speed
-timerAdd 1, 0, .1
-timerAdd 1, 1000, 1000
+ ' Initialize stuff size
+ timerAdd 0, 0, 50
+ timerAdd 0, 7, 10
+ timerAdd 0, 20, 10
+ timerAdd 0, 24, 0
+ timerAdd 0, 1000, 0
-' stuff X & Y
-timerAdd 2, 0, 160
-timerAdd 3, 0, 100
+ ' Initialize stuff speed
+ timerAdd 1, 0, .1
+ timerAdd 1, 1000, 1000
-timerAdd 2, 5, 160
-timerAdd 3, 5, 100
+ ' Initialize stuff X & Y
+ timerAdd 2, 0, 160
+ timerAdd 3, 0, 100
-timerAdd 2, 9, 280
-timerAdd 3, 9, 160
+ timerAdd 2, 5, 160
+ timerAdd 3, 5, 100
-timerAdd 2, 10, 280
-timerAdd 3, 10, 160
+ timerAdd 2, 9, 280
+ timerAdd 3, 9, 160
-timerAdd 2, 20, 40
-timerAdd 3, 20, 160
+ timerAdd 2, 10, 280
+ timerAdd 3, 10, 160
-timerAdd 2, 1000, 40
-timerAdd 3, 1000, 160
+ timerAdd 2, 20, 40
+ timerAdd 3, 20, 160
-' stuff rotations
-timerAdd 4, 0, .1
-timerAdd 4, 10, .1
-timerAdd 4, 22, 18
-timerAdd 4, 2000, 10000
+ timerAdd 2, 1000, 40
+ timerAdd 3, 1000, 160
-' KHK message X
+ ' Initialize stuff rotations
+ timerAdd 4, 0, .1
+ timerAdd 4, 10, .1
+ timerAdd 4, 22, 18
+ timerAdd 4, 2000, 10000
-timerAdd 5, 0, -1
-timerAdd 5, 5, -1
-timerAdd 5, 9, 50
-timerAdd 5, 10, 30
-timerAdd 5, paus, 30
-timerAdd 5, paus + 2, 321
+ ' Initialize KHK message X
-' Ellips Y & radius
-timerAdd 6, 0, -1
-timerAdd 6, 4, -1
-timerAdd 6, 10, 30
-timerAdd 6, 1000, 50
+ timerAdd 5, 0, -1
+ timerAdd 5, 5, -1
+ timerAdd 5, 9, 50
+ timerAdd 5, 10, 30
+ timerAdd 5, paus, 30
+ timerAdd 5, paus + 2, 321
-timerAdd 7, 0, 1
-timerAdd 7, 6, 1
-timerAdd 7, 12, 130
+ ' Initialize Ellips Y & radius
+ timerAdd 6, 0, -1
+ timerAdd 6, 4, -1
+ timerAdd 6, 10, 30
+ timerAdd 6, 1000, 50
-timerAdd 7, paus, 130
-timerAdd 7, paus + 2, 1
+ timerAdd 7, 0, 1
+ timerAdd 7, 6, 1
+ timerAdd 7, 12, 130
-' "Infotehnoloogia" message
+ timerAdd 7, paus, 130
+ timerAdd 7, paus + 2, 1
-timerAdd 8, 0, 320
-timerAdd 8, 11, 320
-timerAdd 8, 20, 100
-timerAdd 8, paus, 100
-timerAdd 8, paus + 1, -1
+ ' Initialize "Infotehnoloogia" message
+ timerAdd 8, 0, 320
+ timerAdd 8, 11, 320
+ timerAdd 8, 20, 100
+ timerAdd 8, paus, 100
+ timerAdd 8, paus + 1, -1
END SUB
SUB timerprocess
+ timerCurrent = TIMER
+ timerDiff = timerCurrent - timerLast
+ timerLast = timerCurrent
-timerCurrent = TIMER
-timerDiff = timerCurrent - timerLast
-timerLast = timerCurrent
-
-FOR a = 0 TO 50
- ctim = timerCtime(a) + timerDiff
- Cplace = timerCplace(a)
+ FOR a = 0 TO 50
+ ctim = timerCtime(a) + timerDiff
+ Cplace = timerCplace(a)
timer2:
- IF timerTime(a, Cplace + 1) = -1 THEN
- ctim = 0
- Cplace = 0
- END IF
- IF timerTime(a, Cplace + 1) < ctim THEN
- IF timerTime(a, Cplace + 1) = 0 THEN
- timerCvalue(a) = timerValue(a, Cplace)
- GOTO timer1:
- END IF
- Cplace = Cplace + 1
- GOTO timer2
- END IF
-
- v1 = timerValue(a, Cplace)
- t1 = timerTime(a, Cplace)
- v2 = timerValue(a, Cplace + 1)
- t2 = timerTime(a, Cplace + 1)
-
- IF v1 = v2 THEN
- timerCvalue(a) = v1
- ELSE
- Tdiff1 = t2 - t1
- Tdiff2 = ctim - t1
- Vdiff = v2 - v1
- timerCvalue(a) = Tdiff2 / Tdiff1 * Vdiff + v1
- END IF
+ IF timerTime(a, Cplace + 1) = -1 THEN
+ ctim = 0
+ Cplace = 0
+ END IF
+
+ ' Update the current time and value of each element
+ IF timerTime(a, Cplace + 1) < ctim THEN
+ IF timerTime(a, Cplace + 1) = 0 THEN
+ timerCvalue(a) = timerValue(a, Cplace)
+ GOTO timer1
+ END IF
+
+ Cplace = Cplace + 1
+ GOTO timer2
+ END IF
+
+ v1 = timerValue(a, Cplace)
+ t1 = timerTime(a, Cplace)
+ v2 = timerValue(a, Cplace + 1)
+ t2 = timerTime(a, Cplace + 1)
+
+ IF v1 = v2 THEN
+ timerCvalue(a) = v1
+ ELSE
+ Tdiff1 = t2 - t1
+ Tdiff2 = ctim - t1
+ Vdiff = v2 - v1
+
+ ' Interpolate the current value
+ timerCvalue(a) = Tdiff2 / Tdiff1 * Vdiff + v1
+ END IF
timer1:
- timerCplace(a) = Cplace
- timerCtime(a) = ctim
-NEXT a
+ timerCplace(a) = Cplace
+ timerCtime(a) = ctim
+ NEXT a
END SUB
SUB turnon
-a$ = INPUT$(1)
-playsound "marine.mp3"
+ ' Read user input
+ a$ = INPUT$(1)
-SCREEN 7, , , 1
+ ' Play sound
+ playsound "marine.mp3"
-FOR x = 0 TO 160 STEP 15
-
- LINE (160 - x - 5, 90 - 5)-(160 + x + 5, 110 + 5), 1, BF
- LINE (160 - x - 3, 90 - 3)-(160 + x + 3, 110 + 3), 3, BF
- LINE (160 - x, 90)-(160 + x, 110), 15, BF
-
- PCOPY 0, 1
- CLS
- SOUND 0, .5
-NEXT x
-
-FOR y = 10 TO 100 STEP 15
- CLS
-
- LINE (160 - x - 5, 90 - y - 5)-(160 + x + 5, 110 + y + 5), 1, BF
- LINE (160 - x - 3, 90 - y - 3)-(160 + x + 3, 110 + y + 3), 3, BF
- LINE (160 - x, 90 - y)-(160 + x, 110 + y), 15, BF
-
- PCOPY 0, 1
- SOUND 0, .5
-NEXT y
-
-FOR a = 1 TO 25
- prn RND * 250, RND * 180, STR$(INT(RND * 2)), 3, 0
- PCOPY 0, 1
- SOUND 0, 1
-NEXT a
-
-DIM buf(1 TO 1000)
-FOR b = 1 TO 30
-FOR a = 0 TO 195
- t = ABS(100 - a)
-
- IF RND * 50 < t THEN
- GET (1, a)-(318, a + 1), buf
- IF a > 100 THEN
- PUT (0, a), buf, PSET
- ELSE
- PUT (2, a), buf, PSET
- END IF
- END IF
-NEXT a
-PCOPY 0, 1
-'SOUND 0, 1
-NEXT b
+ SCREEN 7, , , 1
+ FOR x = 0 TO 160 STEP 15
+ LINE (160 - x - 5, 90 - 5)-(160 + x + 5, 110 + 5), 1, BF
+ LINE (160 - x - 3, 90 - 3)-(160 + x + 3, 110 + 3), 3, BF
+ LINE (160 - x, 90)-(160 + x, 110), 15, BF
-END SUB
+ PCOPY 0, 1
+ CLS
+ SOUND 0, .5
+ NEXT x
+
+ FOR y = 10 TO 100 STEP 15
+ CLS
+
+ LINE (160 - x - 5, 90 - y - 5)-(160 + x + 5, 110 + y + 5), 1, BF
+ LINE (160 - x - 3, 90 - y - 3)-(160 + x + 3, 110 + y + 3), 3, BF
+ LINE (160 - x, 90 - y)-(160 + x, 110 + y), 15, BF
+
+ PCOPY 0, 1
+ SOUND 0, .5
+ NEXT y
+
+ FOR a = 1 TO 25
+ prn RND * 250, RND * 180, STR$(INT(RND * 2)), 3, 0
+ PCOPY 0, 1
+ SOUND 0, 1
+ NEXT a
+
+ DIM buf(1 TO 1000)
+
+ FOR b = 1 TO 30
+ FOR a = 0 TO 195
+ t = ABS(100 - a)
+
+ IF RND * 50 < t THEN
+ GET (1, a)-(318, a + 1), buf
+
+ ' Randomly shift parts of the screen
+ IF a > 100 THEN
+ PUT (0, a), buf, PSET
+ ELSE
+ PUT (2, a), buf, PSET
+ END IF
+ END IF
+ NEXT a
+
+ PCOPY 0, 1
+ 'SOUND 0, 1
+ NEXT b
+END SUB
\ No newline at end of file