100 init 110 randomize 120 emax=10 130 mapsize=11 140 dim ex(emax),ez(emax),ed(emax),edx(emax),edz(emax),et(emax),ed2(emax) 150 dim map(mapsize,mapsize) 160 campos 1,40*mapsize/2+20,-270,-85 170 camrot 1,pi/4,0,0 180 call initfirst 190 stage=1 200 call initmap(stage) 210 call initplayer 220 bgmplay 1 230 rem ####################### main 240 label sstart !!! start 250 rx=-pi/2 260 textcol white 270 locate 15,10 280 print"STAGE";stage 290 do 300 rx=rx+0.03 310 camrot 1,rx,0,0 320 fsync 1 330 loop while rxpi*2 then ir=ir-pi*2 470 modrot 3,0,ir,0 480 modrot 4,0,ir,0 490 locate 0,0 500 print"SCORE:";psc 510 print" MP:";pmp 520 fsync 1 530 goto *main 540 label ending !!! game-over 550 bgmstop 560 seplay 21,100,100 570 fsync 30 580 for i=1 to enum 590 modoff 50+i 600 next i 610 call getrot(pd,dd) 620 locate 14,0 630 print"GAME OVER" 640 yy=0 650 do 660 yy=yy+0.5 670 dd=dd+0.2 680 if dd>pi*2 then dd=dd-pi*2 690 modpos 1,px,yy,pz 700 modrot 1,0,dd,0 710 fsync 1 720 loop while yy<50 730 locate 0,10 740 rem ###################### touch 750 sub checktouch(ret) 760 r=collision(1,51,50+enum) 770 if r>0 and et(r-50)=0 then 780 ret=1 790 else 800 ret=0 810 end if 820 end sub 830 rem ###################### catch 840 sub checkcatch(ret) 850 ret=0 860 cc=collision(1,3,4) 870 if cc>0 then 880 if cc=3 then 890 modoff 3 900 call getrndpos(x,z) 910 modpos 4,x,0,z 920 moddisp 4 930 ret=3 940 seplay 7,100,100 950 elseif cc=4 then 960 locate 13,0 970 print"STAGE CLEAR!" 980 seplay 7,100,100 990 fsync 60 1000 psc=psc+stage*100 1010 modoff 4 1020 clear 1030 for i=1 to enum 1040 call getrot(ed(i),ed2(i)) 1050 next i 1060 yy=0 1070 seplay 36,100,100 1080 do 1090 yy=yy+0.5 1100 for i=1 to enum 1110 ed2(i)=ed2(i)+0.1 1120 if ed2(i)>pi*2 then ed2(i)=ed2(i)-pi*2 1130 modpos 50+i,ex(i),yy,ez(i) 1140 modrot 50+i,0,ed2(i),0 1150 next i 1160 fsync 1 1170 loop while yy<50 1180 stage=stage+1 1190 call initmap(stage) 1200 ret=4 1210 end if 1220 end if 1230 end sub 1240 rem ################# move-pl 1250 sub movepl 1260 if sd>0 then 1270 select case sd 1280 case 1 1290 sz=sz+sv 1300 case 2 1310 sz=sz-sv 1320 case 3 1330 sx=sx-sv 1340 case 4 1350 sx=sx+sv 1360 end select 1370 modpos 2,sx,0,sz 1380 modopt 2,rnd*0.1+0.5,1,0,1 1390 if sx<40 or sz<40 or sx>440 or sz>440 then 1400 modoff 2 1410 sd=0 1420 else 1430 ec=collision(2,51,50+enum) 1440 if ec>0 then 1450 if et(ec-50)=0 then 1460 et(ec-50)=60 1470 modoff 2 1480 sd=0 1490 psc=psc+10 1500 seplay 12,100,100 1510 end if 1520 end if 1530 end if 1540 end if 1550 if pd>0 then 1560 px0=pdx-px 1570 pz0=pdz-pz 1580 select case pd 1590 case 1 1600 pz=pz+pv 1610 case 2 1620 pz=pz-pv 1630 case 3 1640 px=px-pv 1650 case 4 1660 px=px+pv 1670 end select 1680 px1=pdx-px 1690 pz1=pdz-pz 1700 if px1*px0<=0 and pz1*pz0<=0 then 1710 px=pdx 1720 pz=pdz 1730 pd=0 1740 end if 1750 modpos 1,px,0,pz 1760 end if 1770 xx=pad(1,14)-127 1780 zz=pad(1,13)-127 1790 if pd=0 then 1800 !if pd=0 and abs(xx)>30 and abs(zz)>30 then 1810 pdx=px 1820 pdz=pz 1830 if abs(zz)>abs(xx) then xx=0 1840 if xx<-30 then 1850 pd=3 1860 pdx=px-40 1870 elseif xx>30 then 1880 pd=4 1890 pdx=px+40 1900 elseif zz<-30 then 1910 pd=1 1920 pdz=pz+40 1930 elseif zz>30 then 1940 pd=2 1950 pdz=pz-40 1960 end if 1970 if pd>0 then 1980 call getrot(pd,r) 1990 modrot 1,0,r,0 2000 pd0=pd 2010 call getmappat(pdx,pdz,m) 2020 if m>0 then 2030 pd=0 2040 pdx=px 2050 pdz=pz 2060 end if 2070 end if 2080 end if 2090 a=pad(1,6) 2100 if a>20 and a0<=20 and sd=0 and pmp>=10 then 2110 sd=pd0 2120 sx=px 2130 sz=pz 2140 modpos 2,sx,0,sz 2150 moddisp 2 2160 pmp=pmp-10 2170 seplay 6,100,100 2180 end if 2190 end sub 2200 rem ################# move-en 2210 sub moveen 2220 for n=1 to enum 2230 if et(n)>0 then 2240 et(n)=et(n)-0.4 2250 modpos 50+n,ex(n),et(n),ez(n) 2260 if et(n)<0 then et(n)=0 2270 elseif ed(n)>0 then 2280 ex0=edx(n)-ex(n) 2290 ez0=edz(n)-ez(n) 2300 select case ed(n) 2310 case 1 2320 ez(n)=ez(n)+ev 2330 case 2 2340 ez(n)=ez(n)-ev 2350 case 3 2360 ex(n)=ex(n)-ev 2370 case 4 2380 ex(n)=ex(n)+ev 2390 end select 2400 ex1=edx(n)-ex(n) 2410 ez1=edz(n)-ez(n) 2420 if ex1*ex0<=0 and ez1*ez0<=0 then 2430 ex(n)=edx(n) 2440 ez(n)=edz(n) 2450 ed(n)=0 2460 end if 2470 modpos 50+n,ex(n),0,ez(n) 2480 else 2490 call setnewend(n) 2500 end if 2510 next n 2520 end sub 2530 rem ################ setnewen-d 2540 sub setnewend(n) 2550 !x=40*int((ex(n)+39)/40) 2560 !ex(n)=x 2570 !z=40*int((ez(n)+39)/40) 2580 !ez(n)=z 2590 m=1 2600 do 2610 x=ex(n) 2620 z=ez(n) 2630 d=int(rnd*4)+1 2640 select case d 2650 case 1 2660 z=z+40 2670 case 2 2680 z=z-40 2690 case 3 2700 x=x-40 2710 case 4 2720 x=x+40 2730 end select 2740 call getmappat(x,z,m) 2750 loop until m=0 2760 call getrot(d,r) 2770 modrot 50+n,0,r,0 2780 edx(n)=x 2790 edz(n)=z 2800 ed(n)=d 2810 end sub 2820 rem ################# getrot 2830 sub getrot(d,r) 2840 select case d 2850 case 1 2860 r=pi 2870 case 2 2880 r=0 2890 case 3 2900 r=pi/2 2910 case 4 2920 r=pi*3/2 2930 end select 2940 end sub 2950 rem ################# getrndpos 2960 sub getrndpos(x,z) 2970 do 2980 m=1 2990 do 3000 x=(int(rnd*9)+2)*40 3010 z=(int(rnd*9)+2)*40 3020 call getmappat(x,z,m) 3030 loop until m=0 3040 xx=abs(px-x) 3050 zz=abs(pz-z) 3060 loop until xx>40 and zz>40 3070 end sub 3080 rem ################# getmappat 3090 sub getmappat(x,z,m) 3100 xx=x/40 3110 zz=z/40 3120 m=map(xx,zz) 3130 end sub 3140 rem ################# init-en 3150 sub initen 3160 ev=0.2+stage*0.1 3170 for i=1 to emax 3180 en=50+i 3190 et(i)=0 3200 if i<=enum then 3210 do 3220 x=int(rnd*5)+6 3230 z=int(rnd*5)+6 3240 loop while map(x,z)=1 3250 ex(i)=x*40 3260 ez(i)=z*40 3270 ed(i)=int(rnd*4)+1 3280 call getrot(ed(i),r) 3290 modrot en,0,r,0 3300 modpos en,ex(i),0,ez(i) 3310 modset en,6,epat 3320 moddisp en 3330 call setnewend(i) 3340 else 3350 modoff en 3360 end if 3370 next i 3380 end sub 3390 rem ############### init-player 3400 sub initplayer 3410 px=2*40 3420 pz=2*40 3430 modset 1,6,2 3440 modpos 1,px,0,pz 3450 moddisp 1 3460 pdx=px 3470 pdz=pz 3480 pd0=2 3490 pv=2 3500 sd=0 3510 sv=5 3520 modset 2,5,2 3530 modset 3,4,8 3540 modset 4,4,1 3550 end sub 3560 rem ################ init-first 3570 sub initfirst 3580 modset 9,4,10 3590 modopt 9,10,1,0,1 3600 modpos 9,200,0,200 3610 ambcol 100,100,100 3620 psc=0 3630 pmp=100 3640 pmpmax=100 3650 end sub 3660 rem ################# init-map 3670 sub initmap(s) 3680 px=2*40 3690 pz=2*40 3700 pd=0 3710 modpos 1,px,0,pz 3720 if s<7 then 3730 select case s 3740 case 1 3750 restore 4410 3760 case 2 3770 restore 4420 3780 case 3 3790 restore 4430 3800 case 4 3810 restore 4440 3820 case 5 3830 restore 4450 3840 case 6 3850 restore 4460 3860 end select 3870 read epat,enum 3880 else 3890 epat=int(rnd*5)+6 3900 enum=s-1 3910 if enum>emax then enum=emax 3920 end if 3930 mp=mod(s,3) 3940 if mp=1 then 3950 m1=2 3960 m2=10 3970 bgcol 0,50,0 3980 elseif mp=2 then 3990 m1=3 4000 m2=8 4010 bgcol 50,50,0 4020 else 4030 m1=1 4040 m2=9 4050 bgcol 50,50,50 4060 end if 4070 k=0 4080 for i=1 to mapsize 4090 for j=1 to mapsize 4100 k=k+1 4110 if i=1 or i=mapsize or j=1 or j=mapsize then 4120 map(i,j)=1 4130 elseif mod(i,2)=1 and mod(j,2)=1 then 4140 map(i,j)=1 4150 else 4160 map(i,j)=0 4170 end if 4180 x=j*40 4190 z=i*40 4200 modset 100+k,3,m1 4210 modpos 100+k,x,40,z 4220 moddisp 100+k 4230 if map(i,j)=1 then 4240 modset 250+k,3,m2 4250 modpos 250+k,x,0,z 4260 moddisp 250+k 4270 end if 4280 next j 4290 next i 4300 call initen 4310 call getrndpos(x,z) 4320 modpos 3,x,0,z 4330 moddisp 3 4340 ch=3 4350 sd=0 4360 modoff 2 4370 moddisp 9 4380 pmp=pmp+pmpmax/2 4390 if pmp>pmpmax then pmp=pmpmax 4400 end sub 4410 data 7,2 4420 data 8,3 4430 data 6,3 4440 data 7,5 4450 data 9,3 4460 data 10,3