Home » Archimedes archive » Archimedes World » AW-1993-07.adf » AWJuly93 » !AWJuly93/Goodies/Poly/!Poly/!RunImage
!AWJuly93/Goodies/Poly/!Poly/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1993-07.adf » AWJuly93 |
Filename: | !AWJuly93/Goodies/Poly/!Poly/!RunImage |
Read OK: | ✔ |
File size: | 7F1B bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM ><POLY$DIR>.!RunImage 20ON ERROR PROCErrorTrap 30*KEY1 EDIT|M 40*<POLY$DIR>.roundset 50DIM chr(8,8),val(8),pent(13,8,5),pentvar(12),rot$(12),hexvar(35) 60DIM hex(36,8,6),disp(25,25),disp1(25,25),disp2(25,25),disp3(25,25) 70DIM disp4(25,25),an_x(20,12),an_y(20,12),an_p(20,12),an_v(20,12),line$(100) 80DIM an_n$(20),an_grx(20),an_gry(20),col(12),colp(12),poly(6,6),err$(10) 90DIM ypos(24),menext(12,4),menu$(12,12),menux(12,12),menuy(12,12) 100DIM menset$(12,12),name% 16 110*fx200,1 120PROCScreen 130time=TIME 140VDU 23;8202;0;0;0; 150PROCSetup 160REPEAT UNTIL TIME-time>300 170MODE 13 180VDU 23;8202;0;0;0; 190*<POLY$DIR>.!Palette 200PROCMainMenu 210MOUSE OFF 220VDU 4 230*<POLY$DIR>.Default 240*<POLY$DIR>.!PalDef 250COLOUR 3 260CLS:PRINTTAB(17,14)"B Y E" 270END 280: 290: 300DEFPROCMainMenu 310GCOL back TINT 64 320CLG 330PROCTitle("Main Menu") 340PROCMenuSet(2) 350tf=FALSE 360REPEAT 370 PROCMenuChoice(2,ch) 380 CASE ch OF 390 WHEN 1: PROCTutorial:PROCMainMenu 400 WHEN 2: PROCPentomino(1000,700):PROCMainMenu 410 WHEN 3: PROCHexomino(1020,660):PROCMainMenu 420 WHEN 4: PROCRectangle:PROCMainMenu 430 WHEN 5: PROCAnimalMenu:PROCMainMenu 440 WHEN 6: PROCPentoShapes:PROCMainMenu 450 WHEN 7: PROCTessellate:PROCMainMenu 460 WHEN 8: PROCAccess:PROCMainMenu 470 WHEN 9: IF FNYesNo("Are you sure?") tf=TRUE 480 ENDCASE 490UNTIL tf 500ENDPROC 510: 520: 530DEFPROCAccess 540IF menset$(1,1)="Y" THEN 550 PROCTitle("Teacher Control") 560 GCOL 63 570 MOVE 200,800:PRINT "Access Code:" 580 p$="" 590 *fx 15,0 600 REPEAT 610 a$=INKEY$(5) 620 p$=p$+a$ 630 IF a$<>"" MOVE 600+LEN(p$)*32,800:PRINT"-" 640 UNTIL a$=CHR$(13) OR LEN(p$)>8 OR p$=pass$ 650 IF p$<>pass$ ENDPROC 660ENDIF 670PROCTeacherControl(1) 680ENDPROC 690: 700: 710DEFPROCSetAccess 720ok$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" 730GCOL 63 740MOVE 200,400:PRINT"Old Access Code: ";pass$ 750MOVE 200,300:PRINT"New Access Code: " 760PROCInput(744,300,8,ok$,p$) 770GCOL back-128 TINT 64 780RECTANGLEFILL 20,10,1200,50 790IF p$<>"" THEN 800 IF FNYesNo("Set Password?") THEN 810 pass$=p$ 820 pw=OPENOUT("<POLY$DIR>.Password") 830 FOR i=1 TO LEN(p$) 840 PRINT#pw,CHR$(ASC(MID$(p$,i,1))-43) 850 NEXTi 860 PRINT#pw,"]" 870 CLOSE#pw 880 ENDIF 890ENDIF 900GCOL back-128 TINT 64 910RECTANGLEFILL 20,10,1200,400 920GCOL fore TINT 192 930MOVE 150,40:PRINT "'X'-Exit 'S'-Save '� �'-Menus" 940MOUSE RECTANGLE 1016,48,172,800 950ENDPROC 960: 970: 980DEFPROCInput(x%,y%,l%,ok$,RETURN word$) 990*fx15,0 1000word$="" 1010MOUSE OFF 1020REPEAT 1030 c$=INKEY$(5) 1040 GCOL 8 TINT 192:LINE x%,y%-36,x%+32,y%-36:GCOL 63 TINT 192 1050 IF c$<>"" AND INSTR(ok$,c$)<>0 AND LEN(word$)<l% THEN 1060 GCOL back-128 TINT 64:LINE x%,y%-36,x%+32,y%-36:GCOL 63 TINT 192 1070 MOVE x%,y% 1080 PRINT c$ 1090 word$=word$+c$ 1100 x%+=32 1110 ENDIF 1120 IF INKEY(-113) word$="":MOUSE ON:ENDPROC 1130 IF INKEY(-90) AND LEN(word$)>0 THEN 1140 GCOL back-128 TINT 64 1150 x%-=32 1160 RECTANGLEFILL x%,y%,64,-40 1170 word$=LEFT$(word$) 1180 *fx15,0 1190 GCOL 63 TINT 192 1200 ENDIF 1210UNTIL c$=CHR$(13) 1220MOUSE ON 1230ENDPROC 1240: 1250: 1260DEFPROCTeacherControl(menu%) 1270LOCAL on$,off$ 1280PROCTitle("Teacher Control") 1290GCOL fore TINT 192 1300MOVE 1000,900:PRINT "ON OFF" 1310MOVE 150,40:PRINT "'X'-Exit 'S'-Save '� �'-Menus" 1320PROCMenuSet(menu%) 1330i=1 1340REPEAT 1350 GCOL fore TINT 192 1360 RECTANGLE 1016,848-(i-1)*90,40,-40 1370 RECTANGLE 1148,848-(i-1)*90,40,-40 1380 i+=1 1390UNTIL menu$(menu%,i)="z" 1400i=1 1410REPEAT 1420 IF menset$(menu%,i)="Y":on$="X":off$=" " 1430 IF menset$(menu%,i)="N":on$=" ":off$="X" 1440 IF menset$(menu%,i)="F":on$="X":off$="X" 1450 MOVE 1152,840-(i-1)*90:PRINT off$ 1460 MOVE 1020,840-(i-1)*90:PRINT on$ 1470 i+=1 1480UNTIL menset$(menu%,i)="E" 1490MOUSE RECTANGLE 1016,48,172,800 1500MOUSE ON 1 1510REPEAT 1520 REPEAT 1530 REPEAT 1540 MOUSEmsx,msy,msstatus 1550 IF INKEY(-2) AND INKEY(-56) AND menu%=1 PROCSetAccess 1560 IF INKEY(-67) ENDPROC 1570 IF INKEY(-122) THEN 1580 menu%+=1 1590 IF menu%>5 menu%=1 1600 PROCTeacherControl(menu%) 1610 IF saveflag ENDPROC 1620 ENDIF 1630 IF INKEY(-26) THEN 1640 menu%-=1 1650 IF menu%<1 menu%=5 1660 PROCTeacherControl(menu%) 1670 ENDIF 1680 IF INKEY(-82) THEN 1690 PROCSaveConfig(saveflag) 1700 IF saveflag ENDPROC 1710 GCOL back-128 TINT 64 1720 RECTANGLEFILL 20,10,1200,50 1730 GCOL fore TINT 192 1740 MOVE 150,40:PRINT "'X'-Exit 'S'-Save '� �'-Menus" 1750 ENDIF 1760 UNTIL msstatus<>0 1770 item=1:choice=0 1780 boxx=1016:boxy=848 1790 REPEAT 1800 IF msx>boxx AND msx<boxx+40 AND msy<boxy AND msy>boxy-40 choice=item 1810 IF msx>boxx+132 AND msx<boxx+172 AND msy<boxy AND msy>boxy-40 choice=-item 1820 item+=1 1830 boxy=boxy-90 1840 UNTIL item=10 OR choice<>0 1850 UNTIL choice<>0 1860 onoff$=menset$(menu%,ABS(choice)) 1870 IF onoff$="Y" AND choice<0 THEN 1880 GCOL back-128 TINT 64 1890 RECTANGLEFILL boxx+4,boxy+86,32,-32 1900 GCOL fore TINT 192 1910 MOVE boxx+136,boxy+82 1920 PRINT "X" 1930 menset$(menu%,ABS(choice))="N" 1940 ENDIF 1950 IF onoff$="N" AND choice>0 THEN 1960 GCOL back-128 TINT 64 1970 RECTANGLEFILL boxx+136,boxy+86,32,-32 1980 GCOL fore TINT 192 1990 MOVE boxx+4,boxy+82 2000 PRINT "X" 2010 menset$(menu%,ABS(choice))="Y" 2020 ENDIF 2030UNTIL FALSE 2040ENDPROC 2050: 2060: 2070DEFPROCSaveConfig(RETURN saveflag) 2080saveflag=FALSE 2090GCOL back-128 TINT 64 2100RECTANGLEFILL 20,10,1200,50 2110IF FNYesNo("Save Options?") THEN 2120 cf=OPENUP("<POLY$DIR>.configure") 2130 FOR i=1 TO 5 2140 j=1 2150 REPEAT 2160 PRINT#cf,menset$(i,j) 2170 j+=1 2180 UNTIL menset$(i,j-1)="E" 2190 NEXTi 2200 CLOSE#cf 2210 saveflag=TRUE 2220ENDIF 2230MOUSE RECTANGLE 1016,48,172,800 2240ENDPROC 2250: 2260: 2270DEFPROCScreen 2280*SCREENLOAD <POLY$DIR>.Title 2290ENDPROC 2300: 2310: 2320DEFPROCAnimalMenu 2330PROCTitle("PentAnimals") 2340PROCMenuSet(3) 2350tf=FALSE 2360REPEAT 2370 PROCMenuChoice(3,ch) 2380 CASE ch OF 2390 WHEN 1,2,3,4,5,6,7,8: PROCPuzzles(ch):PROCAnimalMenu 2400 WHEN 9: tf=TRUE 2410 ENDCASE 2420UNTIL tf 2430ENDPROC 2440: 2450: 2460DEFPROCPentoShapes 2470PROCTitle("PentoShapes") 2480PROCMenuSet(5) 2490tf=FALSE 2500REPEAT 2510 PROCMenuChoice(5,ch) 2520 CASE ch OF 2530 WHEN 1,2,3,4,5: PROCPuzzles(8+ch):PROCPentoShapes 2540 WHEN 6: tf=TRUE 2550 ENDCASE 2560UNTIL tf 2570ENDPROC 2580: 2590: 2600DEFPROCPentomino(xmin,ymin) 2610sq=5 2620gap=40 2630PROCTitle("Pentomino Designer") 2640poly$="":var$="" 2650PROCGridPlot(88,904,4,3) 2660PROCMenuSet(6) 2670PROCGrid(1000,900,sq,sq,2,1,4,40) 2680REPEAT 2690 PROCClear(xmin,ymin) 2700 REPEAT 2710 PROCCreatePoly(xmin,ymin,sq,gap) 2720 IF LEN(poly$)=12 PROCWellDone2:ENDPROC 2730 UNTIL ch=2 2740UNTIL FNYesNo("Are you sure?") 2750chr()=0 2760ENDPROC 2770: 2780: 2790DEFPROCHexomino(xmin,ymin) 2800sq=6 2810gap=20 2820PROCTitle("Hexomino Designer") 2830poly$="":var$="" 2840PROCGridPlot(28,908,7,5) 2850PROCMenuSet(7) 2860PROCGrid(1020,900,sq,sq,2,1,4,40) 2870REPEAT 2880 PROCClear(xmin,ymin) 2890 REPEAT 2900 PROCCreatePoly(xmin,ymin,sq,gap) 2910 IF LEN(poly$)=35 PROCWellDone2:ENDPROC 2920 UNTIL ch=2 2930UNTIL FNYesNo("Are you sure?") 2940chr()=0 2950ENDPROC 2960: 2970: 2980DEFPROCGridPlot(x%,y%,xext%,yext%) 2990LOCAL i,j 3000y%-=sq*gap+20 3010yo%=y% 3020FOR i=1 TO xext% 3030 FOR j=1 TO yext% 3040 SYS "OS_SpriteOp",256+34,S%,STR$(sq),x%,y%,0 3050 y%-=sq*gap+20 3060 NEXTj 3070 y%=yo% 3080 x%+=sq*gap+20 3090NEXTi 3100ENDPROC 3110: 3120: 3130DEFPROCPuzzles(an) 3140erroff=0:sq=5:gap=40:poly$="":dflag=FALSE 3150PROCPentanimals(an) 3160PROCMenuSet(10) 3170REPEAT 3180 tf1=FALSE 3190 IF LEN(poly$)=12 AND an<>0 PROCWellDone:tf1=TRUE 3200 IF NOT dflag AND an=0 AND LEN(poly$)<>0 dflag=TRUE:PROCDispPent(p,v) 3210 IF NOT tf1 THEN PROCMenuChoice(10,ch) 3220 CASE ch OF 3230 WHEN 1: IF dflag PROCMove(-1,0) 3240 WHEN 2: IF dflag PROCMove(1,0) 3250 WHEN 3: IF dflag PROCMove(0,1) 3260 WHEN 4: IF dflag PROCMove(0,-1) 3270 WHEN 5: IF dflag PROCFix 3280 WHEN 6: PROCRemove 3290 WHEN 7: IF dflag AND p<>6 PROCFlip 3300 WHEN 8: IF FNYesNo("Are you sure?") tf1=TRUE 3310 WHEN 9: IF NOT dflag AND LEN(poly$)<>12 PROCSelectPent(an) 3320 WHEN 10: IF dflag PROCPolyColour 3330 ENDCASE 3340 ENDIF 3350UNTIL tf1 3360FOR i=1 TO 12 3370 col(i)=colp(i) 3380NEXT i 3390ENDPROC 3400: 3410: 3420DEFPROCWellDone 3430PRINTCHR$(7); 3440GCOL fore TINT 192 3450MOVE 100,700 3460PRINT"Great Work" 3470MOVE 116,650 3480PRINT"Well Done" 3490PROCSavePic 3500PROCContinue 3510ENDPROC 3520: 3530: 3540DEFPROCWellDone2 3550GCOL fore TINT 192 3560MOVE 272,160 3570PRINTCHR$(7); 3580PRINT"Great Work - Well Done!" 3590PROCContinue 3600ENDPROC 3610: 3620: 3630DEFPROCTutorial 3640LOCAL i,j,k,pr$,pr1$ 3650PROCTitle("Polyomino Tutorial") 3660VDU 4 3670COLOUR back TINT 64 3680i=1:k=5 3690REPEAT 3700 pr$=line$(i) 3710 IF LEN(pr$)<>1 THEN 3720 pr$=RIGHT$(line$(i),LEN(line$(i))-2) 3730 col=VAL(LEFT$(line$(i),2)) 3740 WHILE LEN(pr$)<>40 3750 pr$=pr$+" " 3760 ENDWHILE 3770 COLOUR col 3780 FOR j=1 TO 40 3790 pr1$=MID$(pr$,j,1) 3800 PRINTTAB(j-1,k)pr1$; 3810 IF INKEY(-113) ENDPROC 3820 time=TIME:REPEAT UNTIL TIME-time>4 3830 NEXTj 3840 ENDIF 3850 IF pr$="!" k+=1 3860 IF pr$="@" PROCDom:k+=4 3870 IF pr$="#" PROCContinue:VDU4 3880 IF pr$="$" THEN 3890 GCOL0,back-128 TINT 64 3900 RECTANGLE FILL 0,0,1280,860 3910 k=5 3920 ENDIF 3930 IF pr$="%" PROCTri 3940 IF pr$="^" PROCTetra 3950 i+=1:k+=1 3960UNTIL line$(i)="zzz" 3970PROCContinue 3980ENDPROC 3990: 4000: 4010DEFPROCContinue 4020PROCMenuSet(9) 4030PROCMenuChoice(9,ch) 4040GCOL0,back-128 TINT 64 4050RECTANGLE FILL 500,6,300,60 4060ENDPROC 4070: 4080: 4090DEFPROCTri 4100GCOL0,48 4110RECTANGLEFILL 100,600,300,100 4120RECTANGLEFILL 700,600,200,100 4130RECTANGLEFILL 700,500,100,100 4140GCOL0,60 4150RECTANGLE 100,600,100,100 4160RECTANGLE 200,600,100,100 4170RECTANGLE 300,600,100,100 4180RECTANGLE 700,600,100,100 4190RECTANGLE 800,600,100,100 4200RECTANGLE 700,500,100,100 4210ENDPROC 4220: 4230: 4240DEFPROCTetra 4250LOCAL i 4260GCOL0,48 4270RECTANGLEFILL 200,150,50,200 4280RECTANGLEFILL 350,200,100,100 4290RECTANGLEFILL 550,175,50,150:RECTANGLEFILL 600,275,50,50 4300RECTANGLEFILL 750,175,50,150:RECTANGLEFILL 800,225,50,50 4310RECTANGLEFILL 950,250,100,50:RECTANGLEFILL 1000,200,100,50 4320GCOL 0,60 4330FOR i=1 TO 4 4340 RECTANGLE 200,100+i*50,50,50 4350NEXT i 4360FOR i=1 TO 2 4370 RECTANGLE 300+i*50,200,50,50 4380 RECTANGLE 300+i*50,250,50,50 4390 RECTANGLE 900+i*50,250,50,50 4400 RECTANGLE 950+i*50,200,50,50 4410NEXT i 4420FOR i=1 TO 3 4430 RECTANGLE 550,125+i*50,50,50 4440 RECTANGLE 750,125+i*50,50,50 4450NEXT i 4460RECTANGLE 600,275,50,50 4470RECTANGLE 800,225,50,50 4480ENDPROC 4490: 4500: 4510DEFPROCDom 4520GCOL0,0 4530RECTANGLEFILL 490,317,300,150 4540GCOL0,63 4550RECTANGLE 500,327,280,130 4560RECTANGLE 500,327,140,130 4570CIRCLEFILL 570,397,10 4580CIRCLEFILL 675,425,10 4590CIRCLEFILL 745,360,12 4600CIRCLEFILL 745,425,12 4610CIRCLEFILL 675,360,10 4620ENDPROC 4630: 4640: 4650DEFPROCRectangle 4660PROCTitle("Rectangle Menu") 4670PROCMenuSet(4) 4680REPEAT 4690 tf1=FALSE 4700 PROCMenuChoice(4,ch) 4710 CASE ch OF 4720 WHEN 1,2,3: PROCPuzzles(13+ch):PROCRectangle 4730 WHEN 4: tf1=TRUE 4740 ENDCASE 4750UNTIL tf1 4760ENDPROC 4770: 4780: 4790DEFPROCMenuSet(menu) 4800LOCAL i 4810VDU5 4820i=1 4830REPEAT 4840 rect=LEN(menu$(menu,i))*32+8 4850 mx=menux(menu,i):my=menuy(menu,i) 4860 GCOL 10 TINT 0 4870 RECTANGLE FILL mx-12,my+16,rect+16,-56 4880 GCOL 10 TINT 192 4890 RECTANGLE FILL mx-4,my+8,rect+8,-48 4900 MOVE mx-12,my-40:MOVE mx-4,my-40:PLOT&55,mx-4,my-32 4910 MOVE mx+rect-4,my+8:MOVE mx+rect+4,my+8:PLOT&55,mx+rect+4,my+16 4920 GCOL 10 TINT 64 4930 IF menset$(menu,i)="N" GCOL 20 TINT 64 4940 RECTANGLE FILL mx-4,my-32,rect,40 4950 GCOL fore TINT 192 4960 MOVE mx,my 4970 IF menset$(menu,i)="N" GCOL 20 4980 PRINT menu$(menu,i) 4990 i+=1 5000UNTIL menu$(menu,i)="z" 5010IF menu=10 THEN 5020 FOR i=0 TO 5 5030 GCOL 0,col(i+1) 5040 RECTANGLEFILL 476+(i*28),168,28,-18 5050 GCOL 0,col(i+7) 5060 RECTANGLEFILL 476+(i*28),146,28,-18 5070 NEXT i 5080ENDIF 5090IF menu=1 THEN 5100 FOR i=0 TO 5 5110 GCOL 0,col(i+1) 5120 RECTANGLEFILL 556+(i*28),576,28,-18 5130 GCOL 0,col(i+7) 5140 RECTANGLEFILL 556+(i*28),556,28,-18 5150 NEXT i 5160ENDIF 5170ENDPROC 5180: 5190: 5200DEFPROCTitle(title$) 5210len=LEN(title$) 5220x=640-32*len/2 5230GCOL back TINT 64:CLG 5240VDU5 5250GCOL 0:GCOL back 5260MOVE x-8,950:PRINT title$ 5270GCOL fore TINT 192 5280MOVE x,958:PRINT title$ 5290ENDPROC 5300: 5310: 5320DEFFNYesNo(ques$) 5330PRINT CHR$(7);CHR$(7) 5340GCOL 63 TINT 192 5350VDU 5 5360MOVE 332,50 5370PRINT ques$ 5380PROCMenuSet(8) 5390PROCMenuChoice(8,ch1) 5400GCOL 0,back-128 TINT 64 5410RECTANGLE FILL 330,10,660,60:GCOL fore TINT 192 5420IF ch1=2:=FALSE 5430:=TRUE 5440: 5450: 5460DEFPROCGrid(grx%,gry%,sqx,sqy,c1,c2,c3,gap) 5470LOCAL i%,j% 5480FORi%=1TOsqx 5490 FORj%=1TOsqy 5500 IF c1=c2 AND c2=c3 THEN 5510 PROCButtoff(grx%+(i%-1)*gap,gry%-j%*gap,c1,gap) 5520 ELSE 5530 PROCButton(grx%+(i%-1)*gap,gry%-j%*gap,c1,c2,c3,gap) 5540 ENDIF 5550 NEXT 5560NEXT 5570ENDPROC 5580: 5590: 5600DEFPROCCreatePoly(xmin,ymin,sq,gap) 5610sqcnt=0 5620MOUSE ON 1 5630MOUSE RECTANGLE xmin,ymin-190,sq*40-8,sq*40-8+190 5640REPEAT 5650 REPEAT MOUSE msx,msy,msstatus:UNTILmsstatus=0 5660 REPEAT 5670 MOUSEmsx,msy,msstatus 5680 UNTIL msstatus<>0 5690 IF sq=5 PROCMenuChoice(6,ch) 5700 IF sq=6 PROCMenuChoice(7,ch) 5710 IF ch=1 THEN 5720 tot=0 5730 FORi=1TO8:FORj=1TO8:tot+=chr(i,j):NEXTj:NEXTi 5740 IF tot<>0 THEN 5750 PROCCalc 5760 IF FNCheckPoly THEN 5770 PROCClear(xmin,ymin) 5780 PROCFlash(1,2,8) 5790 ENDPROC 5800 ELSE 5810 PROCError(err) 5820 PROCClear(xmin,ymin) 5830 ENDPROC 5840 ENDIF 5850 ENDIF 5860 ENDIF 5870 IF msy>ymin PROCOnOff(xmin,ymin) 5880UNTIL ch=2 5890ENDPROC 5900: 5910: 5920DEFPROCClear(xmin,ymin) 5930FORi=1TO8 5940 FORj=1TO8 5950 IF chr(i,j)=1 PROCButton(xmin+(i-1)*40,ymin+(-j+sq)*40,2,1,4,40) 5960 chr(i,j)=0 5970 NEXTj 5980NEXTi 5990ENDPROC 6000: 6010: 6020DEFPROCOnOff(xmin,ymin) 6030xp=INT((msx-xmin)/40)+1 6040yp=sq-INT((msy-ymin)/40) 6050IF chr(xp,yp)=1 THEN 6060 chr(xp,yp)=0 6070 sqcnt-=1 6080 PROCButton(xmin+(xp-1)*40,ymin+(-yp+sq)*40,2,1,4,40) 6090ELSE 6100 chr(xp,yp)=1 6110 sqcnt+=1 6120 PROCButton(xmin+(xp-1)*40,ymin+(-yp+sq)*40,1,2,8,40) 6130ENDIF 6140ENDPROC 6150: 6160: 6170DEFPROCCalc 6180FORi=sq TO 1 STEP-1 6190 FORj=1TOsq 6200 IF chr(j,i)=1 val(i)+=2^(sq-j) 6210 NEXTj 6220 IF sq=5 THEN pent(13,1,i)=val(i) ELSE hex(36,1,i)=val(i) 6230NEXTi 6240FORi=1TOsq:FORj=1TOsq:val(i)=0:NEXT:NEXT 6250PROCForceTopLeft(13,1) 6260IF sq=5 THEN PROCPolySize(13,1) ELSE PROCPolySize(36,1) 6270ENDPROC 6280: 6290: 6300DEFFNCheckPoly 6310p=1:tf=0:erroff=0 6320IF sq=5 THEN polynum=12 ELSE polynum=35 6330IF sq=6 erroff=3 6340REPEAT 6350 v=1 6360 REPEAT 6370 k=1:match=TRUE 6380 REPEAT 6390 IF sq=5 THEN 6400 IF pent(p,v,k)<>pent(13,1,k) match=FALSE 6410 ENDIF 6420 IF sq=6 AND hex(p,v,k)<>hex(36,1,k) match=FALSE 6430 k+=1 6440 UNTIL match=FALSE OR k>sq 6450 IF match=TRUE AND INSTR(poly$,CHR$(p+64))=0 tf=1 6460 IF tf=1 poly$+=CHR$(p+64):var$+=STR$(v):=TRUE 6470 IF match=TRUE AND INSTR(poly$,CHR$(p+64))>0 tf=2 6480 IF tf=2:err=3+erroff:=FALSE 6490 v+=1 6500 IF sq=5 polyvar=pentvar(p)*2 6510 IF sq=6 polyvar=hexvar(p)*2 6520 UNTIL v>polyvar 6530 p+=1 6540UNTIL p>polynum 6550err=1+erroff 6560IF sqcnt=sq err=2+erroff 6570=FALSE 6580: 6590: 6600DEFPROCSetup 6610LOCAL i,j,k 6620REM *** Read Data for Pentominoes and Hexominoes *** 6630ch=OPENIN("<POLY$DIR>.polydata") 6640cf=OPENIN("<POLY$DIR>.configure") 6650pw=OPENIN("<POLY$DIR>.password") 6660FOR i=1 TO 12 6670 INPUT#ch,pentvar(i) 6680 num=pentvar(i) 6690 FOR j=1 TO num*2 STEP 2 6700 FOR k=1 TO 5:INPUT#ch,pent(i,j,k):NEXTk 6710 FOR k=1 TO 5:INPUT#ch,pent(i,j+1,k):NEXTk 6720 NEXTj 6730NEXTi 6740FOR i=1 TO 35 6750 INPUT#ch,hexvar(i) 6760 num=hexvar(i) 6770 FOR j=1 TO num*2 STEP 2 6780 FOR k=1 TO 6:INPUT#ch,hex(i,j,k):NEXTk 6790 FOR k=1 TO 6:INPUT#ch,hex(i,j+1,k):NEXTk 6800 NEXTj 6810NEXTi 6820CLOSE#ch 6830REM *** Read Pentominoes' colours *** 6840FORi=1TO12 6850 READ col(i) 6860 colp(i)=col(i) 6870NEXTi 6880REM *** Read Animal Data *** 6890FORi=0TO16 6900 READ animal$,grx,gry 6910 an_n$(i)=animal$ 6920 an_grx(i)=grx 6930 an_gry(i)=gry 6940 FORj=1TO12 6950 READy1,x1,poly,var 6960 an_x(i,j)=x1 6970 an_y(i,j)=y1 6980 an_p(i,j)=poly 6990 an_v(i,j)=var 7000 NEXTj 7010NEXTi 7020REM *** Read Error Messages *** 7030FOR i=1 TO 10 7040 READ err$(i) 7050NEXTi 7060REM *** Read Menu Configuration Data *** 7070i=1 7080REPEAT 7090 j=1 7100 REPEAT 7110 INPUT#cf,m$ 7120 menset$(i,j)=m$ 7130 j+=1 7140 UNTIL m$="E" 7150 i+=1 7160UNTIL i=6 7170CLOSE#cf 7180REM *** Read Menu Data *** 7190FOR j=1 TO 10 7200 i=1 7210 READ m1,m2,m3,m4 7220 menext(j,1)=m1:menext(j,2)=m2:menext(j,3)=m3:menext(j,4)=m4 7230 REPEAT 7240 READ men$,menx,meny 7250 menu$(j,i)=men$ 7260 menux(j,i)=menx:menuy(j,i)=meny 7270 i+=1 7280 UNTIL men$="z" 7290NEXTj 7300REM *** Read Tutorial Data *** 7310i=1 7320REPEAT 7330 READ line$(i) 7340 i+=1 7350UNTIL line$(i-1)="zzz" 7360REM *** Read Pentomino Rotation Data *** 7370FOR i=1 TO 12 7380 READ rot$(i) 7390NEXTi 7400REM *** Read Password *** 7410REPEAT 7420 INPUT#pw,p$ 7430 pass$=pass$+CHR$(ASC(p$)+43) 7440UNTIL p$="]" 7450pass$=LEFT$(pass$) 7460CLOSE#pw 7470REM *** Initialise Variables *** 7480pcnt=1:an=0:back=138:fore=30:saveflag=FALSE:sp=TRUE 7490REM *** Load Sprites *** 7500s$="<POLY$DIR>.Sprite" 7510file%=OPENIN(s$) 7520L%=EXT#file%+64 7530CLOSE#file% 7540DIM S% L% 7550S%!0=L% 7560SYS "OS_SpriteOp",256+9,S% 7570SYS "OS_SpriteOp",256+10,S%,s$ 7580ENDPROC 7590: 7600: 7610DEFPROCDecToBin(dec) 7620LOCALi 7630bin$="" 7640FORi=8TO1STEP-1 7650 bin=2^(i-1) 7660 temp1=INT(dec/bin) 7670 IF temp1=1 THEN 7680 bin$=bin$+"1" 7690 dec-=bin*temp1 7700 ELSE 7710 bin$=bin$+"0" 7720 ENDIF 7730NEXTi 7740ENDPROC 7750: 7760: 7770DEFPROCDrawPoly(p,v,xpos,ypos,c1,c2,c3,c4) 7780LOCAL i,j 7790FOR i=1 TO ypoly 7800 IF sq=5 THEN dec=pent(p,v,i) ELSE dec=hex(p,v,i) 7810 PROCDecToBin(dec) 7820 FOR j=1 TO xpoly 7830 a$=MID$(bin$,j,1) 7840 IFa$="1" AND c3<>c4 THEN 7850 PROCButton(xpos+(j-1)*gap,ypos-(i-1)*gap,c1,c2,c3,gap) 7860 ELSE 7870 PROCButtoff(xpos+(j-1)*gap,ypos-(i-1)*gap,c4,gap) 7880 ENDIF 7890 NEXTj 7900NEXTi 7910ENDPROC 7920: 7930: 7940DEFPROCForceTopLeft(p,v) 7950LOCAL i 7960IF sq=6 p=36 7970REPEAT 7980 IF sq=5 dec=pent(p,v,1) ELSE dec=hex(p,v,1) 7990 IF dec=0 THEN 8000 FORi=2 TO sq 8010 IF sq=5 pent(p,v,i-1)=pent(p,v,i) 8020 IF sq=6 hex(p,v,i-1)=hex(p,v,i) 8030 NEXTi 8040 IF sq=5 pent(p,v,5)=0 ELSE hex(p,v,6)=0 8050 ENDIF 8060UNTIL dec<>0 8070REPEAT 8080 zero=0 8090 FORi=1TOsq 8100 IF sq=5 dec=pent(p,v,i) 8110 IF sq=6 dec=hex(p,v,i) 8120 PROCDecToBin(dec) 8130 zero+=VAL(LEFT$(bin$,1)) 8140 NEXTi 8150 IF zero=0 THEN 8160 FORi=1TOsq 8170 IF sq=5 pent(p,v,i)=pent(p,v,i)*2 8180 IF sq=6 hex(p,v,i)=hex(p,v,i)*2 8190 NEXTi 8200 ENDIF 8210UNTIL zero<>0 8220ENDPROC 8230: 8240: 8250DEFPROCPolySize(p,v) 8260LOCAL i 8270yoff=0:xoff=0:margin=4 8280IF sq=5 margin=8 8290i=1 8300REPEAT 8310 IF sq=5 THEN dec=pent(p,v,i) ELSE dec=hex(p,v,i) 8320 i+=1 8330UNTIL dec=0 OR i=sq+1 8340yoff=i-2 8350IF dec<>0 yoff=sq 8360FOR i=1 TO yoff 8370 IF sq=5 THEN dec=pent(p,v,i) ELSE dec=hex(p,v,i) 8380 tempx=0 8390 WHILE ((dec AND margin) <> margin) 8400 dec=dec>>1 8410 tempx+=1 8420 ENDWHILE 8430 IF (sq-tempx)>xoff xoff=sq-tempx 8440NEXTi 8450xpoly=xoff:ypoly=yoff 8460xoff=INT((sq-xoff)/2):yoff=INT((sq-yoff)/2) 8470ENDPROC 8480: 8490: 8500DEFPROCTessellate 8510LOCALi,j 8520gap=40:sq=5 8530PROCTitle("Tessellations") 8540disp()=30:disp1()=0:disp2()=0:disp3()=0:disp4()=0 8550FORi=0 TO 14 8560 FORj=0 TO 17 8570 IF i=0 OR i=14 disp(i,j)=0 8580 IF j=0 OR j=17 THEN disp(i,j)=0 8590 NEXTj 8600NEXTi 8610PROCPuzzles(0) 8620ENDPROC 8630: 8640: 8650DEFPROCPentanimals(an) 8660IF an<>0 THEN 8670 PROCTitle(an_n$(an)) 8680 PROCLoadAnimal(an) 8690ENDIF 8700x=an_grx(an):y=an_gry(an) 8710FOR i=0 TO y+1 8720 FOR j=0 TO x+1 8730 col=disp(i,j) 8740 xp%=500+40*j:yp%=860-gap*i 8750 IF col>0 SYS "OS_SpriteOp",256+34,S%,"on",xp%,yp%,0 8760 IF col=0 SYS "OS_SpriteOp",256+34,S%,"off",xp%,yp%,0 8800 NEXTj 8810NEXTi 8820x=40:y=860:gap=32 8830FORj=1TO12 8840 p=an_p(an,j) 8850 v=an_v(an,j) 8860 PROCPolySize(p,v) 8870 IF j=7 x=40+gap*6:y=860 8880 PROCDrawPoly(p,v,x,y,0,0,col(p),10) 8890 ypos(j*2)=y 8900 y=y-(ypoly*gap)-gap 8910 ypos(j*2-1)=y+gap*2 8920NEXTj 8930gap=40 8940ENDPROC 8950: 8960: 8970DEFPROCPolyColour 8980pcol=POINT(msx,msy) 8990col(p)=pcol 9000PROCUpdatePic 9010ENDPROC 9020: 9030: 9040DEFPROCOnePoly 9050LOCAL i,j,v,x,y 9060sq=5:gap=40 9070x=40:y=860 9080GCOL0,back-128 TINT 64 9090RECTANGLEFILL 40,100,340,800 9100num=LEN(rot$(p)) 9110FORj=1TOnum 9120 v=VAL(MID$(rot$(p),j,1)) 9130 PROCPolySize(p,v) 9140 PROCDrawPoly(p,v,x,y,0,0,60,10) 9150 ypos(j*2)=y 9160 y=y-(ypoly*gap)-gap 9170 ypos(j*2-1)=y+gap*2 9180 IF num/2=j x=40+gap*6:y=860 9190NEXTj 9200ENDPROC 9210: 9220: 9230DEFPROCSelectPent(an) 9240MOUSE RECTANGLE 40,100,340,800 9250MOUSE ON 1 9260REM REPEAT MOUSE msx,msy,msstatus:UNTILmsstatus=0 9270REPEAT 9280 REPEAT 9290 MOUSEmsx,msy,msstatus 9300 UNTIL msstatus<>0 9310 gap=32:xmin=40:j=1:tf=FALSE 9320 REPEAT 9330 IF j=7 xmin=232 9340 p=an_p(an,j) 9350 v=an_v(an,j) 9360 ymin=ypos(j*2-1)-4:ymax=ypos(j*2)+gap 9370 PROCPolySize(p,v) 9380 xmax=xmin+gap*xpoly 9390 IF msx>xmin AND msx<xmax AND msy>ymin AND msy<ymax AND INSTR(poly$,CHR$(64+p))=0 THEN 9400 PROCDrawPoly(p,v,xmin,ymax-gap,back-128,back-128,back-128,back-128) 9410 tf=TRUE 9420 ENDIF 9430 j+=1 9440 UNTIL j=13 OR tf 9450 gap=40 9460 IF an=0 AND tf PROCOnePoly 9470 IF tf PROCDispPent(p,v):ENDPROC 9480UNTIL FALSE 9490ENDPROC 9500: 9510: 9520DEFPROCDispPent(p,v) 9530dflag=TRUE 9540IF an=0 PROCPolySize(p,v) 9550grx=an_grx(an) 9560gry=an_gry(an) 9570x=INT(grx/2-xpoly/2) 9580y=INT(gry/2-ypoly/2) 9590FORj=1TOypoly 9600 dec=pent(p,v,j) 9610 PROCDecToBin(dec) 9620 FORk=1TOxpoly 9630 IF MID$(bin$,k,1)="1" THEN 9640 disp1(y+j,x+k)=p 9650 ENDIF 9660 NEXTk 9670NEXTj 9680FOR i=0 TO grx+1 9690 FOR j=0 TO gry+1 9700 col=disp1(j,i) 9710 IF col>0 PROCButton(500+40*i,860-gap*j,0,0,col(col),gap) 9720 NEXTj 9730NEXTi 9740ENDPROC 9750: 9760: 9770DEFPROCFlip 9780LOCAL i,j 9790IF an=16 AND p=1 ENDPROC 9800PROCPolySize(p,v) 9810FOR i=0 TO grx+1 9820 FOR j=0 TO gry+1 9830 IF disp1(j,i)=p THEN 9840 disp1(j,i)=0 9850 ENDIF 9860 NEXTj 9870NEXTi 9880PROCUpdatePic 9890rot=INSTR(rot$(p),STR$(v)) 9900IF rot=LEN(rot$(p)) v=VAL(LEFT$(rot$(p),1)) 9910IF rot<LEN(rot$(p)) v=VAL(MID$(rot$(p),rot+1,1)) 9920PROCPolySize(p,v) 9930PROCDispPent(p,v) 9940ENDPROC 9950: 9960: 9970DEFPROCUpdatePic 9980LOCAL i,j 9990FORi=y TO y+ypoly 10000 FORj=x TO x+xpoly 10010 col=disp1(i,j) 10020 IF col<>0 AND sp THEN 10030 PROCButton(500+40*j,860-gap*i,0,0,col(col),gap) 10040 ELSE 10050 col=disp2(i,j) 10060 IF col<>0 THEN 10070 PROCButton(500+40*j,860-gap*i,1,2,disp3(i,j),gap) 10080 ELSE 10090 col=disp(i,j) 10100 IF col<>0 THEN 10110 PROCButton(500+40*j,860-gap*i,1,2,30,gap) 10120 ELSEIF disp2(i,j)=0 10130 PROCButton(500+40*j,860-gap*i,2,1,4,gap) 10140 ENDIF 10150 ENDIF 10160 ENDIF 10170 NEXTj 10180NEXTi 10190ENDPROC 10200: 10210: 10220DEFPROCMove(x1,y1) 10230LOCAL i,j 10240xoff1=0:xoff2=0:yoff1=0:yoff2=0 10250PROCPolySize(p,v) 10260IF y1=-1 AND y-1>-1 THEN 10270 FORi=x TO x+xpoly 10280 FORj=y TO y+ypoly 10290 disp1(j-1,i)=disp1(j,i) 10300 NEXTj 10310 NEXTi 10320 FORi=x TO x+xpoly 10330 disp1(y+ypoly,i)=0 10340 NEXTi 10350 y-=1 10360 yoff1=1:xoff1=1:xoff2=-1 10370ENDIF 10380IF y1=1 AND y+ypoly<gry THEN 10390 FORi=x TO x+xpoly 10400 FORj=y+ypoly TO y STEP-1 10410 disp1(j+1,i)=disp1(j,i) 10420 NEXTj 10430 NEXTi 10440 FORi=x TO x+xpoly 10450 disp1(y,i)=0 10460 NEXTi 10470 y+=1 10480 yoff2=-1:xoff1=1:xoff2=-1 10490ENDIF 10500IF x1=-1 AND x-1>-1 THEN 10510 FORi=x TO x+xpoly 10520 FORj=y TO y+ypoly 10530 disp1(j,i-1)=disp1(j,i) 10540 NEXTj 10550 NEXTi 10560 FORi=y TO y+ypoly 10570 disp1(i,x+xpoly)=0 10580 NEXTi 10590 x-=1 10600 xoff1=1:yoff1=1:yoff2=-1 10610ENDIF 10620IF x1=1 AND x+xpoly<grx THEN 10630 FORi=x+xpoly TO x STEP-1 10640 FORj=y TO y+ypoly 10650 disp1(j,i+1)=disp1(j,i) 10660 NEXTj 10670 NEXTi 10680 FORi=y TO y+ypoly 10690 disp1(i,x)=0 10700 NEXTi 10710 x+=1 10720 xoff2=-1:yoff1=1:yoff2=-1 10730ENDIF 10740IF xoff1+xoff2+yoff1+yoff2=0 ENDPROC 10750FORi=y+yoff1 TO y+ypoly+1+yoff2 10760 FORj=x+xoff1 TO x+xpoly+1+xoff2 10770 col=disp1(i,j) 10780 IF col<>0 THEN 10790 PROCButton(500+40*j,860-gap*i,0,0,col(col),gap) 10800 ELSE 10810 col=disp2(i,j) 10820 IF col<>0 THEN 10830 PROCButton(500+40*j,860-gap*i,1,2,disp3(i,j),gap) 10840 ELSE 10850 col=disp(i,j) 10860 IF col<>0 THEN 10870 PROCButton(500+40*j,860-gap*i,1,2,30,gap) 10880 ELSEIF disp2(i,j)=0 10890 PROCButton(500+40*j,860-gap*i,2,1,4,gap) 10900 ENDIF 10910 ENDIF 10920 ENDIF 10930 NEXTj 10940NEXTi 10950ENDPROC 10960: 10970: 10980DEFPROCFix 10990PROCPolySize(p,v) 11000FORi=x TO x+xpoly 11010 FORj=y TO y+ypoly 11020 IF disp1(j,i)>0 AND disp(j,i)=0 PROCError(7):ch=0:ENDPROC 11030 IF disp1(j,i)>0 AND disp2(j,i)>0 PROCError(8):ch=0:ENDPROC 11040 NEXTj 11050NEXTi 11060FORi=x TO x+xpoly 11070 FORj=y TO y+ypoly 11080 IF disp1(j,i)>0 THEN 11090 disp2(j,i)=p 11100 disp3(j,i)=col(p):disp4(j,i)=pcnt 11110 PROCButton(500+40*i,860-gap*j,1,2,col(p),gap) 11120 ENDIF 11130 disp1(j,i)=0 11140 NEXTj 11150NEXTi 11160dflag=FALSE:pcnt+=1 11170poly$=poly$+CHR$(64+p) 11180ENDPROC 11190: 11200: 11210DEFPROCRemove 11220IF poly$="" AND NOT dflag ENDPROC 11230LOCAL tf 11240tf=TRUE 11250IF dflag AND an<>0 THEN 11260 dflag=FALSE 11270 disp1()=0 11280 PROCUpdatePic 11290 tf=FALSE 11300 prem=p 11310ENDIF 11320LOCAL x,y,p,v 11330WHILE tf 11340 MOUSE RECTANGLE 540,860-40*gry,40*grx,40*gry 11350 REPEAT MOUSE msx,msy,msstatus:UNTILmsstatus=0 11360 REPEAT 11370 MOUSEmsx,msy,msstatus 11380 UNTIL msstatus<>0 11390 xp=INT((msx-540)/40)+1 11400 yp=INT((860-msy)/40)+1 11410 prem=disp2(yp,xp) 11420 IF prem=0 AND disp1(yp,xp)<>0 PROCError(9):ENDPROC 11430 IF prem<>0 AND disp1(yp,xp)<>0 PROCError(9):ENDPROC 11440 IF prem=0 PROCError(10):ENDPROC 11450 ppos=INSTR(poly$,CHR$(64+prem)) 11460 cnt=disp4(yp,xp) 11470 FORi=1TOgrx 11480 FORj=1TOgry 11490 IF disp2(j,i)=prem THEN 11500 IF an<>0 OR an=0 AND disp4(j,i)=cnt THEN 11510 disp2(j,i)=0:disp3(j,i)=0:dis=disp1(j,i) 11520 IF dis=0 PROCButton(500+40*i,860-40*j,1,2,30,gap) 11530 IF dis<>0 PROCButton(500+40*i,860-40*j,0,0,col(dis),gap) 11540 ENDIF 11550 ENDIF 11560 NEXTj 11570 NEXTi 11580 poly$=LEFT$(poly$,ppos-1)+RIGHT$(poly$,LEN(poly$)-ppos) 11590 tf=FALSE 11600ENDWHILE 11610IF an<>0 THEN 11620 x=40:y=860:gap=32 11630 FORj=1TO12 11640 p=an_p(an,j) 11650 v=an_v(an,j) 11660 PROCPolySize(p,v) 11670 IF j=7 x=40+gap*6:y=860 11680 IF p=prem PROCDrawPoly(p,v,x,y,0,0,col(p),10) 11690 y=y-(ypoly*gap)-gap 11700 NEXTj 11710 gap=40 11720ENDIF 11730ENDPROC 11740: 11750: 11760DEFPROCHelp 11770LOCAL i,j 11780FORi=1TO an_grx(an) 11790 FORj=1TO an_gry(an) 11800 IF disp2(j,i)>0 AND disp2(j,i)<>disp(j,i) PROCHelp1(disp2(j,i),j,i) 11810 NEXTj 11820NEXTi 11830ENDPROC 11840: 11850: 11860DEFPROCHelp1(prem,yp,xp) 11870LOCAL i,j,x,y,p,v 11880ppos=INSTR(poly$,CHR$(64+prem)) 11890cnt=disp4(yp,xp) 11900FORi=1TOgrx 11910 FORj=1TOgry 11920 IF disp2(j,i)=prem THEN 11930 IF an<>0 OR an=0 AND disp4(j,i)=cnt THEN 11940 disp2(j,i)=0:disp3(j,i)=0:dis=disp1(j,i) 11950 IF dis=0 PROCButton(500+40*i,860-40*j,1,2,30,gap) 11960 IF dis<>0 PROCButton(500+40*i,860-40*j,0,0,col(dis),gap) 11970 ENDIF 11980 ENDIF 11990 NEXTj 12000NEXTi 12010poly$=LEFT$(poly$,ppos-1)+RIGHT$(poly$,LEN(poly$)-ppos) 12020IF an<>0 THEN 12030 x=40:y=860:gap=32 12040 FORj=1TO12 12050 p=an_p(an,j) 12060 v=an_v(an,j) 12070 PROCPolySize(p,v) 12080 IF j=7 x=40+gap*6:y=860 12090 IF p=prem PROCDrawPoly(p,v,x,y,0,0,col(p),10) 12100 y=y-(ypoly*gap)-gap 12110 NEXTj 12120 gap=40 12130ENDIF 12140ENDPROC 12150: 12160: 12170DEFPROCMenuChoice(menu, RETURN choice) 12180menset$(10,7)="":menset$(10,10)="" 12190IF menset$(1,3)="N" menset$(10,7)="N" 12200IF menset$(1,4)="N" menset$(10,10)="N" 12210blx=menext(menu,1):bly=menext(menu,2) 12220xext=menext(menu,3):yext=menext(menu,4) 12230IF menu<>6 AND menu<>7 MOUSE RECTANGLE blx,bly,xext,yext 12240MOUSE ON 1 12250choice=0 12260REPEAT 12270 IF menu<>6 AND menu<>7 THEN 12280 REPEAT MOUSE msx,msy,msstatus:UNTILmsstatus=0 12290 REPEAT 12300 MOUSEmsx,msy,msstatus 12310 IF INKEY(-2) AND INKEY(-82) AND menu=10 PROCSavePic 12320 IF INKEY(-2) AND INKEY(-85) AND menu=10 AND menset$(1,2)<>"N" AND an>0 AND an<14 PROCHelp:PROCPolySize(p,v) 12330 UNTIL msstatus<>0 12340 ENDIF 12350 item=10 12360 REPEAT 12370 mx=menux(menu,item)-4 12380 my=menuy(menu,item)-32 12390 mlen=LEN(menu$(menu,item))*32+8 12400 IF msx>mx AND msx<mx+mlen AND msy>my AND msy<my+44 AND menset$(menu,item)<>"N" THEN 12410 choice=item 12420 IF choice<>10 THEN 12430 GCOL 3,13:RECTANGLE FILL mx,my,mlen,40 12440 time=TIME:REPEAT UNTIL TIME-time>25 12450 GCOL 3,13:RECTANGLE FILL mx,my,mlen,40 12460 ENDIF 12470 ENDIF 12480 item-=1 12490 UNTIL item=0 12500 IF menu=6 OR menu=7 ENDPROC 12510UNTIL choice<>0 12520ENDPROC 12530: 12540: 12550DEFPROCSavePic 12560sp=TRUE 12570IF dflag sp=FALSE:PROCUpdatePic:sp=TRUE 12580IF NOT FNYesNo("Save Picture?") THEN 12590 *FX15,0 12600 msstatus=0 12610 MOUSE RECTANGLE 480,100,760,160 12620 IF dflag PROCUpdatePic 12630 ENDPROC 12640ENDIF 12650GCOL 63 TINT 192 12660MOVE 200,40 12670ok$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_#/-'" 12680PRINT"Enter Filename:" 12690PROCInput(712,40,10,ok$,file$) 12700GCOL back-128 TINT 64 12710RECTANGLEFILL 180,0,1000,50 12720IF file$<>"" THEN 12730 VDU 24,480;800-an_gry(an)*40;580+an_grx(an)*40;900; 12740 *DIR <POLY$DIR> 12750 *UP 1 12760 $name%="" 12770 FOR i%=0 TO LEN(file$) 12780 $(name%+i%)=MID$(file$,i%+1,1) 12790 NEXTi% 12800 OSCLI ("SCREENSAVE "+$name%) 12810 VDU 26 12820ENDIF 12830IF dflag PROCUpdatePic 12840MOUSE RECTANGLE 480,100,760,160 12850ENDPROC 12860: 12870: 12880DEFPROCLoadAnimal(animal) 12890disp()=0:disp1()=0:disp2()=0 12900FORi=1TO12 12910 p=an_p(animal,i) 12920 v=an_v(animal,i) 12930 x_min=an_x(animal,i) 12940 y_min=an_y(animal,i) 12950 FORj=1TO5 12960 dec=pent(p,v,j) 12970 PROCDecToBin(dec) 12980 FORk=1TO5 12990 IF MID$(bin$,k,1)="1" THEN 13000 disp(y_min+j-1,x_min+k-1)=p 13010 ENDIF 13020 NEXTk 13030 NEXTj 13040NEXTi 13050ENDPROC 13060: 13070: 13080DEFPROCButton(x,y,col1,col2,col3,gap) 13090rect=8 13100IF gap=20 rect=4 13110GCOL0,col1 13120IF col1=1 GCOL 0,10 TINT 0 13130IF col1=2 GCOL 0,10 TINT 192 13140MOVE x,y:MOVE x,y+gap-8:PLOT &55,x+gap-8,y 13150GCOL0,col2 13160IF col2=1 GCOL 0,10 TINT 0 13170IF col2=2 GCOL 0,10 TINT 192 13180PLOT &55,x+gap-8,y+gap-8 13190GCOL0,col3 TINT 128 13200RECTANGLE FILL x+rect,y+rect,(gap-8)/2,(gap-8)/2 13210ENDPROC 13220: 13230: 13240DEFPROCButtoff(x%,y%,col,gap%) 13250GCOL col TINT 64 13260RECTANGLE FILL x%,y%,gap%-8,gap%-8 13270GCOL col TINT 192 13280ENDPROC 13290: 13300: 13310DEFPROCError(err) 13320LOCAL i,j 13330VDU 4 13340COLOUR fore:COLOUR back TINT 64 13350error$=err$(err) 13360i=1 13370PRINT CHR$(7);CHR$(7) 13380IF LEN(error$) MOD 2=1 error$+=" " 13390FOR i=1TOLEN(error$)/2 13400 PRINTTAB(20-i,30); 13410 time=TIME:REPEAT UNTIL TIME-time>5 13420 PRINT LEFT$(error$,i);RIGHT$(error$,i); 13430NEXTi 13440IF err=3+erroff THEN 13450 time=TIME 13460 REPEAT 13470 PROCFlash(1,2,8) 13480 PROCFlash(1,2,34) 13490 UNTIL TIME-time>250 13500 PROCFlash(1,2,8) 13510ENDIF 13520time=TIME:REPEAT UNTIL TIME-time>200 13530FOR i=LEN(error$)/2TO1STEP-1 13540 PRINTTAB(19-i,30);" "; 13550 PRINTLEFT$(error$,i);RIGHT$(error$,i);" "; 13560 time=TIME:REPEAT UNTIL TIME-time>5 13570NEXTi 13580PRINTTAB(18,30)" "; 13590VDU 5 13600ENDPROC 13610: 13620: 13630DEFPROCFlash(c1,c2,c3) 13640MOVE 100,100 13650xadjust=0:yadjust=0:mod=4 13660IF sq=6 xadjust=-60:yadjust=200:mod=7 13670v=VAL(MID$(var$,INSTR(poly$,CHR$(64+p)),1)) 13680pp=INSTR(poly$,CHR$(64+p)) 13690xpos=100+((pp-1) MOD mod)*(sq*gap+20)+xadjust 13700ypos=((sq*gap+20)*(sq-1)-20)-((pp-1) DIV mod)*(sq*gap+20)+yadjust 13710PROCPolySize(p,v) 13720PROCDrawPoly(p,v,xpos+gap*xoff,ypos-gap*yoff,c1,c2,c3,60) 13730ENDPROC 13740: 13750: 13760DEFPROCErrorTrap 13770VDU 4 13780PRINT"Diagnostics:" 13790PRINT"Error number ";ERR 13800REPORT 13810PRINT" at line ";ERL 13820STOP 13830ENDPROC 13840: 13850: 13860REM *** Colours for Pentominoes *** 13870: 13880DATA 3,11,63,48,19,60,15,24,17,28,55,50 13890: 13900: 13910REM *********** Data for Pentomino Puzzles *********** 13920: 13930REM *** Tessellation Data *** 13940: 13950DATA "Tessellations",16,13 13960DATA 0,0,1,3,0,0,2,5,0,0,3,1,0,0,4,1,0,0,5,1,0,0,6,1 13970DATA 0,0,7,1,0,0,8,1,0,0,9,1,0,0,10,1,0,0,11,1,0,0,12,1 13980: 13990REM *** Pentanimals *** 14000: 14010DATA "Dog",10,12 14020DATA 1,10,1,1,2,2,6,1,4,1,7,1,4,4,5,4,6,3,2,2,6,4,8,1 14030DATA 6,6,12,2,6,8,10,2,7,8,4,3,8,5,9,4,9,3,3,3,10,9,11,4 14040DATA "Penguin",9,12 14050DATA 1,4,11,1,1,6,5,3,4,3,6,1,4,5,4,4,5,5,3,3,5,8,9,7 14060DATA 6,1,12,2,6,3,8,3,7,7,1,1,8,3,10,7,9,5,2,3,10,3,7,7 14070DATA "Elephant",11,9 14080DATA 1,1,11,1,5,4,1,1,3,4,2,8,3,7,7,8,3,9,12,1,4,1,4,2 14090DATA 4,4,10,4,1,2,6,1,5,7,8,3,6,5,9,8,6,8,5,6,6,10,3,3 14100DATA "Pig",12,7 14110DATA 1,2,9,1,1,6,1,3,1,11,3,3,2,4,11,1,2,5,6,1,2,7,2,5 14120DATA 2,9,10,8,3,1,12,4,4,6,8,1,4,8,7,8,5,4,4,2,5,10,5,2 14130DATA "Cockerel",13,13 14140DATA 1,3,12,1,2,1,6,1,3,10,10,5,3,12,11,4,4,3,1,1,5,4,5,5 14150DATA 5,7,4,2,6,7,8,1,6,9,9,8,7,4,7,1,9,5,2,5,10,6,3,3 14160DATA "Kangeroo",15,13 14170DATA 1,2,5,5,3,3,9,6,5,1,8,3,7,3,11,5,8,3,10,5,9,5,6,1 14180DATA 10,4,2,2,10,9,3,1,11,1,4,3,11,7,7,7,13,11,1,3,8,6,12,4 14190DATA "Camel",13,12 14200DATA 1,1,2,7,3,3,11,1,4,4,12,4,4,9,6,1,6,4,10,4,6,7,9,3 14210DATA 6,11,7,4,7,7,4,1,7,8,8,4,7,11,5,3,8,6,1,1,9,12,3,4 14220DATA "Dove",16,9 14230DATA 1,2,4,4,2,1,12,4,3,5,1,3,3,10,2,5,3,13,9,1,4,3,6,1 14240DATA 4,5,11,4,4,7,3,5,4,10,8,3,5,7,7,3,7,5,5,2,7,7,10,2 14250: 14260REM *** Puzzle Shape Data for Pentominoes *** 14270: 14280DATA "Pyramid",15,8 14290DATA 1,8,9,6,2,6,6,1,3,9,10,3,4,4,7,3,5,7,3,1,5,10,8,1 14300DATA 6,2,2,6,6,4,4,4,6,9,11,1,6,11,5,1,6,13,12,1,8,1,1,3 14310DATA "Diamond",11,10 14320DATA 1,5,10,5,3,3,2,6,3,6,5,2,4,8,7,1,5,1,6,1,5,3,11,3 14330DATA 5,5,3,4,6,3,4,3,6,7,1,3,7,6,8,1,7,8,12,2,9,4,9,2 14340DATA "Cross",11,11 14350DATA 1,5,7,5,1,7,3,1,3,4,10,8,5,1,5,3,5,2,9,3,5,6,2,5 14360DATA 5,8,8,3,5,9,4,3,7,2,1,3,7,6,6,1,8,4,12,4,10,5,11,6 14370DATA "'Circle'",9,8 14380DATA 1,1,12,3,1,4,7,6,1,5,9,3,2,4,4,3,3,1,8,3,3,6,10,3 14390DATA 3,8,11,3,5,1,6,1,5,3,5,2,6,5,1,3,7,3,3,6,7,5,2,8 14400DATA "Bee-Hive",9,10 14410DATA 1,1,3,2,1,2,7,3,2,4,6,1,3,1,5,1,3,3,9,6,4,6,11,1 14420DATA 5,5,1,1,5,7,10,4,6,2,12,4,7,6,8,2,7,8,2,4,8,6,4,1 14430: 14440REM *** Rectangle Data *** 14450: 14460DATA "6x10",10,6 14470DATA 1,1,2,2,1,2,9,3,1,5,1,3,1,8,5,5,2,2,6,1,2,6,8,2 14480DATA 3,4,12,2,3,8,11,3,4,1,10,5,4,6,7,6,4,8,4,3,5,2,3,8 14490DATA "5x12",12,5 14500DATA 1,1,9,6,1,2,5,2,1,4,10,1,1,6,8,4,1,7,1,3,1,9,3,8 14510DATA 3,1,4,1,3,3,6,1,3,5,12,3,3,9,2,8,4,7,7,3,4,10,11,6 14520DATA "4x15",15,4 14530DATA 1,1,1,3,1,5,6,1,1,7,8,2,1,9,10,6,1,10,9,3,1,13,4,4 14540DATA 2,1,11,5,2,4,12,1,2,13,5,1,3,1,2,6,3,7,3,6,3,11,7,2 14550: 14560: 14570REM *** Error Messages *** 14580: 14590DATA "A pentomino must have 5 squares" 14600DATA "Squares must be touching" 14610DATA "This pentomino already exists" 14620DATA "A hexomino must have 6 squares" 14630DATA "Squares must be touching" 14640DATA "This hexomino already exists" 14650DATA "The pentomino must lie on the shape" 14660DATA "Pentominoes must not overlap" 14670DATA "This pentomino has not been FIXed" 14680DATA "Click on a pentomino to remove it" 14690: 14700: 14710REM *** Menu Data *** 14720: 14730DATA 480,100,760,160 14740DATA "Access Code",464,840,"Help",576,750,"Flip",576,660," ",560,570 14750DATA "z",1,1 14760: 14770DATA 330,60,620,800 14780DATA "Tutorial",512,840,"Pentomino Designer",352,750 14790DATA "Hexomino Designer",368,660,"Rectangles",480,570 14800DATA "PentAnimals",464,480,"PentoShapes",464,390 14810DATA "Tessellations",432,300,"Teacher Control",400,210 14820DATA "QUIT",576,120,"z",1,1 14830: 14840DATA 480,100,320,800 14850DATA "Dog",592,840,"Penguin",528,750,"Elephant",512,660 14860DATA "Pig",592,570,"Cockerel",512,480,"Kangeroo",512,390 14870DATA "Camel",560,300,"Dove",576,210 14880DATA "Main Menu",496,120,"z",1,1 14890: 14900DATA 400,440,480,440 14910DATA "6x10 Rectangle",416,840,"5x12 Rectangle",416,750 14920DATA "4x15 Rectangle",416,660 14930DATA "Main Menu",496,570,"z",1,1 14940: 14950DATA 480,350,320,530 14960DATA "Pyramid",528,840,"Diamond",528,750,"Cross",560,660 14970DATA "'Circle'",512,570,"Bee-Hive",512,480 14980DATA "Main Menu",496,390,"z",1,1 14990: 15000DATA 999,999,999,999 15010DATA "TRY",1048,650,"QUIT",1032,560,"z",1,1 15020: 15030DATA 999,999,999,999 15040DATA "TRY",1080,600,"QUIT",1064,510,"z",1,1 15050: 15060DATA 790,10,140,50 15070DATA "y",792,50,"n",888,50,"z",1,1 15080: 15090DATA 510,10,260,50 15100DATA "CONTINUE",514,50,"z",1,1 15110: 15120DATA 480,100,760,160 15130DATA "�",700,200,"�",780,200,"�",740,160,"�",740,240 15140DATA "Fix",908,240,"Remove",860,160,"Flip",1100,240,"Quit",1100,160 15150DATA "�Pick",480,240," ",480,160,"z",1,1 15160: 15170: 15180REM *** Data for the Tutorial *** 15190: 15200DATA "63What is a POLYOMINO ?" 15210DATA "!" 15220DATA "60It isn't a word we use every day, but we" 15230DATA "60all have heard of one sort of polyomino." 15240DATA "!" 15250DATA "12It's the simplist kind, called a DOMINO." 15260DATA "!" 15270DATA "60No doubt you've all played dominoes at" 15280DATA "60some time or another." 15290DATA "#","@" 15300DATA "12A domino is a rectangle split into two" 15310DATA "12squares, joined at one of their edges." 15320DATA "#","$" 15330DATA "60Therefore, a TRIOMINO would be made of 3" 15340DATA "60squares joined at their edges, as shown" 15350DATA "60below:- There are 2 TRIOMINOES" 15360DATA "#","%","#","!","!","!" 15370DATA "12A QUADROMINO is made of 4 squares joined" 15380DATA "12at their edges. There are 5 in all...." 15390DATA "#","^","#","$" 15400DATA "60If you take 5 squares and join them edge" 15410DATA "60to edge you form a PENTOMINO.","!" 15420DATA "12Similarly, if you use 6 squares you form" 15430DATA "12a HEXOMINO.","!" 15440DATA "60There are 12 Pentominoes and some 35" 15450DATA "60Hexominoes!!","!","#" 15460DATA "12This program allows you to design both" 15470DATA "12the pentominoes and hexominoes." 15480DATA "!" 15490DATA "60There are also many activities making" 15500DATA "60use of the 12 pentominoes.","!" 15510DATA "63ENJOY ENJOY ENJOY ENJOY ENJOY ENJOY" 15520DATA "zzz" 15530: 15540: 15550REM *** Data for Pentomino Rotations/Flips *** 15560: 15570DATA "13","15472638","15482736" 15580DATA "1234","1325","1","15482736" 15590DATA "1423","16472835","15482736" 15600DATA "1536","1243"
� ><POLY$DIR>.!RunImage � � �ErrorTrap *KEY1 EDIT|M (*<POLY$DIR>.roundset 2B� chr(8,8),val(8),pent(13,8,5),pentvar(12),rot$(12),hexvar(35) <D� hex(36,8,6),disp(25,25),disp1(25,25),disp2(25,25),disp3(25,25) FM� disp4(25,25),an_x(20,12),an_y(20,12),an_p(20,12),an_v(20,12),line$(100) PI� an_n$(20),an_grx(20),an_gry(20),col(12),colp(12),poly(6,6),err$(10) ZB� ypos(24),menext(12,4),menu$(12,12),menux(12,12),menuy(12,12) d� menset$(12,12),name% 16 n*fx200,1 x�Screen � time=� �� 23;8202;0;0;0; � �Setup �� � �-time>300 �� 13 �� 23;8202;0;0;0; �*<POLY$DIR>.!Palette � �MainMenu �ȗ � �� 4 �*<POLY$DIR>.Default �*<POLY$DIR>.!PalDef �� 3 �:�17,14)"B Y E" � : ": ,��MainMenu 6� back Ȝ 64 @� J�Title("Main Menu") T�MenuSet(2) ^tf=� h� r �MenuChoice(2,ch) | Ȏ ch � � � 1: �Tutorial:�MainMenu �+ � 2: �Pentomino(1000,700):�MainMenu �* � 3: �Hexomino(1020,660):�MainMenu �! � 4: �Rectangle:�MainMenu �" � 5: �AnimalMenu:�MainMenu �# � 6: �PentoShapes:�MainMenu �" � 7: �Tessellate:�MainMenu � � 8: �Access:�MainMenu �+ � 9: � �YesNo("Are you sure?") tf=� � � �� tf �� �: : ��Access � menset$(1,1)="Y" � & �Title("Teacher Control") 0 � 63 : � 200,800:� "Access Code:" D p$="" N *fx 15,0 X � b a$=�(5) l p$=p$+a$ v( � a$<>"" � 600+�(p$)*32,800:�"-" �% � a$=�(13) � �(p$)>8 � p$=pass$ � � p$<>pass$ � �� ��TeacherControl(1) �� �: �: ���SetAccess �Hok$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" �� 63 �(� 200,400:�"Old Access Code: ";pass$ �"� 200,300:�"New Access Code: " ��Input(744,300,8,ok$,p$) � back-128 Ȝ 64 ȓȐ 20,10,1200,50 � p$<>"" � ! � �YesNo("Set Password?") � * pass$=p$ 4# pw=�("<POLY$DIR>.Password") > � i=1 � �(p$) H �#pw,�(�(�p$,i,1))-43) R �i \ �#pw,"]" f �#pw p � z� �� back-128 Ȝ 64 �ȓȐ 20,10,1200,400 �� fore Ȝ 192 �0� 150,40:� "'X'-Exit 'S'-Save '� �'-Menus" �ȗ ȓ 1016,48,172,800 �� �: �: �!��Input(x%,y%,l%,ok$,� word$) �*fx15,0 �word$="" �ȗ � �� c$=�(5) 3 � 8 Ȝ 192:� x%,y%-36,x%+32,y%-36:� 63 Ȝ 192 , � c$<>"" � �ok$,c$)<>0 � �(word$)<l% � $; � back-128 Ȝ 64:� x%,y%-36,x%+32,y%-36:� 63 Ȝ 192 . � x%,y% 8 � c$ B word$=word$+c$ L x%+=32 V � ` � �(-113) word$="":ȗ �:� j � �(-90) � �(word$)>0 � t � back-128 Ȝ 64 ~ x%-=32 � ȓȐ x%,y%,64,-40 � word$=�word$) � *fx15,0 � � 63 Ȝ 192 � � �� c$=�(13) �ȗ � �� �: �: ���TeacherControl(menu%) �� on$,off$ �Title("Teacher Control") � fore Ȝ 192 � 1000,900:� "ON OFF" 0� 150,40:� "'X'-Exit 'S'-Save '� �'-Menus" (�MenuSet(menu%) 2i=1 <� F � fore Ȝ 192 P! ȓ 1016,848-(i-1)*90,40,-40 Z! ȓ 1148,848-(i-1)*90,40,-40 d i+=1 n� menu$(menu%,i)="z" xi=1 �� �- � menset$(menu%,i)="Y":on$="X":off$=" " �- � menset$(menu%,i)="N":on$=" ":off$="X" �- � menset$(menu%,i)="F":on$="X":off$="X" � � 1152,840-(i-1)*90:� off$ � � 1020,840-(i-1)*90:� on$ � i+=1 �� menset$(menu%,i)="E" �ȗ ȓ 1016,48,172,800 � ȗ � 1 �� � � � � ȗmsx,msy,msstatus / � �(-2) � �(-56) � menu%=1 �SetAccess � �(-67) � " � �(-122) � , menu%+=1 6 � menu%>5 menu%=1 @" �TeacherControl(menu%) J � saveflag � T � ^ � �(-26) � h menu%-=1 r � menu%<1 menu%=5 |" �TeacherControl(menu%) � � � � �(-82) � �! �SaveConfig(saveflag) � � saveflag � � � back-128 Ȝ 64 � ȓȐ 20,10,1200,50 � � fore Ȝ 192 �8 � 150,40:� "'X'-Exit 'S'-Save '� �'-Menus" � � � � msstatus<>0 � item=1:choice=0 � boxx=1016:boxy=848 � � G � msx>boxx � msx<boxx+40 � msy<boxy � msy>boxy-40 choice=item M � msx>boxx+132 � msx<boxx+172 � msy<boxy � msy>boxy-40 choice=-item item+=1 & boxy=boxy-90 0 � item=10 � choice<>0 : � choice<>0 D% onoff$=menset$(menu%,�(choice)) N � onoff$="Y" � choice<0 � X � back-128 Ȝ 64 b" ȓȐ boxx+4,boxy+86,32,-32 l � fore Ȝ 192 v � boxx+136,boxy+82 � � "X" �$ menset$(menu%,�(choice))="N" � � � � onoff$="N" � choice>0 � � � back-128 Ȝ 64 �$ ȓȐ boxx+136,boxy+86,32,-32 � � fore Ȝ 192 � � boxx+4,boxy+82 � � "X" �$ menset$(menu%,�(choice))="Y" � � �� � �� : : ��SaveConfig(� saveflag) saveflag=� *� back-128 Ȝ 64 4ȓȐ 20,10,1200,50 >� �YesNo("Save Options?") � H" cf=�("<POLY$DIR>.configure") R � i=1 � 5 \ j=1 f � p �#cf,menset$(i,j) z j+=1 � � menset$(i,j-1)="E" � �i � �#cf � saveflag=� �� �ȗ ȓ 1016,48,172,800 �� �: �: ���Screen � *SCREENLOAD <POLY$DIR>.Title �� �: : ��AnimalMenu �Title("PentAnimals") $�MenuSet(3) .tf=� 8� B �MenuChoice(3,ch) L Ȏ ch � V3 � 1,2,3,4,5,6,7,8: �Puzzles(ch):�AnimalMenu ` � 9: tf=� j � t� tf ~� �: �: ���PentoShapes ��Title("PentoShapes") ��MenuSet(5) �tf=� �� � �MenuChoice(5,ch) � Ȏ ch � �0 � 1,2,3,4,5: �Puzzles(8+ch):�PentoShapes � � 6: tf=� � � � tf � : : (��Pentomino(xmin,ymin) 2sq=5 < gap=40 F �Title("Pentomino Designer") Ppoly$="":var$="" Z�GridPlot(88,904,4,3) d�MenuSet(6) n"�Grid(1000,900,sq,sq,2,1,4,40) x� � �Clear(xmin,ymin) � � �% �CreatePoly(xmin,ymin,sq,gap) �" � �(poly$)=12 �WellDone2:� � � ch=2 �� �YesNo("Are you sure?") �chr()=0 �� �: �: ���Hexomino(xmin,ymin) �sq=6 � gap=20 �Title("Hexomino Designer") poly$="":var$="" �GridPlot(28,908,7,5) "�MenuSet(7) ,"�Grid(1020,900,sq,sq,2,1,4,40) 6� @ �Clear(xmin,ymin) J � T% �CreatePoly(xmin,ymin,sq,gap) ^" � �(poly$)=35 �WellDone2:� h � ch=2 r� �YesNo("Are you sure?") |chr()=0 �� �: �: �!��GridPlot(x%,y%,xext%,yext%) � � i,j �y%-=sq*gap+20 � yo%=y% �� i=1 � xext% � � j=1 � yext% �0 ș "OS_SpriteOp",256+34,S%,�(sq),x%,y%,0 � y%-=sq*gap+20 � �j � y%=yo% x%+=sq*gap+20 �i � &: 0: :��Puzzles(an) D)erroff=0:sq=5:gap=40:poly$="":dflag=� N�Pentanimals(an) X�MenuSet(10) b� l tf1=� v+ � �(poly$)=12 � an<>0 �WellDone:tf1=� �; � � dflag � an=0 � �(poly$)<>0 dflag=�:�DispPent(p,v) �" � � tf1 � �MenuChoice(10,ch) � Ȏ ch � �" � 1: � dflag �Move(-1,0) �! � 2: � dflag �Move(1,0) �! � 3: � dflag �Move(0,1) �" � 4: � dflag �Move(0,-1) � � 5: � dflag �Fix � � 6: �Remove �# � 7: � dflag � p<>6 �Flip �. � 8: � �YesNo("Are you sure?") tf1=� �7 � 9: � � dflag � �(poly$)<>12 �SelectPent(an) �# � 10: � dflag �PolyColour � � � tf1 � i=1 � 12 * col(i)=colp(i) 4� i >� H: R: \��WellDone f �(7); p� fore Ȝ 192 z � 100,700 ��"Great Work" � � 116,650 ��"Well Done" ��SavePic � �Continue �� �: �: ���WellDone2 �� fore Ȝ 192 � � 272,160 � �(7); ��"Great Work - Well Done!" �Continue � : $: .��Tutorial 8� i,j,k,pr$,pr1$ B �Title("Polyomino Tutorial") L� 4 V� back Ȝ 64 `i=1:k=5 j� t pr$=line$(i) ~ � �(pr$)<>1 � �$ pr$=�line$(i),�(line$(i))-2) � col=�(�line$(i),2)) � ȕ �(pr$)<>40 � pr$=pr$+" " � � � � col � � j=1 � 40 � pr1$=�pr$,j,1) � �j-1,k)pr1$; � � �(-113) � � time=�:� � �-time>4 � �j � � pr$="!" k+=1 � pr$="@" �Dom:k+=4 � pr$="#" �Continue:�4 ( � pr$="$" � 2 �0,back-128 Ȝ 64 < ȓ Ȑ 0,0,1280,860 F k=5 P � Z � pr$="%" �Tri d � pr$="^" �Tetra n i+=1:k+=1 x� line$(i)="zzz" � �Continue �� �: �: ���Continue ��MenuSet(9) ��MenuChoice(9,ch) ��0,back-128 Ȝ 64 �ȓ Ȑ 500,6,300,60 �� �: �: � ��Tri �0,48 ȓȐ 100,600,300,100 ȓȐ 700,600,200,100 "ȓȐ 700,500,100,100 , �0,60 6ȓ 100,600,100,100 @ȓ 200,600,100,100 Jȓ 300,600,100,100 Tȓ 700,600,100,100 ^ȓ 800,600,100,100 hȓ 700,500,100,100 r� |: �: ���Tetra �� i � �0,48 �ȓȐ 200,150,50,200 �ȓȐ 350,200,100,100 �*ȓȐ 550,175,50,150:ȓȐ 600,275,50,50 �*ȓȐ 750,175,50,150:ȓȐ 800,225,50,50 �,ȓȐ 950,250,100,50:ȓȐ 1000,200,100,50 � � 0,60 � � i=1 � 4 � ȓ 200,100+i*50,50,50 �� i � i=1 � 2 ȓ 300+i*50,200,50,50 ȓ 300+i*50,250,50,50 & ȓ 900+i*50,250,50,50 0 ȓ 950+i*50,200,50,50 :� i D � i=1 � 3 N ȓ 550,125+i*50,50,50 X ȓ 750,125+i*50,50,50 b� i lȓ 600,275,50,50 vȓ 800,225,50,50 �� �: �: � ��Dom ��0,0 �ȓȐ 490,317,300,150 � �0,63 �ȓ 500,327,280,130 �ȓ 500,327,140,130 �ȏȐ 570,397,10 �ȏȐ 675,425,10 �ȏȐ 745,360,12 �ȏȐ 745,425,12 ȏȐ 675,360,10 � : : *��Rectangle 4�Title("Rectangle Menu") >�MenuSet(4) H� R tf1=� \ �MenuChoice(4,ch) f Ȏ ch � p+ � 1,2,3: �Puzzles(13+ch):�Rectangle z � 4: tf1=� � � � � tf1 �� �: �: ���MenuSet(menu) �� i ��5 �i=1 �� � rect=�(menu$(menu,i))*32+8 �' mx=menux(menu,i):my=menuy(menu,i) � � 10 Ȝ 0 # ȓ Ȑ mx-12,my+16,rect+16,-56 � 10 Ȝ 192 ȓ Ȑ mx-4,my+8,rect+8,-48 $0 � mx-12,my-40:� mx-4,my-40:�&55,mx-4,my-32 .< � mx+rect-4,my+8:� mx+rect+4,my+8:�&55,mx+rect+4,my+16 8 � 10 Ȝ 64 B& � menset$(menu,i)="N" � 20 Ȝ 64 L ȓ Ȑ mx-4,my-32,rect,40 V � fore Ȝ 192 ` � mx,my j � menset$(menu,i)="N" � 20 t � menu$(menu,i) ~ i+=1 �� menu$(menu,i)="z" �� menu=10 � � � i=0 � 5 � � 0,col(i+1) �" ȓȐ 476+(i*28),168,28,-18 � � 0,col(i+7) �" ȓȐ 476+(i*28),146,28,-18 � � i �� �� menu=1 � � � i=0 � 5 � � 0,col(i+1) " ȓȐ 556+(i*28),576,28,-18 � 0,col(i+7) " ȓȐ 556+(i*28),556,28,-18 � i (� 2� <: F: P��Title(title$) Zlen=�(title$) dx=640-32*len/2 n� back Ȝ 64:� x�5 �� 0:� back �� x-8,950:� title$ �� fore Ȝ 192 �� x,958:� title$ �� �: �: �ݤYesNo(ques$) �� �(7);�(7) �� 63 Ȝ 192 �� 5 �� 332,50 �� ques$ �MenuSet(8) �MenuChoice(8,ch1) � 0,back-128 Ȝ 64 "%ȓ Ȑ 330,10,660,60:� fore Ȝ 192 ,� ch1=2:=� 6:=� @: J: T*��Grid(grx%,gry%,sqx,sqy,c1,c2,c3,gap) ^� i%,j% h �i%=1�sqx r �j%=1�sqy | � c1=c2 � c2=c3 � �6 �Buttoff(grx%+(i%-1)*gap,gry%-j%*gap,c1,gap) � � �; �Button(grx%+(i%-1)*gap,gry%-j%*gap,c1,c2,c3,gap) � � � � �� �� �: �: �"��CreatePoly(xmin,ymin,sq,gap) �sqcnt=0 � ȗ � 1 �+ȗ ȓ xmin,ymin-190,sq*40-8,sq*40-8+190 � ' � ȗ msx,msy,msstatus:�msstatus=0 � & ȗmsx,msy,msstatus 0 � msstatus<>0 : � sq=5 �MenuChoice(6,ch) D � sq=6 �MenuChoice(7,ch) N � ch=1 � X tot=0 b) �i=1�8:�j=1�8:tot+=chr(i,j):�j:�i l � tot<>0 � v �Calc � � �CheckPoly � � �Clear(xmin,ymin) � �Flash(1,2,8) � � � � � �Error(err) � �Clear(xmin,ymin) � � � � � � � � �" � msy>ymin �OnOff(xmin,ymin) � � ch=2 � : : ��Clear(xmin,ymin) * �i=1�8 4 �j=1�8 >D � chr(i,j)=1 �Button(xmin+(i-1)*40,ymin+(-j+sq)*40,2,1,4,40) H chr(i,j)=0 R �j \�i f� p: z: ���OnOff(xmin,ymin) �xp=�((msx-xmin)/40)+1 �yp=sq-�((msy-ymin)/40) �� chr(xp,yp)=1 � � chr(xp,yp)=0 � sqcnt-=1 �7 �Button(xmin+(xp-1)*40,ymin+(-yp+sq)*40,2,1,4,40) �� � chr(xp,yp)=1 � sqcnt+=1 �7 �Button(xmin+(xp-1)*40,ymin+(-yp+sq)*40,1,2,8,40) �� �� : : ��Calc $�i=sq � 1 �-1 . �j=1�sq 8% � chr(j,i)=1 val(i)+=2^(sq-j) B �j L7 � sq=5 � pent(13,1,i)=val(i) � hex(36,1,i)=val(i) V�i ` �i=1�sq:�j=1�sq:val(i)=0:�:� j�ForceTopLeft(13,1) t.� sq=5 � �PolySize(13,1) � �PolySize(36,1) ~� �: �: �ݤCheckPoly �p=1:tf=0:erroff=0 �$� sq=5 � polynum=12 � polynum=35 �� sq=6 erroff=3 �� � v=1 � � � k=1:match=� � � � � sq=5 � / � pent(p,v,k)<>pent(13,1,k) match=� � 2 � sq=6 � hex(p,v,k)<>hex(36,1,k) match=� k+=1 ( � match=� � k>sq 2* � match=� � �poly$,�(p+64))=0 tf=1 <+ � tf=1 poly$+=�(p+64):var$+=�(v):=� F* � match=� � �poly$,�(p+64))>0 tf=2 P � tf=2:err=3+erroff:=� Z v+=1 d# � sq=5 polyvar=pentvar(p)*2 n" � sq=6 polyvar=hexvar(p)*2 x � v>polyvar � p+=1 �� p>polynum �err=1+erroff �� sqcnt=sq err=2+erroff �=� �: �: ���Setup �� i,j,k �6� *** Read Data for Pentominoes and Hexominoes *** �ch=�("<POLY$DIR>.polydata") � cf=�("<POLY$DIR>.configure") �pw=�("<POLY$DIR>.password") � i=1 � 12 �#ch,pentvar(i) num=pentvar(i) " � j=1 � num*2 � 2 ,% � k=1 � 5:�#ch,pent(i,j,k):�k 6' � k=1 � 5:�#ch,pent(i,j+1,k):�k @ �j J�i T� i=1 � 35 ^ �#ch,hexvar(i) h num=hexvar(i) r � j=1 � num*2 � 2 |$ � k=1 � 6:�#ch,hex(i,j,k):�k �& � k=1 � 6:�#ch,hex(i,j+1,k):�k � �j ��i ��#ch �'� *** Read Pentominoes' colours *** ��i=1�12 � � col(i) � colp(i)=col(i) ��i �� *** Read Animal Data *** ��i=0�16 � � animal$,grx,gry � an_n$(i)=animal$ an_grx(i)=grx an_gry(i)=gry �j=1�12 & �y1,x1,poly,var 0 an_x(i,j)=x1 : an_y(i,j)=y1 D an_p(i,j)=poly N an_v(i,j)=var X �j b�i l!� *** Read Error Messages *** v� i=1 � 10 � � err$(i) ��i �*� *** Read Menu Configuration Data *** �i=1 �� � j=1 � � � �#cf,m$ � menset$(i,j)=m$ � j+=1 � � m$="E" � i+=1 � � i=6 �#cf � *** Read Menu Data *** � j=1 � 10 i=1 * � m1,m2,m3,m4 4A menext(j,1)=m1:menext(j,2)=m2:menext(j,3)=m3:menext(j,4)=m4 > � H � men$,menx,meny R menu$(j,i)=men$ \' menux(j,i)=menx:menuy(j,i)=meny f i+=1 p � men$="z" z�j � � *** Read Tutorial Data *** �i=1 �� � � line$(i) � i+=1 �� line$(i-1)="zzz" �*� *** Read Pentomino Rotation Data *** �� i=1 � 12 � � rot$(i) ��i �� *** Read Password *** �� � �#pw,p$ pass$=pass$+�(�(p$)+43) � p$="]" pass$=�pass$) $�#pw ."� *** Initialise Variables *** 80pcnt=1:an=0:back=138:fore=30:saveflag=�:sp=� B� *** Load Sprites *** Ls$="<POLY$DIR>.Sprite" Vfile%=�(s$) `L%=�#file%+64 j�#file% t� S% L% ~S%!0=L% �ș "OS_SpriteOp",256+9,S% �!ș "OS_SpriteOp",256+10,S%,s$ �� �: �: ���DecToBin(dec) ��i �bin$="" � �i=8�1�-1 � bin=2^(i-1) � temp1=�(dec/bin) � � temp1=1 � bin$=bin$+"1" dec-=bin*temp1 � bin$=bin$+"0" ( � 2�i <� F: P: Z)��DrawPoly(p,v,xpos,ypos,c1,c2,c3,c4) d � i,j n� i=1 � ypoly x/ � sq=5 � dec=pent(p,v,i) � dec=hex(p,v,i) � �DecToBin(dec) � � j=1 � xpoly � a$=�bin$,j,1) � �a$="1" � c3<>c4 � �= �Button(xpos+(j-1)*gap,ypos-(i-1)*gap,c1,c2,c3,gap) � � �8 �Buttoff(xpos+(j-1)*gap,ypos-(i-1)*gap,c4,gap) � � � �j ��i �� �: �: ��ForceTopLeft(p,v) � i � sq=6 p=36 "� ,- � sq=5 dec=pent(p,v,1) � dec=hex(p,v,1) 6 � dec=0 � @ �i=2 � sq J* � sq=5 pent(p,v,i-1)=pent(p,v,i) T( � sq=6 hex(p,v,i-1)=hex(p,v,i) ^ �i h+ � sq=5 pent(p,v,5)=0 � hex(p,v,6)=0 r � |� dec<>0 �� � zero=0 � �i=1�sq � � sq=5 dec=pent(p,v,i) � � sq=6 dec=hex(p,v,i) � �DecToBin(dec) � zero+=�(�bin$,1)) � �i � � zero=0 � � �i=1�sq �* � sq=5 pent(p,v,i)=pent(p,v,i)*2 �( � sq=6 hex(p,v,i)=hex(p,v,i)*2 � �i � � zero<>0 � &: 0: :��PolySize(p,v) D� i Nyoff=0:xoff=0:margin=4 X� sq=5 margin=8 bi=1 l� v/ � sq=5 � dec=pent(p,v,i) � dec=hex(p,v,i) � i+=1 �� dec=0 � i=sq+1 �yoff=i-2 �� dec<>0 yoff=sq �� i=1 � yoff �/ � sq=5 � dec=pent(p,v,i) � dec=hex(p,v,i) � tempx=0 �# ȕ ((dec � margin) <> margin) � dec=dec>>1 � tempx+=1 � � �% � (sq-tempx)>xoff xoff=sq-tempx ��i !xpoly=xoff:ypoly=yoff !+xoff=�((sq-xoff)/2):yoff=�((sq-yoff)/2) !� ! : !*: !4��Tessellate !>�i,j !Hgap=40:sq=5 !R�Title("Tessellations") !\5disp()=30:disp1()=0:disp2()=0:disp3()=0:disp4()=0 !f �i=0 � 14 !p �j=0 � 17 !z � i=0 � i=14 disp(i,j)=0 !�" � j=0 � j=17 � disp(i,j)=0 !� �j !��i !��Puzzles(0) !�� !�: !�: !���Pentanimals(an) !� � an<>0 � !� �Title(an_n$(an)) !� �LoadAnimal(an) !�� !�x=an_grx(an):y=an_gry(an) "� i=0 � y+1 " � j=0 � x+1 " col=disp(i,j) "$" xp%=500+40*j:yp%=860-gap*i ".9 � col>0 ș "OS_SpriteOp",256+34,S%,"on",xp%,yp%,0 "8: � col=0 ș "OS_SpriteOp",256+34,S%,"off",xp%,yp%,0 "` �j "j�i "tx=40:y=860:gap=32 "~�j=1�12 "� p=an_p(an,j) "� v=an_v(an,j) "� �PolySize(p,v) "� � j=7 x=40+gap*6:y=860 "�& �DrawPoly(p,v,x,y,0,0,col(p),10) "� ypos(j*2)=y "� y=y-(ypoly*gap)-gap "� ypos(j*2-1)=y+gap*2 "��j "� gap=40 "�� "�: # : # ��PolyColour #pcol=�msx,msy) #col(p)=pcol #(�UpdatePic #2� #<: #F: #P ��OnePoly #Z� i,j,v,x,y #dsq=5:gap=40 #nx=40:y=860 #x�0,back-128 Ȝ 64 #�ȓȐ 40,100,340,800 #�num=�(rot$(p)) #��j=1�num #� v=�(�rot$(p),j,1)) #� �PolySize(p,v) #�" �DrawPoly(p,v,x,y,0,0,60,10) #� ypos(j*2)=y #� y=y-(ypoly*gap)-gap #� ypos(j*2-1)=y+gap*2 #� � num/2=j x=40+gap*6:y=860 #��j #�� #�: $: $��SelectPent(an) $ȗ ȓ 40,100,340,800 $" ȗ � 1 $,3� REPEAT MOUSE msx,msy,msstatus:UNTILmsstatus=0 $6� $@ � $J ȗmsx,msy,msstatus $T � msstatus<>0 $^ gap=32:xmin=40:j=1:tf=� $h � $r � j=7 xmin=232 $| p=an_p(an,j) $� v=an_v(an,j) $�- ymin=ypos(j*2-1)-4:ymax=ypos(j*2)+gap $� �PolySize(p,v) $� xmax=xmin+gap*xpoly $�\ � msx>xmin � msx<xmax � msy>ymin � msy<ymax � �poly$,�(64+p))=0 � $�J �DrawPoly(p,v,xmin,ymax-gap,back-128,back-128,back-128,back-128) $� tf=� $� � $� j+=1 $� � j=13 � tf $� gap=40 $� � an=0 � tf �OnePoly $� � tf �DispPent(p,v):� %� � %� %: %&: %0��DispPent(p,v) %:dflag=� %D� an=0 �PolySize(p,v) %Ngrx=an_grx(an) %Xgry=an_gry(an) %bx=�(grx/2-xpoly/2) %ly=�(gry/2-ypoly/2) %v�j=1�ypoly %� dec=pent(p,v,j) %� �DecToBin(dec) %� �k=1�xpoly %� � �bin$,k,1)="1" � %� disp1(y+j,x+k)=p %� � %� �k %��j %�� i=0 � grx+1 %� � j=0 � gry+1 %� col=disp1(j,i) %�< � col>0 �Button(500+40*i,860-gap*j,0,0,col(col),gap) %� �j &�i &� &: & : &* ��Flip &4 � i,j &>� an=16 � p=1 � &H�PolySize(p,v) &R� i=0 � grx+1 &\ � j=0 � gry+1 &f � disp1(j,i)=p � &p disp1(j,i)=0 &z � &� �j &��i &��UpdatePic &�rot=�rot$(p),�(v)) &�%� rot=�(rot$(p)) v=�(�rot$(p),1)) &�+� rot<�(rot$(p)) v=�(�rot$(p),rot+1,1)) &��PolySize(p,v) &��DispPent(p,v) &�� &�: &�: &���UpdatePic &� � i,j '�i=y � y+ypoly ' �j=x � x+xpoly ' col=disp1(i,j) '$ � col<>0 � sp � '.6 �Button(500+40*j,860-gap*i,0,0,col(col),gap) '8 � 'B col=disp2(i,j) 'L � col<>0 � 'V: �Button(500+40*j,860-gap*i,1,2,disp3(i,j),gap) '` � 'j col=disp(i,j) 't � col<>0 � '~4 �Button(500+40*j,860-gap*i,1,2,30,gap) '� �� disp2(i,j)=0 '�3 �Button(500+40*j,860-gap*i,2,1,4,gap) '� � '� � '� � '� �j '��i '�� '�: '�: '���Move(x1,y1) '� � i,j ( #xoff1=0:xoff2=0:yoff1=0:yoff2=0 ( �PolySize(p,v) (� y1=-1 � y-1>-1 � ( �i=x � x+xpoly (( �j=y � y+ypoly (2! disp1(j-1,i)=disp1(j,i) (< �j (F �i (P �i=x � x+xpoly (Z disp1(y+ypoly,i)=0 (d �i (n y-=1 (x yoff1=1:xoff1=1:xoff2=-1 (�� (�� y1=1 � y+ypoly<gry � (� �i=x � x+xpoly (� �j=y+ypoly � y �-1 (�! disp1(j+1,i)=disp1(j,i) (� �j (� �i (� �i=x � x+xpoly (� disp1(y,i)=0 (� �i (� y+=1 (� yoff2=-1:xoff1=1:xoff2=-1 (�� )� x1=-1 � x-1>-1 � ) �i=x � x+xpoly ) �j=y � y+ypoly )"! disp1(j,i-1)=disp1(j,i) ), �j )6 �i )@ �i=y � y+ypoly )J disp1(i,x+xpoly)=0 )T �i )^ x-=1 )h xoff1=1:yoff1=1:yoff2=-1 )r� )|� x1=1 � x+xpoly<grx � )� �i=x+xpoly � x �-1 )� �j=y � y+ypoly )�! disp1(j,i+1)=disp1(j,i) )� �j )� �i )� �i=y � y+ypoly )� disp1(i,x)=0 )� �i )� x+=1 )� xoff2=-1:yoff1=1:yoff2=-1 )�� )�!� xoff1+xoff2+yoff1+yoff2=0 � )� �i=y+yoff1 � y+ypoly+1+yoff2 *" �j=x+xoff1 � x+xpoly+1+xoff2 * col=disp1(i,j) * � col<>0 � *&6 �Button(500+40*j,860-gap*i,0,0,col(col),gap) *0 � *: col=disp2(i,j) *D � col<>0 � *N: �Button(500+40*j,860-gap*i,1,2,disp3(i,j),gap) *X � *b col=disp(i,j) *l � col<>0 � *v4 �Button(500+40*j,860-gap*i,1,2,30,gap) *� �� disp2(i,j)=0 *�3 �Button(500+40*j,860-gap*i,2,1,4,gap) *� � *� � *� � *� �j *��i *�� *�: *�: *� ��Fix *��PolySize(p,v) *��i=x � x+xpoly + �j=y � y+ypoly +5 � disp1(j,i)>0 � disp(j,i)=0 �Error(7):ch=0:� +6 � disp1(j,i)>0 � disp2(j,i)>0 �Error(8):ch=0:� + �j +*�i +4�i=x � x+xpoly +> �j=y � y+ypoly +H � disp1(j,i)>0 � +R disp2(j,i)=p +\+ disp3(j,i)=col(p):disp4(j,i)=pcnt +f4 �Button(500+40*i,860-gap*j,1,2,col(p),gap) +p � +z disp1(j,i)=0 +� �j +��i +�dflag=�:pcnt+=1 +�poly$=poly$+�(64+p) +�� +�: +�: +���Remove +�� poly$="" � � dflag � +�� tf +�tf=� +�� dflag � an<>0 � +� dflag=� , disp1()=0 , �UpdatePic , tf=� ,$ prem=p ,.� ,8 � x,y,p,v ,B ȕ tf ,L( ȗ ȓ 540,860-40*gry,40*grx,40*gry ,V' � ȗ msx,msy,msstatus:�msstatus=0 ,` � ,j ȗmsx,msy,msstatus ,t � msstatus<>0 ,~ xp=�((msx-540)/40)+1 ,� yp=�((860-msy)/40)+1 ,� prem=disp2(yp,xp) ,�, � prem=0 � disp1(yp,xp)<>0 �Error(9):� ,�- � prem<>0 � disp1(yp,xp)<>0 �Error(9):� ,� � prem=0 �Error(10):� ,� ppos=�poly$,�(64+prem)) ,� cnt=disp4(yp,xp) ,� �i=1�grx ,� �j=1�gry ,� � disp2(j,i)=prem � ,�- � an<>0 � an=0 � disp4(j,i)=cnt � ,�6 disp2(j,i)=0:disp3(j,i)=0:dis=disp1(j,i) - ; � dis=0 �Button(500+40*i,860-40*j,1,2,30,gap) - B � dis<>0 �Button(500+40*i,860-40*j,0,0,col(dis),gap) - � - � -( �j -2 �i -<0 poly$=�poly$,ppos-1)+�poly$,�(poly$)-ppos) -F tf=� -P� -Z � an<>0 � -d x=40:y=860:gap=32 -n �j=1�12 -x p=an_p(an,j) -� v=an_v(an,j) -� �PolySize(p,v) -� � j=7 x=40+gap*6:y=860 -�1 � p=prem �DrawPoly(p,v,x,y,0,0,col(p),10) -� y=y-(ypoly*gap)-gap -� �j -� gap=40 -�� -�� -�: -�: -� ��Help -� � i,j .�i=1� an_grx(an) . �j=1� an_gry(an) .E � disp2(j,i)>0 � disp2(j,i)<>disp(j,i) �Help1(disp2(j,i),j,i) ." �j .,�i .6� .@: .J: .T��Help1(prem,yp,xp) .^� i,j,x,y,p,v .hppos=�poly$,�(64+prem)) .rcnt=disp4(yp,xp) .|�i=1�grx .� �j=1�gry .� � disp2(j,i)=prem � .�+ � an<>0 � an=0 � disp4(j,i)=cnt � .�4 disp2(j,i)=0:disp3(j,i)=0:dis=disp1(j,i) .�9 � dis=0 �Button(500+40*i,860-40*j,1,2,30,gap) .�@ � dis<>0 �Button(500+40*i,860-40*j,0,0,col(dis),gap) .� � .� � .� �j .��i .�.poly$=�poly$,ppos-1)+�poly$,�(poly$)-ppos) .� � an<>0 � .� x=40:y=860:gap=32 / �j=1�12 / p=an_p(an,j) / v=an_v(an,j) /& �PolySize(p,v) /0 � j=7 x=40+gap*6:y=860 /:1 � p=prem �DrawPoly(p,v,x,y,0,0,col(p),10) /D y=y-(ypoly*gap)-gap /N �j /X gap=40 /b� /l� /v: /�: /� ��MenuChoice(menu, � choice) /�&menset$(10,7)="":menset$(10,10)="" /�(� menset$(1,3)="N" menset$(10,7)="N" /�)� menset$(1,4)="N" menset$(10,10)="N" /�)blx=menext(menu,1):bly=menext(menu,2) /�+xext=menext(menu,3):yext=menext(menu,4) /�0� menu<>6 � menu<>7 ȗ ȓ blx,bly,xext,yext /� ȗ � 1 /�choice=0 /�� /� � menu<>6 � menu<>7 � /�) � ȗ msx,msy,msstatus:�msstatus=0 0 � 0 ȗmsx,msy,msstatus 0- � �(-2) � �(-82) � menu=10 �SavePic 0 \ � �(-2) � �(-85) � menu=10 � menset$(1,2)<>"N" � an>0 � an<14 �Help:�PolySize(p,v) 0* � msstatus<>0 04 � 0> item=10 0H � 0R mx=menux(menu,item)-4 0\ my=menuy(menu,item)-32 0f% mlen=�(menu$(menu,item))*32+8 0pZ � msx>mx � msx<mx+mlen � msy>my � msy<my+44 � menset$(menu,item)<>"N" � 0z choice=item 0� � choice<>10 � 0�& � 3,13:ȓ Ȑ mx,my,mlen,40 0� time=�:� � �-time>25 0�& � 3,13:ȓ Ȑ mx,my,mlen,40 0� � 0� � 0� item-=1 0� � item=0 0� � menu=6 � menu=7 � 0�� choice<>0 0�� 0�: 0�: 1 ��SavePic 1sp=� 1 � dflag sp=�:�UpdatePic:sp=� 1$!� � �YesNo("Save Picture?") � 1. *FX15,0 18 msstatus=0 1B ȗ ȓ 480,100,760,160 1L � dflag �UpdatePic 1V � 1`� 1j� 63 Ȝ 192 1t� 200,40 1~Mok$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_#/-'" 1��"Enter Filename:" 1��Input(712,40,10,ok$,file$) 1�� back-128 Ȝ 64 1�ȓȐ 180,0,1000,50 1�� file$<>"" � 1�7 � 24,480;800-an_gry(an)*40;580+an_grx(an)*40;900; 1� *DIR <POLY$DIR> 1� *UP 1 1� $name%="" 1� � i%=0 � �(file$) 1�" $(name%+i%)=�file$,i%+1,1) 1� �i% 2 � ("SCREENSAVE "+$name%) 2 � 26 2� 2� dflag �UpdatePic 2(ȗ ȓ 480,100,760,160 22� 2<: 2F: 2P��LoadAnimal(animal) 2Z disp()=0:disp1()=0:disp2()=0 2d�i=1�12 2n p=an_p(animal,i) 2x v=an_v(animal,i) 2� x_min=an_x(animal,i) 2� y_min=an_y(animal,i) 2� �j=1�5 2� dec=pent(p,v,j) 2� �DecToBin(dec) 2� �k=1�5 2� � �bin$,k,1)="1" � 2�' disp(y_min+j-1,x_min+k-1)=p 2� � 2� �k 2� �j 2��i 2�� 3: 3: 3$��Button(x,y,col1,col2,col3,gap) 3" rect=8 3,� gap=20 rect=4 36�0,col1 3@� col1=1 � 0,10 Ȝ 0 3J� col1=2 � 0,10 Ȝ 192 3T%� x,y:� x,y+gap-8:� &55,x+gap-8,y 3^�0,col2 3h� col2=1 � 0,10 Ȝ 0 3r� col2=2 � 0,10 Ȝ 192 3|� &55,x+gap-8,y+gap-8 3��0,col3 Ȝ 128 3�+ȓ Ȑ x+rect,y+rect,(gap-8)/2,(gap-8)/2 3�� 3�: 3�: 3���Buttoff(x%,y%,col,gap%) 3�� col Ȝ 64 3�ȓ Ȑ x%,y%,gap%-8,gap%-8 3�� col Ȝ 192 3�� 3�: 3�: 3���Error(err) 4 � i,j 4� 4 4� fore:� back Ȝ 64 4&error$=err$(err) 40i=1 4:� �(7);�(7) 4D!� �(error$) � 2=1 error$+=" " 4N� i=1��(error$)/2 4X �20-i,30); 4b time=�:� � �-time>5 4l � �error$,i);�error$,i); 4v�i 4�� err=3+erroff � 4� time=� 4� � 4� �Flash(1,2,8) 4� �Flash(1,2,34) 4� � �-time>250 4� �Flash(1,2,8) 4�� 4�time=�:� � �-time>200 4�� i=�(error$)/2�1�-1 4� �19-i,30);" "; 4�" �error$,i);�error$,i);" "; 4� time=�:� � �-time>5 5�i 5�18,30)" "; 5� 5 5 � 5*: 54: 5>��Flash(c1,c2,c3) 5H � 100,100 5Rxadjust=0:yadjust=0:mod=4 5\(� sq=6 xadjust=-60:yadjust=200:mod=7 5f!v=�(�var$,�poly$,�(64+p)),1)) 5ppp=�poly$,�(64+p)) 5z/xpos=100+((pp-1) � mod)*(sq*gap+20)+xadjust 5�Cypos=((sq*gap+20)*(sq-1)-20)-((pp-1) � mod)*(sq*gap+20)+yadjust 5��PolySize(p,v) 5�:�DrawPoly(p,v,xpos+gap*xoff,ypos-gap*yoff,c1,c2,c3,60) 5�� 5�: 5�: 5���ErrorTrap 5�� 4 5��"Diagnostics:" 5��"Error number ";� 5�� 5��" at line ";� 5�� 6� 6: 6: 6$%� *** Colours for Pentominoes *** 6.: 68(� 3,11,63,48,19,60,15,24,17,28,55,50 6B: 6L: 6V8� *********** Data for Pentomino Puzzles *********** 6`: 6j� *** Tessellation Data *** 6t: 6~� "Tessellations",16,13 6�5� 0,0,1,3,0,0,2,5,0,0,3,1,0,0,4,1,0,0,5,1,0,0,6,1 6�8� 0,0,7,1,0,0,8,1,0,0,9,1,0,0,10,1,0,0,11,1,0,0,12,1 6�: 6�� *** Pentanimals *** 6�: 6�� "Dog",10,12 6�6� 1,10,1,1,2,2,6,1,4,1,7,1,4,4,5,4,6,3,2,2,6,4,8,1 6�9� 6,6,12,2,6,8,10,2,7,8,4,3,8,5,9,4,9,3,3,3,10,9,11,4 6�� "Penguin",9,12 6�6� 1,4,11,1,1,6,5,3,4,3,6,1,4,5,4,4,5,5,3,3,5,8,9,7 6�8� 6,1,12,2,6,3,8,3,7,7,1,1,8,3,10,7,9,5,2,3,10,3,7,7 6�� "Elephant",11,9 7 7� 1,1,11,1,5,4,1,1,3,4,2,8,3,7,7,8,3,9,12,1,4,1,4,2 7 7� 4,4,10,4,1,2,6,1,5,7,8,3,6,5,9,8,6,8,5,6,6,10,3,3 7� "Pig",12,7 77� 1,2,9,1,1,6,1,3,1,11,3,3,2,4,11,1,2,5,6,1,2,7,2,5 7(8� 2,9,10,8,3,1,12,4,4,6,8,1,4,8,7,8,5,4,4,2,5,10,5,2 72� "Cockerel",13,13 7<:� 1,3,12,1,2,1,6,1,3,10,10,5,3,12,11,4,4,3,1,1,5,4,5,5 7F6� 5,7,4,2,6,7,8,1,6,9,9,8,7,4,7,1,9,5,2,5,10,6,3,3 7P� "Kangeroo",15,13 7Z7� 1,2,5,5,3,3,9,6,5,1,8,3,7,3,11,5,8,3,10,5,9,5,6,1 7d<� 10,4,2,2,10,9,3,1,11,1,4,3,11,7,7,7,13,11,1,3,8,6,12,4 7n� "Camel",13,12 7x8� 1,1,2,7,3,3,11,1,4,4,12,4,4,9,6,1,6,4,10,4,6,7,9,3 7�8� 6,11,7,4,7,7,4,1,7,8,8,4,7,11,5,3,8,6,1,1,9,12,3,4 7�� "Dove",16,9 7�8� 1,2,4,4,2,1,12,4,3,5,1,3,3,10,2,5,3,13,9,1,4,3,6,1 7�8� 4,5,11,4,4,7,3,5,4,10,8,3,5,7,7,3,7,5,5,2,7,7,10,2 7�: 7�/� *** Puzzle Shape Data for Pentominoes *** 7�: 7�� "Pyramid",15,8 7�7� 1,8,9,6,2,6,6,1,3,9,10,3,4,4,7,3,5,7,3,1,5,10,8,1 7�9� 6,2,2,6,6,4,4,4,6,9,11,1,6,11,5,1,6,13,12,1,8,1,1,3 7�� "Diamond",11,10 7�7� 1,5,10,5,3,3,2,6,3,6,5,2,4,8,7,1,5,1,6,1,5,3,11,3 7�6� 5,5,3,4,6,3,4,3,6,7,1,3,7,6,8,1,7,8,12,2,9,4,9,2 8� "Cross",11,11 86� 1,5,7,5,1,7,3,1,3,4,10,8,5,1,5,3,5,2,9,3,5,6,2,5 88� 5,8,8,3,5,9,4,3,7,2,1,3,7,6,6,1,8,4,12,4,10,5,11,6 8"� "'Circle'",9,8 8,7� 1,1,12,3,1,4,7,6,1,5,9,3,2,4,4,3,3,1,8,3,3,6,10,3 866� 3,8,11,3,5,1,6,1,5,3,5,2,6,5,1,3,7,3,3,6,7,5,2,8 8@� "Bee-Hive",9,10 8J6� 1,1,3,2,1,2,7,3,2,4,6,1,3,1,5,1,3,3,9,6,4,6,11,1 8T7� 5,5,1,1,5,7,10,4,6,2,12,4,7,6,8,2,7,8,2,4,8,6,4,1 8^: 8h� *** Rectangle Data *** 8r: 8|� "6x10",10,6 8�5� 1,1,2,2,1,2,9,3,1,5,1,3,1,8,5,5,2,2,6,1,2,6,8,2 8�8� 3,4,12,2,3,8,11,3,4,1,10,5,4,6,7,6,4,8,4,3,5,2,3,8 8�� "5x12",12,5 8�6� 1,1,9,6,1,2,5,2,1,4,10,1,1,6,8,4,1,7,1,3,1,9,3,8 8�8� 3,1,4,1,3,3,6,1,3,5,12,3,3,9,2,8,4,7,7,3,4,10,11,6 8�� "4x15",15,4 8�8� 1,1,1,3,1,5,6,1,1,7,8,2,1,9,10,6,1,10,9,3,1,13,4,4 8�9� 2,1,11,5,2,4,12,1,2,13,5,1,3,1,2,6,3,7,3,6,3,11,7,2 8�: 8�: 8�� *** Error Messages *** 8�: 8�'� "A pentomino must have 5 squares" 9 � "Squares must be touching" 9%� "This pentomino already exists" 9&� "A hexomino must have 6 squares" 9& � "Squares must be touching" 90$� "This hexomino already exists" 9:+� "The pentomino must lie on the shape" 9D$� "Pentominoes must not overlap" 9N)� "This pentomino has not been FIXed" 9X)� "Click on a pentomino to remove it" 9b: 9l: 9v� *** Menu Data *** 9�: 9�� 480,100,760,160 9�I� "Access Code",464,840,"Help",576,750,"Flip",576,660," ",560,570 9� � "z",1,1 9�: 9�� 330,60,620,800 9�5� "Tutorial",512,840,"Pentomino Designer",352,750 9�6� "Hexomino Designer",368,660,"Rectangles",480,570 9�1� "PentAnimals",464,480,"PentoShapes",464,390 9�7� "Tessellations",432,300,"Teacher Control",400,210 9�� "QUIT",576,120,"z",1,1 9�: 9�� 480,100,320,800 :8� "Dog",592,840,"Penguin",528,750,"Elephant",512,660 :9� "Pig",592,570,"Cockerel",512,480,"Kangeroo",512,390 :$� "Camel",560,300,"Dove",576,210 : !� "Main Menu",496,120,"z",1,1 :*: :4� 400,440,480,440 :>7� "6x10 Rectangle",416,840,"5x12 Rectangle",416,750 :H� "4x15 Rectangle",416,660 :R!� "Main Menu",496,570,"z",1,1 :\: :f� 480,350,320,530 :p9� "Pyramid",528,840,"Diamond",528,750,"Cross",560,660 :z+� "'Circle'",512,570,"Bee-Hive",512,480 :�!� "Main Menu",496,390,"z",1,1 :�: :�� 999,999,999,999 :�,� "TRY",1048,650,"QUIT",1032,560,"z",1,1 :�: :�� 999,999,999,999 :�,� "TRY",1080,600,"QUIT",1064,510,"z",1,1 :�: :�� 790,10,140,50 :�#� "y",792,50,"n",888,50,"z",1,1 :�: :�� 510,10,260,50 :�� "CONTINUE",514,50,"z",1,1 ;: ;� 480,100,760,160 ;5� "�",700,200,"�",780,200,"�",740,160,"�",740,240 ;$D� "Fix",908,240,"Remove",860,160,"Flip",1100,240,"Quit",1100,160 ;.-� "�Pick",480,240," ",480,160,"z",1,1 ;8: ;B: ;L#� *** Data for the Tutorial *** ;V: ;`� "63What is a POLYOMINO ?" ;j � "!" ;t2� "60It isn't a word we use every day, but we" ;~2� "60all have heard of one sort of polyomino." ;� � "!" ;�2� "12It's the simplist kind, called a DOMINO." ;� � "!" ;�0� "60No doubt you've all played dominoes at" ;�� "60some time or another." ;� � "#","@" ;�0� "12A domino is a rectangle split into two" ;�0� "12squares, joined at one of their edges." ;� � "#","$" ;�2� "60Therefore, a TRIOMINO would be made of 3" ;�1� "60squares joined at their edges, as shown" ;�(� "60below:- There are 2 TRIOMINOES" <