!!! Starburst in ACTION! {{{ MODULE ; Starburst 1.0 By Dan Rhea ; Modified from my Micrsoft Basic ; version 7/85 DEFINE YES="1", ; Define logical flags NO ="0" CARD tc01, ; Scratch Card 1 console=~[53279], ; Console Keys option =~[3], ; OPTION select =~[5], ; SELECT start =~[6], ; START lmargin=~[82], ; left margin cursor =~[752], ; cursor control attract=~[77] ; attract mode INT ARRAY x(8), ; 8 possible x coordinates y(8) ; 8 possible y coordinates CARD xaxis ; X axis for ploting BYTE yaxis ; Y axis for ploting BYTE xmax=~[48], ; Maximum x coordinate ymax=~[48], ; Maximum y coordinate xtot=~[95], ; Reflected maximum for xmax ytot=~[95], ; Reflected maximum for ymax bias=~[32], ; X coordinate offset from 0 (centers output) lcol=~[0], ; last color selected mseg=~[50], ; Maximum segment length (75 with 50 default) adjx, ; X coordinate adjustment adjy, ; Y coordinate adjustment dirc, ; Direction of plot travel (1 to 8) colr, ; Color of segment (1 to 3) segl, ; Length of segment (1 to mseg) move, ; movement counter spot, ; plot counter/pointer wrap=~[YES], ; Wraparound flag glue=~[YES], ; Connected segments flag tb01, ; Scratch byte 1 voic, ; Voice pitc, ; Pitch dist, ; Distortion volu, ; Volume ckey ; Console key CHAR ansr ; Prompt answer PROC Intro () ; Introduction to Starburst PrintE ("}") Graphics (18) Position (0,1) PrintDE (6," OoOoOoOoOoOoOoOoO") PrintDE (6," o o") PrintDE (6," O StArBuRsT 1.0 O") PrintDE (6," o o") PrintDE (6," O BY DAN rhea O") PrintDE (6," o o") PrintDE (6," OoOoOoOoOoOoOoOoO") Position (0,10) PrintDE (6," PRESS ~[start]") DO FOR tc01=0 TO 3 ; Register select DO tb01=tc01 colr=Rand(16) SetColor(tb01,colr,6) OD ckey=Peek(console) IF ckey <> start THEN FOR tc01=0 TO 10000 ; Delay DO ; Tarry a bit OD FI UNTIL ckey = start OD RETURN PROC Setup () ; Set up drawing parameters Graphics (0) SndRst () Poke (lmargin,1) PrintE (" ") PrintE ("") PrintE ("| |") PrintE ("| Starburst 1.0 By Dan Rhea 07/15/85 |") PrintE ("| |") PrintE ("") PrintE ("") PrintE ("|This program will produce geometric |") PrintE ("|patterns in Graphics Mode 7 using an|") PrintE ("|8 way reflection algorithm. You can |") PrintE ("|modify the type of patterns that are|") PrintE ("|generated by altering the following:|") PrintE ("| |") PrintE ("| 1. Wraparound (line wrap or not) |") PrintE ("| 2. Connected Lines (does the next |") PrintE ("| line start where the last one |") PrintE ("| completed) |") PrintE ("| 3. Extent (Maximum line length in a|") PrintE ("| random direction) |") PrintE ("") Poke (cursor,1) ; Cursor off ; Determine if wraparound is wanted DO Position (1,20) PrintE ("") PrintE ("|Wraparound Enable? (Y/N) : |") PrintE ("") Position (28,21) ansr=GetD(7) IF ansr = 'Y OR ansr = 'y THEN wrap = YES tb01 = YES ELSEIF ansr = 'N OR ansr = 'n THEN wrap = NO tb01 = YES ELSE tb01 = NO FI UNTIL tb01 = YES OD ; Determine if connected lines are wanted DO Position (1,20) PrintE ("") PrintE ("|Connected lines required? (Y/N) : |") PrintE ("") Position (35,21) ansr=GetD(7) IF ansr = 'Y OR ansr = 'y THEN glue = YES tb01 = YES ELSEIF ansr = 'N OR ansr = 'n THEN glue = NO tb01 = YES ELSE tb01 = NO FI UNTIL tb01 = YES OD ; Determine maximum line segment extent DO Position (1,20) PrintE ("") PrintE ("|Maximum segment length (1-75) : |") PrintE ("") Position (33,21) mseg=InputB() IF mseg < 1 THEN tb01 = NO ELSEIF mseg > 75 THEN tb01 = NO ELSE tb01 = YES FI UNTIL tb01 = YES OD ; Give the user operating instructions during the draw mode Position (1,20) PrintE ("") PrintE ("|START:Draw OPTION:Menu SELECT:Freeze|") PrintE ("") DO ckey=Peek(console) UNTIL ckey = start OD DO ckey=Peek(console) UNTIL ckey <> start OD Poke (cursor,0) ; Restore cursor RETURN PROC Getxy () ; Set random X Y starting coordinates x(1)=Rand(xmax) ; 0 to xmax-1 y(1)=Rand(ymax) ; 0 to ymax-1 RETURN PROC Docld () ; Set Color, Length and Direction dirc=Rand(8) ; 0 to 7 DO colr=Rand(4) ; 0 to 3 UNTIL colr <> lcol OD lcol=colr segl=Rand(mseg)+1 ; 1 to mseg RETURN PROC Clamp () ; Clamp the line or wrap it around as needed IF wrap = YES THEN IF x(1) < 0 THEN adjx = xmax-1 ELSEIF x(1) >= xmax THEN adjx = 0 ELSE adjx = x(1) FI x(1) = adjx IF y(1) < 0 THEN adjy = ymax-1 ELSEIF y(1) >= ymax THEN adjy = 0 ELSE adjy = y(1) FI y(1) = adjy ELSE IF x(1) < 0 THEN adjx = 0 ELSEIF x(1) >= xmax THEN adjx = xmax-1 ELSE adjx = x(1) FI x(1) = adjx IF y(1) < 0 THEN adjy = 0 ELSEIF y(1) >= ymax THEN adjy = ymax-1 ELSE adjy = y(1) FI y(1) = adjy FI RETURN PROC Flect () ; DO 8 way reflection x(2) = xtot-x(1) x(3) = x(2) x(4) = x(1) x(5) = y(1) x(6) = xtot-x(5) x(7) = x(6) x(8) = x(5) y(2) = y(1) y(3) = ytot-y(1) y(4) = y(3) y(5) = x(1) y(6) = y(5) y(7) = ytot-y(6) y(8) = y(7) RETURN PROC Paint () ; Draw the sucker FOR spot = 1 TO 8 DO xaxis=x(spot)+bias yaxis=y(spot) Plot (xaxis,yaxis) OD RETURN PROC Slide () ; Move the guy in cell 1 in the desired direction IF dirc = 0 THEN x(1)==+1 ELSEIF dirc = 1 THEN x(1)==+1 y(1)==+1 ELSEIF dirc = 2 THEN y(1)==+1 ELSEIF dirc = 3 THEN x(1)==-1 y(1)==+1 ELSEIF dirc = 4 THEN x(1)==-1 ELSEIF dirc = 5 THEN x(1)==-1 y(1)==-1 ELSEIF dirc = 6 THEN y(1)==-1 ELSEIF dirc = 7 THEN x(1)==+1 y(1)==-1 ELSE ; Do Nothin Meng' FI RETURN PROC Noise () ; Use screen data for sound BYTE base=~[63] voic = colr pitc = x(1)+(colr*base) volu = y(1)/4 dist = 10 Sound(voic,pitc,dist,volu) RETURN PROC Main () Intro () DO Setup () Getxy () Graphics (23) DO Poke(attract,0) Docld () color=colr FOR move = 1 TO segl DO Clamp () ; Wrap/Nowrap Flect () ; Reflect Paint () ; Plot all 8 Noise () ; Make some Slide () ; Move # 1 OD IF glue = NO THEN Getxy () FI ckey = Peek(console) IF ckey = select THEN DO ckey = Peek(console) UNTIL ckey <> select OD FI IF ckey = start THEN DO ckey = Peek(console) UNTIL ckey <> start OD Graphics(23) FI UNTIL ckey = option OD OD RETURN }}}