REM Fireworks simulation REM by Scott Teresi, www.teresi.us REM July 25, 1996 PARTICLES = 100 AIR = .9: REM LOWER NUMBER IS MORE AIR RESISTANCE GRAVITY = .1: REM LOWER NUMBER IS LESS FLICKERSPD = .2: REM BETWEEN 0 AND 1 DIM POSX(PARTICLES), POSY(PARTICLES), SPDX(PARTICLES), SPDY(PARTICLES) DIM CLR(PARTICLES), LIGHTED(PARTICLES), FLICKERTIME(PARTICLES), OFFTIME(PARTICLES) 10 RANDOMIZE TIMER POSX = RND(1) * 250 + 35 POSY = RND(1) * 60 + 20 FOR I = 1 TO PARTICLES POSX(I) = POSX POSY(I) = POSY ANGLE = RND(1) * 2 * 3.14159 SPD = RND(1) * 5 SPDX(I) = COS(ANGLE) * SPD SPDY(I) = SIN(ANGLE) * SPD LIGHTED(I) = 1 FLICKERTIME(I) = 20 + RND(1) * 20 OFFTIME(I) = 50 + RND(1) * 10 CLR(I) = INT(RND(1) * 2) + 12 IF CLR(I) = 0 THEN CLR(I) = 1 NEXT I SCREEN 13 TIME = 0 REM *** MAIN LOOP *** 1000 TIME = TIME + 1 FOR I = 1 TO PARTICLES SPDX(I) = SPDX(I) * AIR + (RND(1) * .5 - .25): REM RANDOM WIGGLING SPDY(I) = SPDY(I) * AIR + GRAVITY + (RND(1) * .5 - .25) NEXT I NUMOFF = 0 FOR I = 1 TO PARTICLES REM LINE (POSX(I), POSY(I))-(POSX(I) + 1, POSY(I)), 0 PSET (POSX(I), POSY(I)), 0 POSX(I) = POSX(I) + SPDX(I) POSY(I) = POSY(I) + SPDY(I) IF TIME > FLICKERTIME(I) AND RND(1) < FLICKERSPD THEN GOSUB 10000: REM TIME TO FLICKER REM IF LIGHTED(I) = 1 AND TIME < OFFTIME(I) THEN LINE (POSX(I), POSY(I))-(POSX(I) + 1, POSY(I)), CLR(I) ELSE IF TIME >= OFFTIME(I) THEN NUMOFF = NUMOFF + 1 IF LIGHTED(I) = 1 AND TIME < OFFTIME(I) THEN PSET (POSX(I), POSY(I)), CLR(I) ELSE IF TIME >= OFFTIME(I) THEN NUMOFF = NUMOFF + 1 NEXT I IF NUMOFF = PARTICLES THEN FOR I = 1 TO 10000 + RND(1) * 10000: NEXT I: GOTO 10 GOTO 1000 10000 IF LIGHTED(I) = 0 THEN LIGHTED(I) = 1 ELSE LIGHTED(I) = 0 RETURN