BASIC2\LAKE.BAS ·
BAS ·
15.1 KB ·
1988-06-10 ·
from PCPlus_Issue-30_Mar-1989
'''''''''''''''''''''''''' LAKESIDE VIEW - by - David Mylward, BA FBIS - April 1988 -.........................-
STREAM #1
WINDOW OPEN
WINDOW FULL
OPTION DEGREES
GRAPHICS CURSOR 2
DIM x(31) WORD
DIM y(31) WORD
DIM tc(1 TO 7)
DATA 9, 15, 7, 14, 6, 3, 11
FOR i=1 TO 7
READ tc(i)
NEXT i
title$ = "LAKESIDE VIEW No. : A Programmed Picture "+CHR$(189)+" F D Mylward 1988"
GOSUB a_getcount
seed=0
REPEAT
choice=ALERT 2 TEXT "" BUTTON RETURN "Random cycle","Selection","Exit program"
ON choice GOSUB b_checkrand, c_entersel
UNTIL choice>2
CLS
WINDOW FULL OFF
WINDOW CLOSE
END
LABEL a_getcount
WINDOW CURSOR ON
SET MODE 2
PRINT "Enter required countdown between pictures"
INPUT "Min=10,Max=9999";tim
WINDOW CURSOR OFF
limit=INT(tim) MOD 10000
IF limit<10 THEN limit=10
SET MODE 1
RETURN
LABEL b_checkrand
cycle=2
REPEAT
RANDOMIZE
seed=RND(9999)
GOSUB e_picloop
UNTIL cycle=1
RETURN
LABEL c_entersel
gopoint=seed : cycle=1
SET MODE 2
WINDOW CURSOR ON
LOCATE 40;3
INPUT "Picture Number";sel
IF sel<>0 THEN gopoint=INT(sel) MOD 10000
WINDOW CURSOR OFF
SET MODE 1
IF gopoint<>0 THEN seed=gopoint : GOSUB e_picloop
RETURN
LABEL e_picloop
CLS
title${18 TO 22}=" "
title${18 TO 22}=STR$(seed)
WINDOW TITLE title$
RANDOMIZE seed
hor=(18+RND(18))*100
WINDOW MOUSE 2
GOSUB f_sky
GOSUB g_background
mono=0
yfl=RND(1200)+250
yfr=RND(1200)+250
DEF FNyy(xz)=yfl+(xz*(yfr-yfl)/8360)
ym=MAX(yfl,yfr)+RND(1000)
mg=INT(RND*6)
IF mg=0 THEN DEF FNyz(xz)=0
IF mg=1 THEN DEF FNyz(xz)=ym*(1-xz/8360)
IF mg=2 THEN DEF FNyz(xz)=ym*xz/8360
IF mg=3 THEN DEF FNyz(xz)=ym*SQR(1-xz^2/10000^2)
IF mg=4 THEN DEF FNyz(xz)=ym*SQR(1-(8360-xz)^2/10000^2)
IF mg=5 THEN DEF FNyz(xz)=ym*SQR(1-(4180-xz)^2/6000^2)
DEF FNymin(xz)=MAX(FNyy(xz),FNyz(xz))
GOSUB h_lake
IF mg<>0 THEN GOSUB i_woods
tflag=0
yhold=MAX(yfl,yfr)
GOSUB j_village
GOSUB k_foreground
WINDOW MOUSE 0
MOVE 7000;100
PRINT POINTS (8) MODE (2) EFFECTS(4); "David Mylward";
IF cycle=1 THEN WHILE BUTTON=-1 : WEND
holdtime=TIME : nowtime=TIME
WHILE cycle=2 AND BUTTON=-1 AND nowtime<holdtime+100*limit
nowtime=TIME
IF nowtime<holdtime THEN nowtime=nowtime+(24*60*60*100)
MOVE 100;4500
kt=limit-INT((nowtime-holdtime)/100)
PRINT USING "####";kt
WEND
IF BUTTON<>-1 THEN cycle=1
RETURN
LABEL f_sky
BOX 0;0,8360,5000 COLOUR 5 FILL
cloudcount=INT((RND*7))
range=MIN(4400-hor,hor-600) : top=MIN(2*hor,4750)
FOR cloud=1 TO cloudcount
x(0)=(7160*RND)+600 : y(0)=(range*RND)+hor : r=800*RND+1
CIRCLE x(0);y(0),r COLOUR 0 FILL ONLY
CIRCLE x(0);2*hor-y(0),r COLOUR 0 FILL ONLY
FOR i = 1 TO 15
j=INT(i/2) : nx=INT(LOG(i)/LOG(2))+1 : ny=5-nx
x(i)=x(j)+(RND*200*ny)
IF x(i)<250 THEN x(i)=250
IF x(i)>8110 THEN x(i)=8110
y(i)=y(j)+(RND*200*ny)
IF y(i)<hor+250 THEN y(i)=hor+250
IF y(i)>top THEN y(i)=top
rr=RND*200*ny+1
CIRCLE x(i);y(i), rr COLOUR 0 FILL ONLY
CIRCLE x(i);2*hor-y(i), rr COLOUR 0 FILL ONLY
NEXT i
NEXT cloud
RETURN
LABEL g_background
yb=hor
m1=RND(41)-1 : m2=RND(41)-1 :mb = MAX (MIN(m1,m2),MAX(m1,m2)-5)
FOR i = MIN(m1,m2) TO MAX(m1,m2)
IF i=mb THEN LINE 0;hor, 8360;hor COLOUR 11 WIDTH 1 STYLE 1 : yb=hor-50: BOX 0;hor-53,8360,56 MODE 2 COLOUR 5 FILL ONLY WITH 4
col=INT(7*i/41)+1
y3=INT(RND*25*(41-i))+yb+110
GOSUB l_mountain
NEXT i
BOX 0;hor-103,8360,56 MODE 2 COLOUR 5 FILL ONLY WITH 4
RETURN
LABEL h_lake
FOR yb = hor-200 TO 300 STEP -100
level = (hor*1.2-300-yb)/(hor*0.4-200)
BOX 0;yb-3,8360,106 MODE 2 COLOUR 5 FILL ONLY WITH 4
xb=INT(RND*8360)
IF yb>FNymin(xb) THEN r=RND(8) : IF r=1 THEN GOSUB m_isle ELSE IF r < 4 THEN GOSUB n_boats
NEXT yb
BOX 0;0,8360,300 MODE 2 COLOUR 5 FILL ONLY WITH 4
RETURN
LABEL i_woods
c1=6 : m=1 : ptn=8
ON mg GOSUB ia_slope,ib_slope,ic_slope,id_slope,ie_slope
c1=8*INT(RND*2)+3 : m=2 : ptn=4
ON mg GOSUB ia_slope,ib_slope,ic_slope,id_slope,ie_slope
typ=INT(RND*4) : c=INT(RND*4)
IF typ<>0 THEN GOSUB if_woods
RETURN
LABEL ia_slope
SHAPE 0;0,0;ym,8360;0 COLOUR c1 MODE m FILL WITH ptn
RETURN
LABEL ib_slope
SHAPE 0;0,8360;ym,8360;0 COLOUR c1 MODE m FILL WITH ptn
RETURN
LABEL ic_slope
ELLIPSE 0;0,10000,ym/10000 PART 0,90 COLOUR c1 MODE m FILL WITH ptn
RETURN
LABEL id_slope
ELLIPSE 8360;0,10000,ym/10000 PART 90,180 COLOUR c1 MODE m FILL WITH ptn
RETURN
LABEL ie_slope
ELLIPSE 4180;0,6000,ym/6000 PART 0,180 COLOUR c1 MODE m FILL WITH ptn
RETURN
LABEL if_woods
FOR yw=ym TO MIN(yfl,yfr) STEP -(typ+1)
xw=INT(8360*RND)
IF yw>FNyz(xw) OR yw<FNyy(xw) THEN GOTO next_yw
ON typ GOSUB ih_conif, ig_decid, ii_bush
LABEL next_yw
NEXT yw
RETURN
LABEL ig_decid
r=INT(RND*8)
IF r=0 THEN c2=6 ELSE IF r<4 THEN c2=3 ELSE c2=11
w=RND(180)+75
CIRCLE xw;yw,w COLOUR c2 FILL
RETURN
LABEL ih_conif
w=45+INT(RND*60)
IF xw<w THEN xw=w
IF xw>8360-w THEN xw=8360-w
IF c<>0 THEN r=c ELSE r=RND(3)
IF r=1 THEN c1=1 ELSE IF r=2 THEN c1=6 ELSE c1=14
IF yw>MAX(100,FNyy(xw)-6*w) AND yw<5000-6*w THEN ELLIPSE xw;yw-100, w,7 PART 10,170 COLOUR 11 FILL : ELLIPSE xw;yw-100, w,7 PART 10,170 COLOUR c1 MODE 2 FILL WITH 14
RETURN
LABEL ii_bush
w=50+RND(60)
CIRCLE xw;yw,w COLOUR 6 FILL
CIRCLE xw;yw,w COLOUR 11 MODE 2 FILL WITH 21
RETURN
LABEL j_village
nn=RND(21)-1
FOR i=1 TO nn
xt=7360*RND+500
yt=FNyy(xt)-150+50*i/nn
IF yt<0 THEN yt=0
r=RND(25)
IF r<6 THEN s=0 : z=1 : GOSUB o_shrub
IF r>5 AND r<9 THEN GOSUB p_gorse
IF r>8 AND r<12 AND tflag=0 THEN tflag=1 : IF RND(3)=1 THEN GOSUB jf_spire ELSE GOSUB ja_church
ht = yt+300+100*RND : cht=ht-yt+100 : ht1=ht-yt : ht2=ht1-200
IF r>11 AND r<15 THEN GOSUB jb_cottage
IF r>14 AND r<17 THEN GOSUB jc_gable
IF r>16 AND r<19 THEN GOSUB jd_chalet
IF r>18 THEN GOSUB je_house
NEXT i
RETURN
LABEL ja_church
ht=yt+1000 : wd=200+200*RND : cr=wd/4 : hf=3*cr : rf=hf-50
LINE xt;ht-50,xt;ht+500 COLOUR 15 WIDTH 1
ELLIPSE xt+25;ht+500,50,0.3 COLOUR INT(RND*16) FILL WITH 4
IF INT(RND*3)=0 THEN SHAPE xt-rf;ht-150,xt;ht+400,xt+rf;ht-150 COLOUR 2 FILL :SHAPE xt-rf;ht-150,xt;ht+400,xt+rf;ht-150 COLOUR 14 MODE 2 FILL WITH 22
BOX xt-hf;yt,wd,1000 COLOUR 8 FILL
BOX xt-hf;yt,wd,1000 COLOUR 13 MODE 2 FILL WITH 25
BOX xt+cr;yt,2*cr,1000 COLOUR 8 FILL
BOX xt+cr;yt,2*cr,1000 COLOUR 13 MODE 2 FILL WITH 3
LINE xt-hf;yt,xt-hf;ht+100 COLOUR 14 WIDTH 3
LINE xt+cr;yt,xt+cr;ht+100 COLOUR 14 WIDTH 3
LINE xt+hf;yt,xt+hf;ht+100 COLOUR 14 WIDTH 3
BOX xt-cr-50;yt+500,100,250 COLOUR 1 FILL WITH INT(RND*8)+1
IF INT(RND*2)=0 THEN ELLIPSE xt+2*cr;yt+625,25,4 COLOUR 1 FILL WITH 12
RETURN
LABEL jb_cottage
BOX xt-25;yt, 50,cht COLOUR 10 FILL
SHAPE xt-500;yt,xt-300;ht,xt+300;ht,xt+500;yt COLOUR 6 FILL
SHAPE xt-500;yt,xt-300;ht,xt+300;ht,xt+500;yt MODE 2 COLOUR 8 FILL WITH 12
BOX xt-300;yt,150,125 COLOUR 0 FILL
BOX xt+200;yt,150,125 COLOUR 0 FILL
RETURN
LABEL jc_gable
BOX xt-200;yt,50,cht COLOUR 2 FILL
LINE xt-500;yt,xt;ht,xt+500;yt COLOUR 2 WIDTH 5
SHAPE xt-495;yt,xt;ht-5,xt+495;yt COLOUR 1 FILL WITH 35
BOX xt-50;ht-300,100,200 COLOUR 8 FILL
BOX xt-50;ht-300,100,200 COLOUR 1 MODE 2 FILL WITH 12
RETURN
LABEL jd_chalet
clr=INT(RND*16)
BOX xt-500;yt,1000,ht1 COLOUR 0 FILL
BOX xt-500;yt,1000,ht2 MODE 2 COLOUR clr FILL WITH 6
LINE xt-500;yt+ht1-25,xt+500;yt+ht1-25 COLOUR 1
FOR w=1 TO 3
BOX xt-430+330*(w-1);yt+ht1-175,200,100 COLOUR 8 FILL WITH 28
NEXT w
RETURN
LABEL je_house
cx=RND(6)
IF cx<4 THEN cx=2 ELSE IF cx=4 THEN cx=10 ELSE cx=INT(RND*15)
SHAPE xt+300;yt, xt+300;ht, xt+500;yt COLOUR cx FILL
SHAPE xt+90;yt, xt+290;ht, xt+490;yt COLOUR 1 FILL WITH 29
BOX xt-325;yt, 50,cht COLOUR 10 FILL
BOX xt+275;yt, 50,cht COLOUR 10 FILL
SHAPE xt-500;yt,xt-300;ht,xt+300;ht,xt+200;yt COLOUR cx FILL
SHAPE xt-500;yt,xt-300;ht,xt+300;ht,xt+200;yt MODE 2 COLOUR 1 FILL WITH 27
RETURN
LABEL jf_spire
ht=yt+2000 : pt=ht-750-RND(250) : wd=200+RND(200)
cr=wd/4 : hf=3*cr : rf=hf-50
SHAPE xt-rf;pt-3,xt;ht+350,xt+rf;pt-3 COLOUR 8 FILL
SHAPE xt;pt,xt;ht+350,xt+rf;pt MODE 2 COLOUR RND(16)-1 FILL ONLY WITH 4
FOR edge=1 TO 3
LINE xt-rf+rf*(edge-1);pt,xt;ht+350 COLOUR 13 WIDTH 1
NEXT edge
BOX xt-hf;yt,2*hf,pt-yt COLOUR 8 FILL
BOX xt-hf;yt,wd,pt-yt COLOUR 1 MODE 2 FILL WITH 4
BOX xt+cr;yt,2*cr,pt-yt COLOUR 1 MODE 2 FILL WITH 25
LINE xt-hf;yt,xt-hf;pt+300 COLOUR 8 WIDTH 5 STYLE 2
LINE xt+cr;yt,xt+cr;pt+300 COLOUR 8 WIDTH 5 STYLE 2
LINE xt+hf;yt,xt+hf;pt+300 COLOUR 8 WIDTH 5 STYLE 2
BOX xt-cr-50;yt+500,100,250 COLOUR 1 FILL WITH RND(8)
RETURN
LABEL k_foreground
typ=0
IF INT(RND*3)=0 THEN SHAPE 0;yfl-10, 0;yfl+90, 8360;yfr-10, 8360;yfr-110 COLOUR 0 MODE 2 FILL WITH 35
GOSUB ka_bushes
SHAPE 0;0, 0;yfl, 8360;yfr, 8360;0 COLOUR 3 FILL
LINE 0;yfl, 8360;yfr COLOUR 11
IF INT(RND*3)=0 THEN SHAPE 0;0,0;100,7500;FNyy(7500) COLOUR 14 MODE 2 FILL ONLY WITH 4
IF INT(RND*3)=0 THEN SHAPE 7000;0,2000;FNyy(2000),7250;0 COLOUR 14 MODE 2 FILL ONLY WITH 4
g=INT(RND*2) : f=INT(RND*4) : c=INT(RND*5)
FOR yt=yhold TO 0 STEP -5
xt=RND(8360)
IF yt>FNyy(xt) THEN GOTO next_y1
s=1-yt/FNyy(xt) : z=3*s+1
IF RND(70)=1 THEN GOTO set_tree
ON INT(RND*3) GOSUB kc_grass,kd_flower
GOTO next_y1
LABEL set_tree
IF s<0.2 AND xt>250*z AND xt<8360-250*z THEN GOSUB o_shrub
IF s=>0.3 AND s<0.8 THEN GOSUB kb_tree
LABEL next_y1
NEXT yt
RETURN
LABEL ka_bushes
FOR i = 1 TO INT(RND*10)+1
k=RND*0.9+0.05
xt=8360*(1-k) : yt=yfl*k+yfr*(1-k) : rr=250*RND+1
CIRCLE xt;yt,rr COLOUR 11 FILL ONLY
CIRCLE xt;yt,rr MODE 2 COLOUR 6 FILL WITH 14
NEXT i
RETURN
LABEL kb_tree
x(0)=xt
y(0)=yt : z=1.5-y(0)/FNyy(x(0))
lf=RND(3) : c1=RND(3) : c2=RND(3)
IF c2=c1 THEN c2=c2+1
IF c1=1 THEN c1=14 ELSE IF c1=2 THEN c1=8 ELSE c1=1
IF c2=2 THEN c2=8 ELSE IF c2=3 THEN c2=1 ELSE c2=14
FOR i = 1 TO 31
j=INT(i/2)
IF x(j)=0 OR x(j)=8360 OR y(j)=5000 OR y(j)=-1 THEN y(i)=-1 : GOTO i_next
s=4*FRAC(i/2)-1 : nx=INT(LOG(i)/LOG(2))+0.5 : ny=5.5-nx
k=2*INT(7*ny/10)+1
IF z>1.1 AND i<16 THEN k=k+2
IF z<0.75 AND k>1 THEN k=k-2
x(i)=x(j)+INT(s*RND*180*z*nx*(1-i/64))
y(i)=y(j)+INT(RND*ny*275*z)
IF x(i)<0 THEN IF i=1 THEN x(i)=1 ELSE x(i)=0
IF x(i)>8360 THEN IF i=1 THEN x(i)=8359 ELSE x(i)=8360
IF y(i)>5000 THEN y(i)=5000
LINE x(j);y(j),x(i);y(i) WIDTH k COLOUR c1
IF k=1 GOTO i_next
IF k>3 THEN k=k-4 ELSE k=k-2
LINE x(j);y(j),x(i);y(i) WIDTH k COLOUR c2
LABEL i_next
NEXT i
c1=RND(16)-1
FOR i=4 TO 31
IF y(i)=-1 GOTO exitnode
FOR j=11 TO 4+lf STEP -1
xlf=x(i)+z*((RND*400)-200)
ylf=y(i)+z*((RND*400)-200)
xlf2=xlf-220+RND(440): ylf2=ylf-220+RND(440)
IF xlf<0 OR xlf>8360 OR ylf<0 OR ylf>5000 THEN xlf=-1
IF xlf2<0 OR xlf2>8360 OR ylf2<0 OR ylf2>5000 THEN xlf2=-1
ON lf GOSUB leaf_1,leaf_2,leaf_3
NEXT j
LABEL exitnode
NEXT i
RETURN
LABEL leaf_1
IF RND(5)=1 THEN c2=c1 ELSE c2=3
IF xlf<>-1 THEN ELLIPSE xlf;ylf,5*j*z,2 COLOUR 11 FILL ONLY
IF xlf2<>-1 THEN ELLIPSE xlf2;ylf2,4*j*z,2 COLOUR c2 FILL ONLY
RETURN
LABEL leaf_2
IF RND(5)=1 THEN c2=c1 ELSE c2=3
IF xlf<>-1 THEN CIRCLE xlf;ylf,7*j*z COLOUR c2 FILL ONLY WITH 4
IF xlf2<>-1 THEN CIRCLE xlf2;ylf2,8*j*z COLOUR 11 FILL ONLY
RETURN
LABEL leaf_3
IF xlf<>-1 THEN CIRCLE xlf;ylf,8*j*z COLOUR c1 : CIRCLE xlf;ylf,8*j*z COLOUR 11 FILL ONLY
IF xlf2<>-1 THEN CIRCLE xlf2;ylf2,4*j*z COLOUR c1 : CIRCLE xlf2;ylf2,4*j*z COLOUR 3 FILL ONLY
RETURN
LABEL kc_grass
IF g=0 OR xt<100*s OR xt>8360-100*s THEN GOTO exitgrass
FOR j=1 TO INT(RND*5)+1
LINE xt;yt,xt+(200*RND-100)*s;yt+100*RND*s COLOUR 11 WIDTH 2*INT(RND*2)+1
NEXT j
LABEL exitgrass
RETURN
LABEL kd_flower
IF f=1 THEN GOSUB ke_crocus
IF f=2 THEN GOSUB kf_flower
IF f=3 THEN ON RND(2) GOSUB ke_crocus, kf_flower
RETURN
LABEL ke_crocus
IF xt<150*s OR xt>8360-150*s THEN GOTO exitcrocus
IF c=0 THEN c1=2*INT(RND*4) ELSE c1=2*(c-1)
r=(RND*80+10)*s+5
ELLIPSE xt;yt+500*s, r, 2 PART 180,0 COLOUR c1 FILL
LINE xt;yt, xt;yt+500*s-2*r COLOUR 11
FOR jj=1 TO 5
LINE xt;yt, xt+150*s-300*s*RND;yt+300*s-25*s*RND COLOUR 11
NEXT jj
LABEL exitcrocus
RETURN
LABEL kf_flower
IF xt<150 OR xt>8210 OR yt<150 THEN GOTO endfl
lb=INT(10*s)+1 : lm=lb+INT(RND(10)/(12-lb))
c1=RND(16)-1
FOR j=lb TO lm
IF j MOD 2 = 1 THEN c2=c1 ELSE c2=11
CIRCLE xt-75+RND(150)*s;yt-75+RND(150)*s,5*j*s COLOUR c2 FILL
NEXT j
LABEL endfl
RETURN
LABEL l_mountain
x3=RND*8360
y1=yb : y5=yb
x5=x3+1000+RND*1000
x1=x3-1000-RND*1000
x2=x3-150-350*RND
x4=x3+150+350*RND
y2=y3-((y3-yb)*RND*0.3) : y4=y3-((y3-yb)*RND*0.3)
IF x2<0 THEN y2=(y2+y3)/2 : x2=0 : x1=0
IF x1<0 THEN y2=(y1+y2)/2 : x2=0 : x1=0
IF x4>8360 THEN y4=(y3+y4)/2 : x4=8360 : x5=8360
IF x5>8360 THEN y4=(y4+y5)/2 : x4=8360 : x5=8360
y2r=2*yb-y2 : y4r=2*yb-y4 : y3r=2*yb-y3
SHAPE x1;y1,x2;y2,x3;y3,x4;y4,x5;y5 COLOUR tc(col) FILL ONLY WITH 4
SHAPE x1;y1,x2;y2r,x3;y3r,x4;y4r,x5;y5 COLOUR tc(col) FILL
RETURN
LABEL m_isle
double=0
x3=RND*8360
IF x3<250 OR x3>8110 THEN GOTO m_isle
LABEL dupl
IF INT(RND*3)=0 THEN GOSUB q_islet : GOTO exitisle
y3=yb+200*level*RND
IF y3-yb<100*level THEN GOTO dupl
y1=yb : y5=yb
x5=x3+1000+RND*1000
x1=x3-1000-RND*1000
x2=x3-200-300*RND
x4=x3+200+300*RND
y2=y3-((y3-yb)*RND*0.6) : y4=y3-((y3-yb)*RND*0.6)
IF x2<0 THEN y2=(y2+y3)/2 : x2=0 : x1=0
IF x1<0 THEN y2=(y1+y2)/2 : x2=0 : x1=0
IF x4>8360 THEN y4=(y3+y4)/2 : x4=8360 : x5=8360
IF x5>8360 THEN y4=(y4+y5)/2 : x4=8360 : x5=8360
y2r=2*yb-y2 : y4r=2*yb-y4 : y3r=2*yb-y3
clr=8*INT(RND*2)+3
SHAPE x1;y1,x2;y2,x3;y3,x4;y4,x5;y5 COLOUR clr FILL
SHAPE x1;y1,x2;y2r,x3;y3r,x4;y4r,x5;y5 COLOUR clr FILL
LABEL endhill
IF INT(RND*3)=0 OR double>=3 GOTO singl
double=double+1
LABEL modify
x3old=x3
IF x3>7100 THEN x3=x3-1000*RND : GOTO dupl
IF x3<1260 THEN x3=x3+1000*RND : GOTO dupl
x3=x3+1000-2000*RND
IF ABS(x3old-x3)<500 THEN GOTO modify
GOTO dupl
LABEL singl
IF INT(RND*3)<>0 OR mono=2 THEN GOTO exitisle
ELLIPSE x3;y3-100,20*level,12 PART 0,180 COLOUR 8 FILL
ELLIPSE x3+15*level;y3-100,10*level,14 PART 0,180 COLOUR 1
ELLIPSE x3;y3r+100,20*level,12 PART 180,360 COLOUR 8 FILL
ELLIPSE x3+15*level;y3r+100,10*level,14 PART 180,360 COLOUR 1
mono=mono+1
LABEL exitisle
RETURN
LABEL n_boats
IF INT(RND*3)=0 THEN GOTO exitboat
IF yb<170*level THEN GOTO exitboat
IF xb<400 THEN xb=800-xb
IF xb>7960 THEN xb=15920-xb
kt=INT(RND*3)+1
FOR boat=1 TO kt
xx=xb-330+330*(boat-1) : clr=2*INT(RND*4) : q=10*level*(2*INT(RND*2)-1)
BOX xx-q;yb-q,2*q,2*q COLOUR 1 FILL
SHAPE xx-2*q;yb+q,xx+2*q;yb+17*q,xx+2*q;yb+q COLOUR clr FILL
SHAPE xx-2*q;yb-q,xx+2*q;yb-17*q,xx+2*q;yb-q COLOUR clr FILL
NEXT boat
LABEL exitboat
RETURN
LABEL o_shrub
sh=RND(3)
IF sh=2 THEN c1=14 ELSE c1=1
c2=RND(16)-1
ht=(300+100*sh)*z
IF yt+3*ht/2<FNyz(xt) AND (typ=1 OR typ=2) THEN GOTO o_exit
LINE xt;yt,xt;yt+ht WIDTH 3 COLOUR c1
FOR g = 1 TO 20+8*sh
xg=(RND*500-250)*z : yg=RND*ht-ht/2
IF (xg/(250*z))^2+(2*yg/ht)^2 < 1 THEN CIRCLE xt+xg;yt+ht+yg, 60*z COLOUR c2 : CIRCLE xt+xg;yt+ht+yg, 60*z COLOUR 11 FILL ONLY
xg=(RND*500-250)*z : yg=RND*ht-ht/2
IF (xg/(250*z))^2+(2*yg/ht)^2 < 1 THEN CIRCLE xt+xg;yt+ht+yg, 40*z COLOUR 3 FILL
NEXT g
LABEL o_exit
RETURN
LABEL p_gorse
rr=25+100*RND : c1=8*INT(RND*2)+3
ELLIPSE xt;yt+3*rr,rr,3 COLOUR c1 FILL ONLY
ELLIPSE xt;yt+3*rr,rr,3 MODE 2 COLOUR ((c1+8) MOD 16) FILL WITH 14
RETURN
LABEL q_islet
xb=x3
IF xb<600 THEN xb=1200-xb
IF xb>7760 THEN xb=15520-xb
ELLIPSE xb;yb,200*level,0.3 COLOUR 3 FILL
FOR j=1 TO INT(RND*9)+1
xx=(150*RND-75)*level : yy=75*RND*level : rr=75*RND*level
CIRCLE xb+xx;yb+yy,rr COLOUR 11 FILL
CIRCLE xb+xx;yb-yy,rr COLOUR 11 FILL
NEXT j
RETURN