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"
<