Home » Archimedes archive » Archimedes World » AW-1993-04.adf » AWApril93 » !AWApril93/Goodies/WordSq/!WordSq/!RunImage
!AWApril93/Goodies/WordSq/!WordSq/!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-04.adf » AWApril93 |
| Filename: | !AWApril93/Goodies/WordSq/!WordSq/!RunImage |
| Read OK: | ✔ |
| File size: | F30B bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >WordSq$Dir.!RunImage
20REM WordSquare Creation and Solving program
30REM By Matthew Eglise
40REM
50REM Copyright held by Archimedes World magazine
60REM This program is NOT Public Domain
70REM
80REM Version 3.12 - 26th September 1992
90REM
100mem1%=9042:mem2%=17100:filetype%=&03C
110PROCautoload
120SYS"Hourglass_On"
130PROCStart("WordSq",mem1%,mem2%)
140PROCinit
150PROCCreate_Windows
160PROCCreate_Menus
170PROCloadprefs
180IFd$<>"" PROCLoadOwn(d$)
190SYS"Hourglass_Off"
200ON ERROR PROCError:GOTO200
210REPEAT
220PROCpoll
230UNTIL FNnew("quit")<>0
240PROCCloseDown
250END
260:
270DEFPROCinit
280DIM word$(168),len%(168),grid%(2400),show%(168),b$(60)
290DIM selected%(168),start%(168),dir%(168),temp$(168)
300DIM sx%(168),sy%(168),ex%(168),ey%(168)
310DIM valid% 32:$valid%="b1,0,15,4,0,1,14,12"
320DIM text% 8:$text%=""
330wordswind%=0:words%=0:grid%=0:selection%=0:ef%=0:high%=0
340nofit%=0:dimx=0:dimy=0:maxh=0:a=0:needs%=0:gaps=25:len%=0
350wsqtitle$="":selectedword$="":saveformat$="text":solveformat$="":temp$=""
360mainwind%=0:solvewind%=0:dispwind%=0:wsqx=0:wsqy=0:wsqwords%=0
370wordssaved%=1:gridsaved%=1:flag%=0:show%=0:found%=0:done%=0
380startx%=0:starty%=0:dispx%=0
390dispbox%=0:wordsbox%=0
400ENDPROC
410:
420DEFPROCCreate_Windows
430PROCSpritesLoad
440solve_Window%=FNWindowLoad("solve")
450info_Window%=FNWindowLoad("info")
460savewords_Window%=FNWindowLoad("savewords")
470display_Window%=FNWindowLoad("display")
480words_Window%=FNWindowLoad("words")
490main_Window%=FNWindowLoad("main")
500savewsq_Window%=FNWindowLoad("savewsq")
510prefs_Window%=FNWindowLoad("prefs")
520Bar_Icon%=FNIconBar("!WordSq")
530FORI%=4TO171:PROCIconPutText(words_Window%,I%,""):NEXT
540PROCww
550ENDPROC
560:
570DEFFNEvent_Save(window%)
580CASE window% OF
590WHEN savewords_Window% :=TRUE
600WHEN savewsq_Window% :=TRUE
610OTHERWISE :=FALSE
620ENDCASE
630:
640DEFPROCCreate_Menus
650DIM prefs_Menu%(1)
660menu$="WordSq\Info>info_Window%\Edit\Solve\Preferences\Clear\Quit"
670Bar_Menu%=FNMenuCreate(menu$)
680menu$ ="Solve\Info>info_Window%\Show Words\"
690menu$+="Quit"
700solve_Menu%=FNMenuCreate(menu$)
710menu$ ="Display\Info>info_Window%\Show Words\Quit"
720display_Menu%=FNMenuCreate(menu$)
730menu$ ="Words\Info>info_Window%\Save Words>savewords_Window%\"
740menu$+="Quit"
750words_Menu%=FNMenuCreate(menu$)
760WlMenu%=FNMenuCreate("Colours")
770SmMenu%=FNMenuCreate("Colours")
780LMenu%=FNMenuCreate("Colours")
790ClMenu%=FNMenuCreate("Colours")
800menu$="Colours\Words list>WlMenu%\Start mark>SmMenu%\Lines>LMenu%\Latest line>ClMenu%"
810prefs_Menu%(1)=FNMenuCreate(menu$)
820menu$ ="Prefs\Info>info_Window%\Colours>prefs_Menu%(1)\Quit"
830prefs_Menu%=FNMenuCreate(menu$)
840menu$ ="Create\Info>info_Window%\Show Words\"
850menu$+="Save Words>savewords_Window%\Save Square>savewsq_Window%\Print Words\Print Square\Quit"
860main_Menu%=FNMenuCreate(menu$)
870savewsq_Menu%=0:info_Menu%=0:savewords_Menu%=0
880PROCMenuDisable(main_Menu%,2)
890PROCMenuDisable(main_Menu%,3)
900PROCMenuDisable(main_Menu%,4)
910PROCMenuDisable(main_Menu%,5)
920PROCMenuDisable(main_Menu%,6)
930PROCMenuDisable(solve_Menu%,2)
940PROCMenuDisable(display_Menu%,2)
950ENDPROC
960:
970DEFFNEvent_Menu(window%)
980CASE window% OF
990WHEN Bar_Window%:=Bar_Menu%
1000WHEN solve_Window%:=solve_Menu%
1010WHEN display_Window%:=display_Menu%
1020WHEN words_Window%:=words_Menu%
1030WHEN main_Window%:=main_Menu%
1040WHEN prefs_Window%:=prefs_Menu%
1050OTHERWISE:=FALSE
1060ENDCASE
1070:
1080DEFPROCEvent_WindowClose(window%,buttons%)
1090CASE window% OF
1100WHEN solve_Window%:solvewind%=0
1110WHEN info_Window%
1120WHEN savewords_Window%
1130WHEN display_Window%:dispwind%=0
1140WHEN words_Window%:wordswind%=0:PROCMenuTick(main_Menu%,2):PROCMenuTick(solve_Menu%,2):PROCMenuTick(display_Menu%,2)
1150WHEN main_Window%:mainwind%=0
1160WHEN savewsq_Window%
1170WHEN prefs_Window%
1180ENDCASE
1190ENDPROC
1200:
1210DEFPROCEvent_Draw(window%,x_origin%,y_origin%)
1220CASE window% OF
1230WHEN savewsq_Window%:PROCDrawsavewsqWindow
1240WHEN solve_Window%:PROCDrawsolveWindow
1250WHEN info_Window%:PROCDrawinfoWindow
1260WHEN savewords_Window%:PROCDrawsavewordsWindow
1270WHEN prefs_Window%:PROCDrawprefsWindow
1280WHEN display_Window%:PROCDrawdisplayWindow
1290WHEN words_Window%:PROCDrawwordsWindow
1300WHEN main_Window%:PROCDrawmainWindow
1310ENDCASE
1320ENDPROC
1330:
1340DEFPROCDrawsavewsqWindow
1350ENDPROC
1360:
1370DEFPROCDrawsolveWindow
1380ENDPROC
1390:
1400DEFPROCDrawinfoWindow
1410ENDPROC
1420:
1430DEFPROCDrawsavewordsWindow
1440ENDPROC
1450:
1460DEFPROCDrawprefsWindow
1470ENDPROC
1480:
1490DEFPROCDrawwordsWindow
1500ENDPROC
1510:
1520DEFPROCDrawmainWindow
1530ENDPROC
1540:
1550DEFPROCDrawdisplayWindow
1560IFstartx%<>0 AND starty%<>0 SYS"Wimp_SetColour",mcol%:RECTANGLE FILL x_origin%+startx%,y_origin%+starty%,22,32
1570FORI%=1TOwords%
1580IFshow%(I%)=0 OR (start%(I%)=0 AND dir%(I%)=0) GOTO1610
1590IFI%=show% SYS"Wimp_SetColour",lcol% ELSE SYS"Wimp_SetColour",col%
1600LINE x_origin%+sx%(I%),y_origin%-sy%(I%),x_origin%+ex%(I%),y_origin%-ey%(I%)
1610NEXT
1620dispx%=x_origin%-18
1630ENDPROC
1640:
1650DEFPROCEvent_MouseClick(window%,icon%,button%,x%,y%)
1660CASE window% OF
1670WHEN Bar_Window%:PROCMouseBar
1680WHEN solve_Window%:PROCMousesolve(button%,icon%)
1690WHEN info_Window%:PROCMouseinfo(button%,icon%)
1700WHEN display_Window%:PROCMousedisplay(button%,icon%)
1710WHEN prefs_Window%:PROCMouseprefs(button%,icon%)
1720WHEN words_Window%:PROCMousewords(button%,icon%)
1730WHEN main_Window%:PROCMousemain(button%,icon%)
1740ENDCASE
1750ENDPROC
1760:
1770DEFPROCMouseBar
1780PROCBringToTop(main_Window%):mainwind%=1
1790ENDPROC
1800:
1810DEFPROCMouseprefs(button%,icon%)
1820CASE icon% OF
1830WHEN 1:PROCsaveprefs:PROCWindowClose(prefs_Window%)
1840WHEN 11:PROCgetprefs:PROCWindowClose(prefs_Window%)
1850WHEN 12:PROCWindowClose(prefs_Window%)
1860IFtempdbl%<>dbl% PROCSetIcon(prefs_Window%,3):tempdbl%=dbl%
1870IFtempcaps%<>caps% PROCSetIcon(prefs_Window%,29):PROCSetIcon(prefs_Window%,30):tempcaps%=caps%
1880IFtempforce%<>force% PROCSetIcon(prefs_Window%,45):PROCSetIcon(prefs_Window%,46):tempforce%=force%
1890IFtemptitlept%<>titlept% temptitlept%=titlept%
1900IFtempgridpt%<>gridpt% tempgridpt%=gridpt%
1910IFtempwordspt%<>wordspt% tempwordspt%=wordspt%
1920IFtempcol%<>col% tempcol%=col%
1930IFtempmcol%<>mcol% tempmcol%=mcol%
1940IFtempwcol%<>wcol% tempwcol%=wcol%
1950IFtemplcol%<>lcol% templcol%=lcol%
1960PROCsetprefs
1970WHEN 3:IF tempdbl%=-1 tempdbl%=0 ELSE tempdbl%=-1
1980WHEN 29:IFbutton%=1 AND tempcaps%=-1 PROCSetIcon(prefs_Window%,29)
1990tempcaps%=-1
2000WHEN 30:IFbutton%=1 AND tempcaps%=0 PROCSetIcon(prefs_Window%,30)
2010tempcaps%=0
2020WHEN 31,33:temptitlept%=FNbumppt(icon%-32,temptitlept%,32)
2030WHEN 34,36:tempgridpt%=FNbumppt(icon%-35,tempgridpt%,35)
2040WHEN 37,39:tempwordspt%=FNbumppt(icon%-38,tempwordspt%,38)
2050WHEN 45:IF button%=1 AND tempforce%=-1 PROCSetIcon(prefs_Window%,45)
2060tempforce%=-1
2070WHEN 46:IF button%=1 AND tempforce%=0 PROCSetIcon(prefs_Window%,45)
2080tempforce%=0
2090OTHERWISE:PROCAlert("WordSq","Invalid Templates file.")
2100ENDCASE
2110ENDPROC
2120:
2130DEFPROCMousesolve(button%,icon%)
2140IFbutton%<>1 AND button%<>4 ENDPROC
2150IFsolveformat$="" PROCAlert("WordSq","No wordsquare is currently available - either create one or load a plain text wordsquare."):ENDPROC
2160IFicon%=9 AND (selection%=0 AND FNIconText(solve_Window%,17)="") ENDPROC
2170CASE icon% OF
2180WHEN 8:PROCBringToTop(display_Window%):dispwind%=1:PROCremovepressed
2190WHEN 9:PROCBringToTop(display_Window%):dispwind%=1:PROCshowpressed
2200WHEN 11:PROCBringToTop(display_Window%):dispwind%=1:PROCshowall
2210WHEN 10:PROCremoveall
2220OTHERWISE:PROCAlert("WordSq","Invalid Templates file.")
2230ENDCASE
2240ENDPROC
2250:
2260DEFPROCMousedisplay(button%,icon%)
2270IFbutton%<>4 AND button%<>1 ENDPROC
2280IFicon%-1>wsqy ENDPROC
2290!wimp%=display_Window%:SYS "Wimp_GetWindowState",,wimp%:dispx%=wimp%!4-wimp%!20-2
2300IFbutton%=4 startpos%=0:startx%=0:starty%=0:endpos%=0 ELSE IFbutton%=1 AND startpos%=0 button%=4:startx%=0:starty%=0:endpos%=0
2310icon%-=1:i%=((24+((x%-dispx%)/16))/2)-12
2320IFi%>wsqx ENDPROC
2330p%=((icon%-1)*wsqx)+i%
2340CASE button% OF
2350WHEN 4:startpos%=p%
2360startx%=22+((i%-1)*32)-8:starty%=-84-((icon%-1)*44)
2370WHEN 1:endpos%=p%
2380d$=FNgetword(startpos%,endpos%):PROCIconPutText(solve_Window%,17,d$)
2390IFstartpos%<>endpos% AND o%=1 AND d$<>"" THEN
2400PROCcaret((LENd$/2)+1000)
2410ex%=FNexists(d$):p%=FNpalindrome(d$)
2420IFex%=0 PROCAlert("WordSq","The word '"+d$+"' does not exist in the current word list."):GOTO2460
2430IFex%>0 AND startpos%<>0 AND endpos%<>0 AND startpos%<>start%(ex%) AND p%=0 PROCAlert("WordSq","Although the word "+d$+" does exist in the current wordsquare, it is not at this position."):GOTO2460
2440IFex%>0 AND startpos%<>0 AND endpos%<>0 AND startpos%<>start%(ex%) AND p%=1 SWAP startpos%,endpos%
2450IFex%>0:IFshow%(ex%)=0 high%+=1:show%(ex%)=2:PROCsic(words_Window%,ex%+3,wcol%):show%=ex%:found%+=1
2460startx%=0:starty%=0:startpos%=0:endpos%=0
2470ENDIF
2480ENDCASE
2490PROCWindowForceDraw(display_Window%)
2500PROCupdatesolvestate
2510IFsolveformat$<>"own" ENDPROC
2520IFfound%=wsqwords% AND done%=0 ANDwsqwords%=1 PROCAlert("WordSq","Well Done, you've found the word."):done%=1:ENDPROC
2530IFhigh%=wsqwords% AND found%<wsqwords% AND done%=0 AND wsqwords%=1 AND found%>0 PROCAlert("WordSq","Although you have found the word, you had to seek help with it."):done%=1:ENDPROC
2540IFfound%=wsqwords% AND done%=0 PROCAlert("WordSq","Well Done, you've found all "+FNoneormore(wsqwords%)+"in the grid."):done%=1
2550IFhigh%=wsqwords% AND found%<wsqwords% AND done%=0 AND found%>0 PROCAlert("WordSq","Although you have found all "+FNoneormore(wsqwords%)+"in the grid, you had to seek help with "+STR$(wsqwords%-found%)+" of them."):done%=1
2560ENDPROC
2570:
2580DEFPROCshowpressed
2590IFsolveformat$="" PROCIconPutText(solve_Window%,17,""):ENDPROC
2600gibbet$=FNIconText(solve_Window%,17):need%=0:F%=0
2610ex%=FNexists(gibbet$)
2620IFcaps%=-1 PROCIconPutText(main_Window%,26,FNcaps(gibbet$)):PROCIconPutText(solve_Window%,17,FNcaps(gibbet$))
2630IFFNlen(gibbet$)<3 AND selection%=0 GOTO2830
2640IFselection%=0 AND solveformat$="text" AND ex%=0 PROCfind(FNcaps(gibbet$)):PROCIconPutText(main_Window%,20,STR$gaps):GOTO2820
2650IFselection%=0 AND solveformat$="own" THEN
2660IFex%=0 PROCAlert("WordSq","The word '"+gibbet$+"' does not exist in the current word list."):GOTO2690
2670IFex%>0 AND startpos%<>0 AND endpos%<>0 AND startpos%<>start%(ex%) PROCAlert("WordSq","Although the word "+gibbet$+" does exist in the current wordsquare, it is not at this position."):GOTO2690
2680IFex%>0 need%=1:IFshow%(ex%)=0 high%+=1:show%(ex%)=1:PROCsic(words_Window%,ex%+3,wcol%):show%=ex%
2690ENDIF
2700IFselection%=0 AND solveformat$="own" GOTO 2830
2710IFselection%>0 THEN
2720o%=0:FORI%=1TOwords%:IFselected%(I%)=1 AND start%(I%)=0 AND dir%(I%)=0 o%+=1 ELSE IFselected%(I%)=1 AND show%(I%)=0 high%+=1:show%(I%)=1:need%=1:PROCsic(words_Window%,I%+3,wcol%)
2730NEXT
2740IFselection%>1 show%=0
2750IFo%>0 THEN
2760IFo%=1 o$=" does " ELSE o$=" do "
2770IFo%=1 AND selection%=1 d$="This word does ":ELSE d$=FNoneormore(o%)+"amongst the selection"+o$:o$="they"
2780IFo%=1 o$="it"
2790PROCAlert("WordSq",d$+"not appear in the current wordsquare so "+o$+" will not be shown.")
2800ENDIF
2810ENDIF
2820o%=selection%
2830PROCclearall:PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCcaret(0)
2840IFwords%=1:PROCMenuEnable(main_Menu%,2):PROCMenuEnable(main_Menu%,3):PROCMenuEnable(main_Menu%,5):PROCMenuEnable(solve_Menu%,2):PROCMenuEnable(words_Menu%,2):PROCMenuEnable(display_Menu%,2)
2850IFwords%=0 done%=0
2860startx%=0:starty%=0
2870PROCWindowForceDraw(display_Window%)
2880PROCupdatesolvestate:IFsolveformat$<>"own" ORo%>=wsqwords% ORdone%=1 ENDPROC
2890IFhigh%=wsqwords% AND found%<wsqwords% ANDwsqwords%=1 PROCAlert("WordSq","Although you found the word, you had to seek help with it."):done%=1:ENDPROC
2900IFhigh%=wsqwords% AND found%<wsqwords% AND found%>0 PROCAlert("WordSq","Although you have found all "+FNoneormore(wsqwords%)+"in the grid, you had to seek help with "+STR$(wsqwords%-found%)+" of them."):done%=1
2910ENDPROC
2920:
2930DEFPROCremovepressed
2940IFsolveformat$="" PROCIconPutText(solve_Window%,17,""):PROCcaret(0):ENDPROC
2950IFselection%=0 ENDPROC
2960need%=0:FORI%=1TOwords%
2970IFshow%(I%)=2 AND selected%(I%)=1 found%-=1
2980IFselected%(I%)=1 AND show%(I%)>0 high%-=1:show%(I%)=0:need%=1:PROCsic(words_Window%,I%+3,7):IFI%=show% show%=0
2990NEXT
3000done%=0
3010PROCclearall:PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCcaret(0)
3020IFneed% PROCWindowForceDraw(display_Window%)
3030PROCupdatesolvestate
3040ENDPROC
3050:
3060DEFPROCMouseinfo(button%,icon%)
3070ENDPROC
3080:
3090DEFPROCMousewords(button%,icon%)
3100IFicon%>3 AND icon%<=words%+3 THEN
3110CASE button% OF
3120WHEN 4:
3130FORI%=1TOwords%:IFselected%(I%)=1 PROCSetIcon(words_Window%,I%+3):selected%(I%)=0
3140NEXT:PROCSetIcon(words_Window%,icon%):selected%(icon%-3)=1:selection%=1:selectedword$=word$(icon%-3):PROCsetbutton
3150WHEN 1:
3160PROCSetIcon(words_Window%,icon%)
3170IFselected%(icon%-3)=0 selected%(icon%-3)=1:selection%+=1:ELSE selected%(icon%-3)=0:selection%-=1:PROCsetbutton
3180IFselection%<>1 GOTO3200
3190FORI%=1TOwords%:IFselected%(I%)=1 selectedword$=word$(I%):NEXT:ELSENEXT
3200ENDCASE
3210CASE selection% OF
3220WHEN 0:PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):selectedword$=""
3230WHEN 1:PROCIconPutText(main_Window%,26,selectedword$):PROCIconPutText(solve_Window%,17,selectedword$)
3240OTHERWISE:PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):selectedword$=""
3250ENDCASE
3260ENDIF
3270IF icon%=2 PROCselectall
3280IF icon%=3 PROCclearall
3290PROCupdatesolvestate
3300PROCcaret(LENselectedword$/2)
3310PROCsetbutton
3320ENDPROC
3330:
3340DEFPROCMousemain(button%,icon%)
3350IF button%<>1 AND button%<>4 ENDPROC
3360IFicon%=24 AND FNIconText(main_Window%,26)="" ENDPROC
3370CASE icon% OF
3380WHEN 24:PROCaddword
3390WHEN 25:PROCdeleteword
3400WHEN 28:PROCamendword
3410WHEN 29:PROCcreate
3420WHEN 11,13:PROCbumpx(icon%-12)
3430WHEN 15,17:PROCbumpy(-(icon%-16))
3440WHEN 19,21:PROCbumpgaps(-(icon%-20))
3450WHEN 30:IFbutton%=1 AND saveformat$="text" PROCSetIcon(main_Window%,30)
3460saveformat$="text":d%=FNIconPutSprite(savewsq_Window%,0,"file_fff")
3470WHEN 32:IFbutton%=1 AND saveformat$="draw" PROCSetIcon(main_Window%,32)
3480saveformat$="draw":d%=FNIconPutSprite(savewsq_Window%,0,"file_fff")
3490WHEN 33:IFbutton%=1 AND saveformat$="own" PROCSetIcon(main_Window%,33)
3500saveformat$="own":d%=FNIconPutSprite(savewsq_Window%,0,"file_03c")
3510WHEN 34:IFbutton%=1 AND saveformat$="imp" PROCSetIcon(main_Window%,34)
3520saveformat$="imp":d%=FNIconPutSprite(savewsq_Window%,0,"file_fff")
3530OTHERWISE:PROCAlert("WordSq","Invalid Templates file.")
3540ENDCASE
3550ENDPROC
3560:
3570DEFPROCselectall
3580FORI%=4TOwords%+3:IFselected%(I%-3)=0 PROCSetIcon(words_Window%,I%):selected%(I%-3)=1
3590NEXT:selection%=words%:PROCsetbutton
3600ENDPROC
3610:
3620DEFPROCclearall
3630FORI%=4TOwords%+3:IFselected%(I%-3)=1 PROCSetIcon(words_Window%,I%):selected%(I%-3)=0
3640NEXT:selection%=0:PROCsetbutton
3650ENDPROC
3660:
3670DEFPROCshowall
3680FORI%=1TOwords%:IFstart%(I%)<>0 AND dir%(I%)<>0 show%(I%)=1:PROCsic(words_Window%,I%+3,wcol%)
3690NEXT:PROCWindowForceDraw(display_Window%)
3700high%=wsqwords%:done%=1:show%=0:PROCupdatesolvestate
3710ENDPROC
3720:
3730DEFPROCremoveall
3740FORI%=1TOwords%:show%(I%)=0:PROCsic(words_Window%,I%+3,7):IFI%=show% show%=0
3750NEXT
3760PROCWindowForceDraw(display_Window%)
3770high%=0:found%=0:done%=0:PROCupdatesolvestate
3780ENDPROC
3790:
3800DEFPROCEvent_KeyPress(window%,icon%,key%)
3810CASE window% OF
3820WHEN solve_Window%:PROCKeyPresssolve(icon%,key%)
3830WHEN info_Window%
3840WHEN display_Window%
3850WHEN words_Window%
3860WHEN main_Window%:PROCKeyPressmain(icon%,key%)
3870WHEN prefs_Window%:PROCKeyPressprefs(icon%,key%)
3880ENDCASE
3890key%=0:wsqtitle$=FNIconText(main_Window%,9)
3900ENDPROC
3910:
3920DEFPROCKeyPresssolve(icon%,key%)
3930IFkey%<>13 SYS"Wimp_ProcessKey",key%
3940IFkey%=13 AND icon%=17 AND (selection%<>0 OR FNIconText(solve_Window%,17)<>"") PROCshowpressed
3950IFkey%=13 AND icon%=17 AND solveformat$="" PROCcaret(0)
3960ENDPROC
3970:
3980DEFPROCKeyPressmain(icon%,key%)
3990d%=icon%
4000IFkey%=399 AND icon%=26 icon%=9 ELSE IF key%=398 AND icon%=9 icon%=26
4010IFd%<>icon% PROCIconCaret(main_Window%,icon%,INT(LENFNIconText(main_Window%,icon%)/2)):ENDPROC
4020IFkey%=13 AND icon%=26 AND FNIconText(main_Window%,26)<>"" AND solveformat$<>"text" PROCaddword:ENDPROC
4030SYS"Wimp_ProcessKey",key%
4040ENDPROC
4050:
4060DEFPROCKeyPressprefs(icon%,key%)
4070d%=icon%
4080CASE key% OF
4090WHEN 399
4100IFicon%=24 OR icon%=25 OR icon%=26 OR icon%=27 icon%-=1 ELSE IF icon%=23 icon%=17 ELSE IF icon%=41 icon%=27 ELSE IF icon%=43 icon%=41 ELSE IF icon%=9 icon%=7 ELSE IF icon%=13 icon%=9 ELSE IF icon%=17 icon%=13
4110WHEN 398
4120IFicon%=23 OR icon%=24 OR icon%=25 OR icon%=26 icon%+=1 ELSE IF icon%=41 icon%=43 ELSE IF icon%=27 icon%=41 ELSE IF icon%=17 icon%=23 ELSE IF icon%=7 icon%=9 ELSE IF icon%=9 icon%=13 ELSE IF icon%=13 icon%=17
4130OTHERWISE SYS"Wimp_ProcessKey",key%
4140ENDCASE
4150IFicon%<>d% PROCIconCaret(prefs_Window%,icon%,INT(LENFNIconText(prefs_Window%,icon%)/2))
4160ENDPROC
4170:
4180DEFPROCEvent_MenuChoice(menu%)
4190CASE menu% OF
4200WHEN Bar_Menu%:PROCMenuChoiceBar
4210WHEN savewsq_Menu%
4220WHEN solve_Menu%:PROCMenuChoicesolve
4230WHEN info_Menu%
4240WHEN savewords_Menu%
4250WHEN prefs_Menu%:PROCMenuChoiceprefs
4260WHEN display_Menu%:PROCMenuChoicedisplay
4270WHEN words_Menu%:PROCMenuChoicewords
4280WHEN main_Menu%:PROCMenuChoicemain
4290ENDCASE
4300ENDPROC
4310:
4320DEFPROCMenuChoiceBar
4330CASE FNMenuChoice(0) OF
4340WHEN 1
4350WHEN 2:PROCBringToTop(main_Window%):mainwind%=1
4360WHEN 3:IFsolveformat$<>"" PROCBringToTop(display_Window%):dispwind%=1
4370PROCBringToTop(solve_Window%):solvewind%=1
4380WHEN 4:PROCBringToTop(prefs_Window%)
4390WHEN 5:
4400IFFNnew("clear all variables")=1 PROCreset
4410WHEN 6:finished%=TRUE
4420ENDCASE
4430ENDPROC
4440:
4450DEFPROCMenuChoiceprefs
4460CASE FNMenuChoice(0) OF
4470WHEN 1
4480WHEN 2:CASE FNMenuChoice(1) OF
4490WHEN 1:IFFNMenuChoice(2)<>0 tempwcol%=FNMenuChoice(2)-1
4500WHEN 2:IFFNMenuChoice(2)<>0 tempmcol%=FNMenuChoice(2)-1
4510WHEN 3:IFFNMenuChoice(2)<>0 tempcol%=FNMenuChoice(2)-1
4520WHEN 4:IFFNMenuChoice(2)<>0 templcol%=FNMenuChoice(2)-1
4530ENDCASE
4540WHEN 3:finished%=TRUE
4550ENDCASE
4560PROCsib(prefs_Window%,50,tempcol%):PROCsib(prefs_Window%,51,tempmcol%)
4570PROCsib(prefs_Window%,53,tempwcol%):PROCsib(prefs_Window%,54,templcol%)
4580ENDPROC
4590:
4600DEFPROCMenuChoicesolve
4610CASE FNMenuChoice(0) OF
4620WHEN 1
4630WHEN 2:PROCMenuTick(solve_Menu%,2):PROCMenuTick(main_Menu%,2):PROCMenuTick(display_Menu%,2):IFwordswind%=0 wordswind%=1 ELSE wordswind%=0
4640WHEN 3:finished%=TRUE
4650ENDCASE
4660IF wordswind%=1 PROCBringToTop(words_Window%) ELSE PROCWindowClose(words_Window%)
4670ENDPROC
4680:
4690DEFPROCMenuChoicedisplay
4700CASE FNMenuChoice(0) OF
4710WHEN 1
4720WHEN 2:PROCMenuTick(solve_Menu%,2):PROCMenuTick(main_Menu%,2):PROCMenuTick(display_Menu%,2):IFwordswind%=0 wordswind%=1 ELSE wordswind%=0
4730WHEN 3:finished%=TRUE
4740ENDCASE
4750IF wordswind%=1 PROCBringToTop(words_Window%) ELSE PROCWindowClose(words_Window%)
4760ENDPROC
4770:
4780DEFPROCMenuChoicewords
4790CASE FNMenuChoice(0) OF
4800WHEN 1
4810WHEN 2
4820WHEN 3:finished%=TRUE
4830ENDCASE
4840ENDPROC
4850:
4860DEFPROCMenuChoicemain
4870CASE FNMenuChoice(0) OF
4880WHEN 1
4890WHEN 2:PROCMenuTick(main_Menu%,2):PROCMenuTick(solve_Menu%,2):PROCMenuTick(display_Menu%,2):IFwordswind%=0 wordswind%=1:PROCBringToTop(words_Window%) ELSE wordswind%=0:PROCWindowClose(words_Window%)
4900WHEN 3
4910WHEN 4
4920WHEN 5:old$=saveformat$:saveformat$="print":VDU2:PROCpre:PROCsavewords(""):PROCpost:VDU3:saveformat$=old$
4930WHEN 6:old$=saveformat$:saveformat$="print":VDU2:PROCpre:PROCsavesquare:PROCpost:VDU3:saveformat$=old$
4940WHEN 7:finished%=TRUE
4950ENDCASE
4960ENDPROC
4970:
4980DEFPROCEvent_LoadFile(file$,type%)
4990SYS"Hourglass_On"
5000CASE type% OF
5010WHEN &FFF:IFFNnew("load a new file")=1 PROCreset:PROCLoadWords(file$)
5020WHEN filetype%:IFFNnew("load a new set of words and grid")=1 PROCreset:PROCLoadOwn(file$)
5030ENDCASE
5040SYS"Hourglass_Off"
5050ENDPROC
5060:
5070DEFPROCLoadWords(file$)
5080file=OPENINfile$
5090dummy$=FNcaps(GET$#file)
5100IFINSTR(dummy$,"ORD") AND INSTR(dummy$,"UARE"):dimx=LENGET$#file:words%=0:solveformat$="text":PROCloadsquare:ENDPROC
5110CLOSE#file:file=OPENINfile$
5120words%=1:REPEAT
5130dummy$=GET$#file
5140IFFNlen(dummy$)>2 THEN
5150word$(words%)=LEFT$(dummy$,18):len%(words%)=FNlen(word$(words%))
5160IFcaps% word$(words%)=FNcaps(word$(words%))
5170words%+=1
5180ENDIF
5190UNTILEOF#file ORwords%=169
5200words%-=1:needs%=SUMlen%()
5210CLOSE#file
5220IFwords%=0 ENDPROC
5230PROCsort(1)
5240PROCMenuDisable(main_Menu%,4):PROCMenuDisable(main_Menu%,6)
5250PROCrec(2)
5260PROCafterload
5270PROCWindowClose(display_Window%)
5280IFINSTR(file$,"Wimp$Scrap")=0 PROCIconPutText(savewords_Window%,1,file$)
5290ENDPROC
5300:
5310DEFPROCafterload
5320PROCMenuEnable(main_Menu%,2):PROCMenuEnable(main_Menu%,3):PROCMenuEnable(main_Menu%,5):PROCMenuEnable(solve_Menu%,2):PROCMenuEnable(display_Menu%,2)
5330FORI%=1TO168:PROCIconPutText(words_Window%,I%+3,word$(I%)):NEXT
5340wordstatus$=STR$(words%)+" words loaded.":PROCIconPutText(main_Window%,5,wordstatus$)
5350PROCIconPutText(main_Window%,9,FNGetFileFromPathname(temp$))
5360high%=0:PROCupdatesolvestate
5370FORI%=1TO168:IFwords%<I% PROCIconPutText(words_Window%,I%+3,""):NEXT
5380PROCww
5390PROCBringToTop(main_Window%):PROCBringToTop(words_Window%)
5400IFwordswind%=0 PROCMenuTick(main_Menu%,2):PROCMenuTick(solve_Menu%,2):PROCMenuTick(display_Menu%,2)
5410wordswind%=1:mainwind%=1:len%=FNlong
5420PROCMenuEnable(words_Menu%,2)
5430PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy):PROCIconPutText(main_Window%,20,STR$gaps)
5440ENDPROC
5450:
5460DEFPROCLoadOwn(file$)
5470file=OPENINfile$
5480wsqtitle$=GET$#file:gaps=VALGET$#file:dimx=VALGET$#file:dimy=VALGET$#file
5490words%=VALGET$#file
5500FORI%=1TOwords%
5510word$(I%)=GET$#file:len%(I%)=VALGET$#file
5520start%(I%)=VALGET$#file:dir%(I%)=VALGET$#file
5530show%(I%)=VALGET$#file
5540sx%(I%)=VALGET$#file:sy%(I%)=VALGET$#file
5550ex%(I%)=VALGET$#file:ey%(I%)=VALGET$#file
5560NEXT
5570FORI%=1TOdimx*dimy
5580grid%(I%)=BGET#file
5590NEXT
5600CLOSE#file
5610solveformat$="own"
5620PROCafterload
5630PROCIconPutText(main_Window%,9,wsqtitle$)
5640PROCMenuEnable(main_Menu%,4):PROCMenuEnable(main_Menu%,6)
5650PROCIconPutText(main_Window%,6,FNoneormore(words%)+"placed - "+STR$gaps+"% gaps. ")
5660IFINSTR(file$,"Wimp$Scrap")=0 PROCIconPutText(savewsq_Window%,1,file$)
5670PROCdisplay:PROCIconPutText(solve_Window%,5,"Using wordsquare from creator program.")
5680wsqx=dimx:wsqy=dimy:wsqwords%=words%:needs%=SUMlen%()
5690FORI%=1TOwords%:IFshow%(I%)>0 high%+=1:PROCsic(words_Window%,I%+3,wcol%)
5700NEXT
5710PROCupdatesolvestate
5720ENDPROC
5730:
5740DEFPROCloadsquare
5750CLOSE#file:file=OPENINfile$:d$=GET$#file
5760dimy=0:d%=0:REPEAT:d$=GET$#file
5770IFLENd$>0 dimy+=1:FORI%=1TOdimx:d%+=1:grid%(d%)=ASCMID$(d$,I%,1):NEXT
5780UNTILEOF#file
5790wsqx=dimx:wsqy=dimy
5800CLOSE#file
5810RESTORE:FORI%=1TO10:READd%:PROCIconDisable(main_Window%,d%):NEXT
5820wordstatus$="No words found.":PROCIconPutText(main_Window%,5,wordstatus$)
5830FORI%=4TO6STEP2:PROCMenuEnable(main_Menu%,I%):NEXT
5840high%=0
5850PROCBringToTop(solve_Window%):PROCBringToTop(display_Window%):PROCWindowClose(words_Window%):wordswind%=0:dispwind%=1
5860solvewind%=1:PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy):PROCIconPutText(main_Window%,20,"100")
5870PROCdisplay:PROCIconPutText(solve_Window%,5,"Using textfile wordsquare '"+FNGetFileFromPathname(temp$)+"'.")
5880PROCIconPutText(main_Window%,6,"Using textfile wordsquare '"+FNGetFileFromPathname(temp$)+"'.")
5890PROCIconPutText(solve_Window%,6,"No words found.")
5900IFINSTR(file$,"Wimp$Scrap")=0 PROCIconPutText(savewsq_Window%,1,file$)
5910ENDPROC
5920:
5930DEFPROCloadprefs
5940file=OPENIN"<WordSq$Dir>.Prefs"
5950dbl%=VALGET$#file:force%=VALGET$#file:caps%=VALGET$#file
5960REM dbl%=0 for spacing off, -1 for spacing on
5970REM caps%=0 for preserve case, -1 for capitalise
5980REM force%=0 for force single column, -1 for automatic selection
5990col%=VALGET$#file:mcol%=VALGET$#file
6000wcol%=VALGET$#file:lcol%=VALGET$#file
6010titlefont$=GET$#file:titlept%=VALGET$#file
6020gridfont$=GET$#file:gridpt%=VALGET$#file
6030wordsfont$=GET$#file:wordspt%=VALGET$#file
6040pre$=GET$#file:post$=GET$#file
6050overon$=GET$#file:overoff$=GET$#file
6060underon$=GET$#file:underoff$=GET$#file
6070emphon$=GET$#file:emphoff$=GET$#file
6080CLOSE#file
6090tempdbl%=dbl%:tempcaps%=caps%:tempforce%=force%
6100tempcol%=col%:tempwcol%=wcol%:templcol%=lcol%:tempmcol%=mcol%
6110temptitlept%=titlept%:tempgridpt%=gridpt%:tempwordspt%=wordspt%
6120PROCsetprefs
6130IFdbl%=0 PROCSetIcon(prefs_Window%,3)
6140IFcaps%=-1 PROCSetIcon(prefs_Window%,29):PROCSetIcon(prefs_Window%,30)
6150IFforce%=0 PROCSetIcon(prefs_Window%,45):PROCSetIcon(prefs_Window%,46)
6160PROCsib(prefs_Window%,50,col%):PROCsib(prefs_Window%,51,mcol%)
6170PROCsib(prefs_Window%,53,wcol%):PROCsib(prefs_Window%,54,lcol%)
6180ENDPROC
6190:
6200:
6210DEFPROCsetprefs
6220PROCIconPutText(prefs_Window%,7,titlefont$):PROCIconPutText(prefs_Window%,32,STR$titlept%+" pt")
6230PROCIconPutText(prefs_Window%,9,gridfont$):PROCIconPutText(prefs_Window%,35,STR$gridpt%+" pt")
6240PROCIconPutText(prefs_Window%,13,wordsfont$):PROCIconPutText(prefs_Window%,38,STR$wordspt%+" pt")
6250PROCIconPutText(prefs_Window%,17,pre$):PROCIconPutText(prefs_Window%,23,post$):PROCIconPutText(prefs_Window%,24,overon$):PROCIconPutText(prefs_Window%,25,overoff$)
6260PROCIconPutText(prefs_Window%,26,underon$):PROCIconPutText(prefs_Window%,27,underoff$):PROCIconPutText(prefs_Window%,41,emphon$):PROCIconPutText(prefs_Window%,43,emphoff$)
6270PROCsib(prefs_Window%,50,col%):PROCsib(prefs_Window%,51,mcol%)
6280PROCsib(prefs_Window%,53,wcol%):PROCsib(prefs_Window%,54,lcol%)
6290FORI%=1TO168:IFshow%(I%)>0 PROCsic(words_Window%,I%+3,wcol%)
6300NEXT
6310PROCWindowForceDraw(display_Window%)
6320ENDPROC
6330:
6340DEFPROCgetprefs
6350dbl%=tempdbl%:caps%=tempcaps%:force%=tempforce%
6360col%=tempcol%:mcol%=tempmcol%:wcol%=tempwcol%:lcol%=templcol%
6370titlefont$=FNIconText(prefs_Window%,7):titlept%=VALFNIconText(prefs_Window%,32)
6380gridfont$=FNIconText(prefs_Window%,9):gridpt%=VALFNIconText(prefs_Window%,35)
6390wordsfont$=FNIconText(prefs_Window%,13):wordspt%=VALFNIconText(prefs_Window%,38)
6400pre$=FNIconText(prefs_Window%,17):post$=FNIconText(prefs_Window%,23)
6410overon$=FNIconText(prefs_Window%,24):overoff$=FNIconText(prefs_Window%,25)
6420underon$=FNIconText(prefs_Window%,26):underoff$=FNIconText(prefs_Window%,27)
6430emphon$=FNIconText(prefs_Window%,41):emphoff$=FNIconText(prefs_Window%,43)
6440FORI%=1TO168:IFshow%(I%)>0 PROCsic(words_Window%,I%+3,wcol%)
6450NEXT
6460PROCWindowForceDraw(display_Window%)
6470ENDPROC
6480:
6490DEFPROCEvent_SaveFile(file$,window%)
6500CASE window% OF
6510WHEN savewsq_Window%:PROCsavesquare
6520WHEN solve_Window%
6530WHEN info_Window%
6540WHEN prefs_Window%
6550WHEN savewords_Window%:PROCsavewords(file$)
6560WHEN display_Window%
6570WHEN words_Window%
6580WHEN main_Window%
6590ENDCASE
6600PROCMenuClose
6610ENDPROC
6620:
6630DEFPROCsavewords(file$)
6640IFsaveformat$<>"print" file=OPENOUTfile$
6650FORI%=1TOwords%:PROCput(word$(I%),0):NEXT
6660IFsaveformat$<>"print" CLOSE#file:OSCLI"SETTYPE "+file$+" Text":wordssaved%=1
6670ENDPROC
6680:
6690DEFPROCsaveown(file$)
6700SWAP dimx,wsqx:SWAP dimy,wsqy:SWAP words%,wsqwords%
6710file=OPENOUTfile$
6720BPUT#file,wsqtitle$:BPUT#file,STR$gaps:BPUT#file,STR$dimx:BPUT#file,STR$dimy
6730BPUT#file,STR$words%
6740FORI%=1TOwords%
6750BPUT#file,word$(I%):BPUT#file,STR$len%(I%)
6760BPUT#file,STR$start%(I%):BPUT#file,STR$dir%(I%)
6770BPUT#file,STR$show%(I%)
6780BPUT#file,STR$sx%(I%):BPUT#file,STR$sy%(I%)
6790BPUT#file,STR$ex%(I%):BPUT#file,STR$ey%(I%)
6800NEXT
6810FORI%=1TOdimx*dimy
6820BPUT#file,grid%(I%)
6830NEXT
6840CLOSE#file
6850OSCLI"SETTYPE "+file$+" 03C"
6860SWAP dimx,wsqx:SWAP dimy,wsqy:SWAP words%,wsqwords%
6870gridsaved%=1:wordssaved%=1
6880ENDPROC
6890:
6900DEFPROCsavesquare
6910IFsaveformat$="own" PROCsaveown(file$):ENDPROC
6920PROCcopyover
6930SWAP dimx,wsqx:SWAP dimy,wsqy:SWAP words%,wsqwords%
6940IFsaveformat$="draw" pad$=CHR$160 ELSE pad$=" "
6950len%=FNlong:b$()="":dummy%=0:IFdbl%=-1 d%=dimx*2 ELSE d%=dimx
6960FORI%=1TOdimy:FORJ%=1TOdimx:dummy%+=1
6970b$(I%)+=CHR$(grid%(dummy%)):IFdbl%=-1 AND J%<>dimx b$(I%)+=pad$
6980NEXT:NEXT
6990dimx+=-(dbl%*dimx):IFdbl%=-1 dimx-=1
7000IFforce%=0 AND words%<=60 c%=1:GOTO7050
7010IF(words%>(4*dimy) OR words%>120) c%=4:GOTO7050
7020IFsaveformat$="draw" AND dimx<(len%*2) c%=1:GOTO7050
7030IFwords%>(1.3*dimy) OR words%>60 c%=2:GOTO7050
7040c%=1
7050IFsaveformat$="imp" PROCtabs
7060IFsaveformat$<>"print" file=OPENOUTfile$:PROCheader
7070IFsaveformat$<>"print" BPUT#file,wsqtitle$:ELSE PROCprinttitle
7080CASE c% OF
7090WHEN 1:PROCformat1
7100WHEN 2:PROCformat2
7110WHEN 4:PROCformat3
7120ENDCASE
7130IFdbl%=-1 AND dimx/2=INT(dimx/2) dimx=dimx/2:ELSE IFdbl%=-1 AND dimx/2<>INT(dimx/2) dimx=INT(dimx/2)+1
7140SWAP dimx,wsqx:SWAP dimy,wsqy:SWAP words%,wsqwords%
7150PROCcopyback
7160IFsaveformat$<>"print" BPUT#file,CHR$10:CLOSE#file:OSCLI"SETTYPE "+file$+" Text" ELSE PRINT
7170gridsaved%=1:wordssaved%=1
7180ENDPROC
7190:
7200DEFPROCsaveprefs
7210PROCgetprefs
7220file=OPENOUT"<WordSq$Dir>.Prefs"
7230BPUT#file,STR$dbl%:BPUT#file,STR$force%:BPUT#file,STR$caps%
7240BPUT#file,STR$col%:BPUT#file,STR$mcol%
7250BPUT#file,STR$wcol%:BPUT#file,STR$lcol%
7260BPUT#file,titlefont$:BPUT#file,STR$titlept%
7270BPUT#file,gridfont$:BPUT#file,STR$gridpt%
7280BPUT#file,wordsfont$:BPUT#file,STR$wordspt%
7290BPUT#file,pre$:BPUT#file,post$
7300BPUT#file,overon$:BPUT#file,overoff$
7310BPUT#file,underon$:BPUT#file,underoff$
7320BPUT#file,emphon$:BPUT#file,emphoff$
7330CLOSE#file
7340ENDPROC
7350:
7360DEFPROCSetIcon(w%,i%)
7370wimp%!0=w%:wimp%!4=i%:wimp%!8=&200000:wimp%!12=0
7380SYS "Wimp_SetIconState",,wimp%
7390ENDPROC
7400:
7410DEFPROCrec(type%)
7420IFwords%<1 dimx=0:dimy=0:ENDPROC
7430IFtype%=2 gaps=25
7440needs%=SUMlen%()
7450a=(1/(1-(gaps/100)))*needs%:dimy=FNround(SQR(a/1.2)):dimx=FNround(a/dimy)
7460IF words%<=120 maxh=60 ELSE maxh=INT(59-((words%-120)/2))
7470len%=FNlong
7480IFlen%>FNmax PROCdrec:ENDPROC
7490IFdimy<3 dimy=3 ELSE IF dimx>40 dimx=40:dimy=FNround(a/40)
7500IFmaxh<dimy dimy=maxh
7510IFFNgaps<10 OR (dimx<len% AND dimy<len%) PROCAlert("WordSq","All of these words will not fit into the largest size grid - you must delete a few, or shorten some of the longer ones.")
7520IFtype%=2 gaps=FNgaps
7530IFgaps<0 gaps=0
7540PROCIconPutText(main_Window%,20,STR$gaps)
7550ENDPROC
7560:
7570DEFPROCdrec
7580I%=0:REPEAT:I%+=1:UNTILI%*len%>a*0.95:dimx=len%:dimy=I%:IFdimy<3 dimy=3
7590IFtype%=2 gaps=FNgaps:PROCIconPutText(main_Window%,20,STR$gaps)
7600ENDPROC
7610:
7620DEFFNlen(dummy$)
7630J%=LENdummy$:FORI%=1TOLENdummy$:C=ASC(MID$(dummy$,I%,1)):IF C<65 OR C>122 OR (C>90 AND C<97) J%-=1
7640NEXT:=J%
7650:
7660DEFFNlong
7670D=0:FORI%=1TOwords%:IFLENword$(I%)>D D=LENword$(I%)
7680NEXT:=D
7690:
7700DEFFNmax
7710IFdimx>dimy =dimx ELSE =dimy
7720:
7730DEFFNround(num)=INT(num+0.5)
7740:
7750DEFPROCaddword
7760w$=FNIconText(main_Window%,26):IFFNlen(w$)<3 PROCAlert("WordSq","Words must be three alphabetical characters long or more."):ENDPROC
7770SYS"Hourglass_On"
7780IFwords%=0 PROCMenuEnable(main_Menu%,2):PROCMenuEnable(main_Menu%,3):PROCMenuEnable(main_Menu%,5):PROCMenuEnable(solve_Menu%,2):PROCMenuEnable(display_Menu%,2)
7790words%+=1:word$(words%)=w$
7800PROCclearall
7810PROCupdatesolvestate:IFcaps% word$(words%)=FNcaps(word$(words%))
7820len%(words%)=FNlen(word$(words%))
7830PROCsort(1)
7840FORI%=1TOwords%:PROCIconPutText(words_Window%,I%+3,word$(I%)):NEXT
7850PROCww
7860PROCrec(2):PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy)
7870IFwords%=1 PROCMenuEnable(words_Menu%,2):IFwordswind%=0 wordswind%=1:PROCBringToTop(words_Window%):PROCMenuTick(solve_Menu%,2):PROCMenuTick(main_Menu%,2):PROCMenuTick(display_Menu%,2)
7880PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCcaret(0)
7890wordssaved%=0
7900SYS"Hourglass_Off"
7910ENDPROC
7920:
7930DEFPROCdeleteword
7940IFselection%=0 ENDPROC
7950IFsolveformat$<>"own" GOTO8020
7960o%=-1:number%=0:FORI%=1TOwords%:IFselected%(I%)=1 AND start%(I%)<>0 AND dir%(I%)<>0 number%+=1:NEXT:ELSE NEXT
7970IFnumber%>0 THEN
7980IFselection%=1 d$="This word forms " ELSE d$=FNoneormore(number%)+"amongst the selection form "
7990o%=FNWindowCancel("WordSq",d$+"part of the current wordsquare. Continuing with this operation will cause the wordsquare to be deleted. Click OK to delete.")
8000ENDIF
8010IFo%=0 ENDPROC ELSE IFo%=-1 AND number%>0 PROCWindowClose(display_Window%):PROCng
8020SYS"Hourglass_On"
8030number%=0:FORI%=1TOwords%:IFselected%(I%)=1 word$(I%)="~~":number%+=1:PROCSetIcon(words_Window%,I%+3):selected%(I%)=0:IFshow%(I%)>0 show%(I%)=0:high%-=1
8040NEXT:selection%=0:PROCsetbutton
8050PROCsort(1):PROCrep(0)
8060FORI%=1TOwords%:PROCIconPutText(words_Window%,I%+3,word$(I%)):NEXT
8070words%-=number%:IFsolveformat$="text" wsqwords%-=number%
8080PROCupdatesolvestate:needs%=SUMlen%()
8090IFwords%=0 THEN
8100PROCMenuDisable(main_Menu%,3):PROCMenuDisable(main_Menu%,2):PROCMenuDisable(solve_Menu%,2):PROCMenuDisable(main_Menu%,5):PROCMenuDisable(display_Menu%,2):PROCWindowClose(words_Window%)
8110PROCMenuTick(main_Menu%,2):PROCMenuTick(solve_Menu%,2):PROCMenuTick(display_Menu%,2)
8120wordswind%=0:wordssaved%=1
8130ENDIF
8140IFwords%>0 wordssaved%=0
8150PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCcaret(0)
8160PROCww:IFdispwind%=1 PROCWindowForceDraw(display_Window%)
8170IFsolveformat$="text" gaps=FNgaps:PROCIconPutText(main_Window%,20,STR$gaps):SYS"Hourglass_Off":ENDPROC
8180gaps=25:PROCIconPutText(main_Window%,20,STR$gaps)
8190PROCrec(2):PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy)
8200SYS"Hourglass_Off"
8210ENDPROC
8220:
8230DEFPROCamendword
8240IFselection%<>1 ENDPROC
8250w$=FNIconText(main_Window%,26):IFFNlen(w$)<3 PROCAlert("WordSq","Words must be three alphabetical characters long or more."):ENDPROC
8260IFsolveformat$="" GOTO8330
8270o%=-1:number%=0:FORI%=1TOwords%:IFselected%(I%)=1 AND start%(I%)<>0 AND dir%(I%)<>0 number%+=1:NEXT:ELSE NEXT
8280IFnumber%>0 THEN
8290IFselection%=1 d$="This word forms " ELSE d$=FNoneormore(number%)+"amongst the selection form "
8300o%=FNWindowCancel("WordSq",d$+"part of the current wordsquare. Continuing with this operation will cause the wordsquare to be deleted. Click OK to amend.")
8310ENDIF
8320IFo%=0 ENDPROC ELSE IFo%=-1 AND number%>0 PROCWindowClose(display_Window%):PROCng
8330SYS"Hourglass_On"
8340FORI%=1TOwords%:IFselected%(I%)=1 dummy%=I%
8350NEXT:word$(dummy%)=FNIconText(main_Window%,26):len%(dummy%)=FNlen(word$(dummy%))
8360PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCcaret(0)
8370PROCSetIcon(words_Window%,dummy%+3)
8380PROCsort(1):FORI%=1TOwords%:PROCIconPutText(words_Window%,I%+3,word$(I%)):NEXT
8390PROCww
8400selected%(dummy%)=0:selection%=0:PROCsetbutton
8410PROCupdatesolvestate
8420PROCrec(2):PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy)
8430wordssaved%=0
8440SYS"Hourglass_Off"
8450ENDPROC
8460:
8470DEFPROCsort(type%)
8480IFtype%=2 type%=1:r%=1 ELSE r%=0
8490P%=words%DIV2:IFP%=0ENDPROC
8500REPEAT:R%=words%-P%:Q%=1
8510REPEAT:W%=Q%
8520REPEAT:U%=W%+P%
8530IFtype%=1ANDword$(W%)<=word$(U%)ef%=1:GOTO8580
8540IFtype%=0ANDlen%(W%)>=len%(U%)ef%=1:GOTO8580
8550SWAPword$(W%),word$(U%)
8560IFr%=0 SWAPlen%(W%),len%(U%):SWAPstart%(W%),start%(U%):SWAPdir%(W%),dir%(U%):SWAPshow%(W%),show%(U%):SWAPsx%(W%),sx%(U%):SWAPsy%(W%),sy%(U%):SWAPex%(W%),ex%(U%):SWAPey%(W%),ey%(U%)
8570W%-=P%
8580UNTILW%<1ORef%=1:ef%=0:Q%+=1
8590UNTILQ%>R%:P%=P%DIV2
8600UNTILP%=0
8610ENDPROC
8620:
8630DEFPROCrep(type%)
8640FORI%=1TOwords%:IFword$(I%)="~~" THEN
8650word$(I%)=""
8660IFtype%=0 len%(I%)=0:start%(I%)=0:dir%(I%)=0:selected%(I%)=0:show%(I%)=0:sx%(I%)=0:sy%(I%)=0:ex%(I%)=0:ey%(I%)=0
8670ENDIF
8680NEXT
8690ENDPROC
8700:
8710DEFPROCbumpx(inc%)
8720IFwords%=0 ENDPROC
8730IFbutton%=1 inc%=-inc%
8740IF (dimx*dimy)<(needs%*1.12) AND inc%=-1 ENDPROC
8750IF (dimx=40 AND inc%>0) OR (dimx=0 AND inc%<0) ENDPROC
8760dimx+=inc%:IF FNgaps<10:dimx-=inc%:ENDPROC
8770PROCIconPutText(main_Window%,12,STR$dimx)
8780gaps=FNgaps:PROCIconPutText(main_Window%,20,STR$gaps)
8790ENDPROC
8800:
8810DEFPROCbumpy(inc%)
8820IFwords%=0 ENDPROC
8830IFbutton%=1 inc%=-inc%
8840IF (dimx*dimy)<(needs%*(1+(gaps/100))) AND inc%=-1 ENDPROC
8850IF (dimy=maxh AND inc%>0) OR (dimy=0 AND inc%<0) ENDPROC
8860dimy+=inc%:IF FNgaps<10:dimy-=inc%:ENDPROC
8870PROCIconPutText(main_Window%,16,STR$dimy)
8880gaps=FNgaps:PROCIconPutText(main_Window%,20,STR$gaps)
8890ENDPROC
8900:
8910DEFPROCbumpgaps(inc%)
8920IFgaps<10 PROCrec(0):ENDPROC
8930IFbutton%=1 inc%=-inc%
8940IF (gaps=10 AND inc%=-1) ENDPROC
8950IF (gaps=maxh AND inc%=1) ENDPROC
8960gaps+=inc%
8970PROCIconPutText(main_Window%,20,STR$gaps)
8980PROCrec(0):PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy)
8990ENDPROC
9000:
9010DEFFNbumppt(inc%,dummy%,d%)
9020IF (dummy%=6 AND inc%=-1) OR (dummy%=24 AND inc%=1):=dummy%
9030IFbutton%=1 inc%=-inc%
9040dummy%+=inc%:PROCIconPutText(prefs_Window%,d%,STR$dummy%+" pt")
9050=dummy%
9060:
9070DEFFNgaps
9080IFdimx*dimy=0 =gaps
9090=FNround((((dimx*dimy)-needs%)/(dimx*dimy))*100)
9100:
9110DEFFNoneormore(dummy%)
9120IF dummy%=1 ="1 word "
9130IF dummy%=0 ="No words "
9140=STR$dummy%+" words "
9150:
9160DEFFNnone(dummy%)
9170IFdummy%=0 ="None " ELSE =STR$dummy%+" "
9180:
9190DEFPROCcreate
9200IF words%<1 PROCAlert("WordSq","There are no words to be placed in a wordsquare!"):ENDPROC
9210d%=0:IFwords%<121 GOTO9250 ELSE:IF(dbl%=0 AND dimx<((len%*2)+1)) OR (dbl%=-1 AND dimx<(len%+1)) THEN
9220IF dbl%=0 d%=(len%*2)+1 ELSE d%=len%+1
9230PROCAlert("WordSq","The number of words means that the grid must be at least "+STR$d%+" characters across. Please reset this value and try again.")
9240ENDIF
9250IFd%>0 ENDPROC
9260wsqtitle$=FNIconText(main_Window%,9)
9270IF(dimx*dimy)<(1.1*needs%) OR (dimx<len% AND dimy<len%) PROCAlert("WordSq","All of these words will not fit into the largest size grid - you must delete a few, or shorten some of the longer ones."):ENDPROC
9280SYS"Hourglass_On"
9290wsqx=dimx:wsqy=dimy
9300not%=0:pla%=0:F%=0:startx%=0:starty%=0
9310grid%()=0:start%()=0:dir%()=0:PROCsort(0)
9320Z%=0:FORI%=1TOwords%:w$=FNstrip(word$(I%))
9330A%=0:tr%=0:F%=0
9340REPEAT:tr%+=1
9350IFINKEY-113 PROCAlert("WordSq","Creation interrupted."):Z%=1
9360A%=RND(dimx*dimy)
9370IF grid%(A%)<>0 AND grid%(A%)<>ASC(LEFT$(w$,1)) GOTO9360
9380PROCends:PROCfit
9390UNTILF%=1 OR Z%=1 OR tr%>=(dimx*dimy)+dimx+dimy
9400IFZ%=1 I%=words%+1:NEXT:PROCng:Z%=0:ENDPROC
9410IFtr%>=(dimx*dimy)+dimx+dimy not%+=1:start%(I%)=0:dir%(I%)=99:ELSE pla%+=1
9420PROCIconPutText(main_Window%,6,"Creating - "+FNoneormore(pla%)+"placed so far.")
9430IFdir%(I%)<>99 PROCpositions(I%,dir%(I%))
9440SYS"Hourglass_Percentage",FNround((pla%+not%)/words%*100)
9450NEXT:PROCgaps:PROCsort(1):PROCIconPutText(main_Window%,6,FNoneormore(pla%)+"placed - "+STR$wsqgaps+"% gaps. ")
9460SYS"Hourglass_Off":wsqwords%=pla%
9470IF pla%=0 PROCAlert("WordSq","In fact, no words could be placed. Try increasing the grid size."):PROCIconPutText(main_Window%,6,"No grid formed."):ENDPROC
9480IFnot%>0 THEN
9490IFnot%=1 d$="It " ELSE d$="They "
9500PROCAlert("WordSq","When creating the wordsquare, "+FNoneormore(not%)+"could not be placed. "+d$+"will remain in memory and appear selected in the word list window, but will not show up on the wordsquare.")
9510PROCclearall:selectedword$="":FORI%=1TOwords%
9520IFdir%(I%)=99 dir%(I%)=0:PROCSetIcon(words_Window%,I%+3):selected%(I%)=1:selection%+=1:selectedword$=word$(I%)
9530NEXT:PROCsetbutton
9540IFselection%=1 d$=selectedword$ ELSE d$=""
9550PROCIconPutText(main_Window%,26,d$):PROCIconPutText(solve_Window%,17,d$):PROCcaret(LENd$/2)
9560ENDIF
9570PROCMenuEnable(main_Menu%,4):PROCMenuEnable(main_Menu%,5):PROCMenuEnable(main_Menu%,6)
9580PROCdisplay:solveformat$="own":PROCupdatesolvestate
9590PROCIconPutText(solve_Window%,5,"Using wordsquare from creator program.")
9600IFsolvewind% PROCBringToTop(display_Window%)
9610wsqx=dimx:wsqy=dimy:gridsaved%=0
9620ENDPROC
9630:
9640DEFFNcaps(d$)
9650LOCALK%
9660IFLENd$=0 =""
9670FORK%=1TOLENd$:ch%=ASC(MID$(d$,K%,1))
9680IFch%>96 AND ch%<123 MID$(d$,K%,1)=CHR$(ch%AND223)
9690NEXT
9700=d$
9710:
9720DEFPROCends
9730po=A%:po-=1:REPEAT:po+=1:UNTILINT(po/dimx)=po/dimx:me%=po:mw%=me%-(dimx-1)
9740ENDPROC
9750:
9760DEFPROCfit
9770L%=LENw$-1
9780IFA%-L%>=mw% AND A%-(dimx*L%)>=1 PROCfill(-1,-dimx):dir%(I%)=8:IF F% ENDPROC
9790IFA%-L%>=mw% AND A%+(dimx*L%)<=dimx*dimy PROCfill(-1,dimx):dir%(I%)=6:IF F% ENDPROC
9800IFA%+L%<=me% AND A%+(dimx*L%)<=dimx*dimy PROCfill(1,dimx):dir%(I%)=4:IF F% ENDPROC
9810IFA%+L%<=me% AND A%-(dimx*L%)>=1 PROCfill(1,-dimx):dir%(I%)=2:IF F% ENDPROC
9820IFA%-L%>=mw% PROCfill(-1,0):dir%(I%)=7:IF F% ENDPROC
9830IFA%-(dimx*L%)>=1 PROCfill(0,-dimx):dir%(I%)=1:IF F% ENDPROC
9840IFA%+(dimx*L%)<=dimx*dimy PROCfill(0,dimx):dir%(I%)=5:IF F% ENDPROC
9850IFA%+L%<=me%:PROCfill(1,0):dir%(I%)=3:IF F% ENDPROC
9860ENDPROC
9870:
9880DEFPROCfill(x,y)
9890p%=A%:FORK%=2TOLENw$:p%+=(x+y)
9900IFgrid%(p%)<>ASC(MID$(w$,K%,1))AND grid%(p%)<>0 K%=LENw$+1:NEXT:ENDPROC
9910NEXT
9920start%(I%)=A%
9930p%=A%:FORK%=1TOLENw$:grid%(p%)=ASC(MID$(w$,K%,1)):p%+=(x+y):NEXT:F%=1
9940ENDPROC
9950:
9960DEFPROCgaps
9970wsqgaps=0:FORI%=1TOdimx*dimy:IFgrid%(I%)=0 grid%(I%)=RND(26)+64:wsqgaps+=1
9980NEXT:wsqgaps=FNround((wsqgaps/(dimx*dimy))*100)
9990ENDPROC
10000:
10010DEFPROCformat1
10020FORI%=1TOwords%
10030IFI%=1 PROCunder ELSE IFI%=dimy+1 PROCover:GOTO10070
10040IFsaveformat$="draw" BPUT#file,"\1";:ELSEIFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10050IFI%<=dimy PROCput(b$(I%),1):ELSE IFsaveformat$<>"imp" PROCput(FNpad(dimx),1)
10060IFsaveformat$="draw" BPUT#file,"\2";:ELSEIFsaveformat$="imp" BPUT#file,"{""Words"" on}";
10070PROCput(FNpad(3),1)
10080PROCput(word$(I%),0):NEXT
10090IFwords%=dimy PROCover:ENDPROC:ELSEIF words%>=dimy ENDPROC
10100FORI%=words%+1 TO dimy:IFsaveformat$="draw" BPUT#file,"\1";:ELSEIFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10110PROCput(b$(I%),0):NEXT
10120ENDPROC
10130ENDPROC
10140:
10150DEFPROCformat2
10160IFINT(words%/2)<>words%/2 C1=INT(words%/2)+1:C2=words%-C1:ELSE C1=words%/2:C2=C1
10170FORI%=1TOC1
10180IFI%=1 PROCunder ELSE IFI%=dimy+1 PROCover:GOTO10220
10190IFsaveformat$="draw" BPUT#file,"\1";:ELSE IFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10200IFI%<=dimy PROCput(b$(I%),1):ELSE IFsaveformat$<>"imp" PROCput(FNpad(dimx),1)
10210IFsaveformat$="draw" BPUT#file,"\2";:ELSE IFsaveformat$="imp" BPUT#file,"{""Words"" on}";
10220PROCput(FNpad(3),1):PROCput(word$(I%),1):PROCput(FNpad(len%-LENword$(I%)+1),1):PROCput(word$(C1+I%),0):NEXT
10230IFC1=dimy PROCover:ENDPROC:ELSEIF C1>=dimy ENDPROC
10240IFsaveformat$="draw" BPUT#file,"\1";:ELSE IFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10250FORI%=C1+1 TO dimy:PROCput(b$(I%),0):NEXT
10260PROCover
10270ENDPROC
10280:
10290DEFPROCformat3
10300C%=words%-((dimy+1)*2):D%=C%+1:REPEAT:D%-=1:UNTILINT(D%/4)=D%/4:E%=C%-D%
10310IF E%=0:E%=4:C1=D%/4:C2=C1:C3=C1:C4=C3
10320IF E%=1:C1=(D%/4)+1:C2=D%/4:C3=C2:C4=C3
10330IF E%=2:C1=(D%/4)+1:C2=(D%/4)+1:C3=D%/4:C4=C3
10340IF E%=3:C1=(D%/4)+1:C2=(D%/4)+1:C3=(D%/4)+1:C4=D%/4
10350FORI%=1TOdimy
10360IFI%=1PROCunder
10370IFsaveformat$="draw" BPUT#file,"\1";:ELSE IFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10380PROCput(b$(I%),1):PROCput(FNpad(3),1):IFsaveformat$="draw" BPUT#file,"\2";:ELSE IFsaveformat$="imp" BPUT#file,"{""Words"" on}";
10390PROCput(word$(C1+C2+I%),1):PROCput(FNpad(len%+1-LENword$(C1+C2+I%)),1):PROCput(word$(dimy+C1+C2+C3+1+I%),0):NEXT
10400IFsaveformat$="draw" BPUT#file,"\1";:ELSE IFsaveformat$="imp" BPUT#file,"{""Grid"" on}";
10410PROCover:PROCput(FNpad(3),1)
10420IFsaveformat$="draw" BPUT#file,"\2";:ELSE IFsaveformat$="imp" BPUT#file,"{""Words"" on}";
10430PROCput(word$(dimy+C1+C2+1),1):PROCput(FNpad(len%+1-LENword$(dimy+C1+C2+1)),1):PROCput(word$(dimy+dimy+C1+C2+C3+2),0)
10440FORI%=1TOC1
10450IFsaveformat$="draw" BPUT#file,"\2";:ELSE IFsaveformat$="imp" BPUT#file,"{""Words"" on}";
10460PROCput(word$(I%),1):PROCput(FNpad(len%+1-LENword$(I%)),1)
10470IFI%<C1 OR (I%=C1 AND E%>=2) PROCput(word$(C1+I%),1):PROCput(FNpad(dimx+3-(len%+1-LENword$(I%)+LENword$(I%)+LENword$(C1+I%))),1)
10480IFI%<C1 OR (I%=C1 AND E%>=3) PROCput(word$(dimy+C1+C2+1+I%),1):PROCput(FNpad(len%+1-LENword$(dimy+C1+C2+1+I%)),1)
10490IFI%<C1 OR (I%=C1 AND E%>=4) PROCput(word$(dimy+dimy+C1+C2+C3+2+I%),0)
10500NEXT
10510ENDPROC
10520:
10530DEFPROCtabs
10540case%=FNcase
10550IFcase%=0 a=2.7:b=0.44 ELSE a=4:b=0.65
10560CASE c% OF
10570WHEN 1:t1%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:tab$="tabs "+STR$t1%+"pt"
10580WHEN 2:t1%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:t2%=t1%+5+(len%*(a+((wordspt%-6)*b))):tab$="tabs "+STR$t1%+"pt,"+STR$t2%+"pt"
10590WHEN 4:t1%=15+(len%*(a+((wordspt%-6)*b))):t2%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:t3%=t2%+15+(len%*(a+((wordspt%-6)*b))):tab$="tabs "+STR$t1%+"pt,"+STR$t2%+"pt,"+STR$t3%+"pt"
10600ENDCASE
10610ENDPROC
10620:
10630DEFPROCheader
10640CASE saveformat$ OF
10650WHEN "text"
10660WHEN "draw":header$="\! 1"+CHR$10+"\F 0 "+titlefont$+" "+STR$titlept%+CHR$10+"\F 1 "+gridfont$+" "+STR$gridpt%+CHR$10+"\F 2 "+wordsfont$+" "+STR$wordspt%+CHR$10+"\L"+STR$(FNround(gridpt%*1.08))+CHR$10
10670header$+="\P"+STR$(FNround((gridpt%*1.08)/1.75))+CHR$10+"\0"
10680BPUT#file,header$
10690WHEN "imp":header$="{define style ""Title"";font "+titlefont$+";fontsize "+STR$titlept%+"pt;"+tab$+"}{define style ""Grid"";font "+gridfont$+";fontsize "+STR$gridpt%+"pt;"+tab$+"}"
10700header$+="{define style ""Words"";font "+wordsfont$+";fontsize "+STR$wordspt%+"pt;"+tab$+"}{""Title"" on}"
10710BPUT#file,header$;
10720ENDCASE
10730ENDPROC
10740:
10750DEFFNpad(d%)
10760IF saveformat$="imp" ="{tab}"
10770IF saveformat$="draw" =STRING$(d%,CHR$160)
10780=STRING$(d%," ")
10790:
10800DEFPROCput(d$,d%)
10810IFsaveformat$="print" PRINTd$;:IFd%=0 PRINT
10820IFsaveformat$<>"print" BPUT#file,d$;:IFd%=0 BPUT#file,""
10830ENDPROC
10840:
10850DEFPROCover
10860IFsaveformat$="draw" a$="\1":b$=FNpad(dimx):c$="\2"
10870IFsaveformat$="imp" THEN
10880IFc%=4 b$="{tab}" ELSE b$=""
10890a$="{""Grid"" on}":c$="{""Words"" on}"
10900ENDIF
10910IFsaveformat$="text" a$="":b$=FNpad(dimx):c$=""
10920IFsaveformat$<>"print" OR overon$="" OR overoff$="" PROCput(a$+b$+c$,1):ENDPROC
10930PROCgetecho(overon$):PROCput(FNpad(dimx),1):PROCgetecho(overoff$)
10940ENDPROC
10950:
10960DEFPROCunder
10970IFsaveformat$<>"print" OR underon$="" OR underoff$="" PROCput("",0):ENDPROC
10980PROCgetecho(underon$):PROCput(FNpad(dimx),0):PROCgetecho(underoff$)
10990ENDPROC
11000:
11010DEFPROCpre
11020IFsaveformat$<>"print" OR pre$="" ENDPROC
11030PROCgetecho(pre$)
11040ENDPROC
11050:
11060DEFPROCpost
11070IFsaveformat$<>"print" OR post$="" ENDPROC
11080PROCgetecho(post$)
11090ENDPROC
11100:
11110DEFPROCprinttitle
11120IFemphon$="" OR emphoff$="" PRINTwsqtitle$:ENDPROC
11130PROCgetecho(emphon$):PRINTwsqtitle$:PROCgetecho(emphoff$)
11140ENDPROC
11150:
11160DEFPROCgetecho(d$)
11170d%=1
11180FORK%=1TOLENd$:dummy$="":IFMID$(d$,K%,1)="," dummy$=MID$(d$,d%,K%-d%):d%=K%+1:ELSE IF K%=LENd$ dummy$=MID$(d$,d%,K%-d%+1)
11190IFdummy$<>"" PRINTCHR$1;CHR$VALdummy$;
11200NEXT
11210ENDPROC
11220:
11230DEFPROCcaret(c%)
11240IFc%>1000 AND solvewind% c%-=1000:PROCIconCaret(solve_Window%,17,c%):ENDPROC ELSE IFc%>1000 ENDPROC
11250IFsolvewind% PROCIconCaret(solve_Window%,17,c%)
11260IFmainwind% AND solveformat$<>"text" PROCIconCaret(main_Window%,26,c%)
11270ENDPROC
11280:
11290DEFFNnew(extra$)
11300message$="You have not saved your ":IFwordssaved%=0 message$+="words":IFgridsaved%=0 message$+=" or"
11310IFgridsaved%=0 message$+=" grid. " ELSE message$+=". "
11320message$+="Are you sure you want to "+extra$+"?"
11330IFwordssaved%=1 AND gridsaved%=1 message$=""
11340IF message$<>"":IFFNWindowCancel("WordSq",message$)=0 =0
11350=1
11360:
11370DEFPROCreset
11380SYS"Hourglass_On"
11390PROCcloseall
11400selection%=0:word$()="":grid%()=0:start%()=0:dir%()=0:len%()=0:PROCsetbutton
11410words%=0:gaps=25:dimx=0:dimy=0:solveformat$="":high%=0:show%()=0
11420sx%()=0:sy%()=0:ex%()=0:ey%()=0:show%=0:found%=0:done%=0
11430wsqx=0:wsqy=0:wsqwords%=0:wordssaved%=1:gridsaved%=1:startx%=0:starty%=0
11440RESTORE:FORI%=1TO10:READd%:PROCIconEnable(main_Window%,d%):NEXT
11450PROCIconPutText(main_Window%,5,"No words entered."):PROCIconPutText(main_Window%,6,"No grid formed.")
11460PROCIconPutText(main_Window%,12,STR$dimx):PROCIconPutText(main_Window%,16,STR$dimy):PROCIconPutText(main_Window%,20,STR$gaps)
11470PROCIconPutText(solve_Window%,5,"No wordsquare currently available."):PROCIconPutText(solve_Window%,6,"No words available - None shown.")
11480PROCIconPutText(main_Window%,26,""):PROCIconPutText(solve_Window%,17,""):PROCIconPutText(main_Window%,9,"<Untitled>")
11490FORI%=4 TO 171:PROCIconPutText(words_Window%,I%,""):PROCsic(words_Window%,I%,7):IFselected%(I%-3)=1 selected%(I%-3)=0:PROCSetIcon(words_Window%,I%):NEXT:ELSE NEXT
11500PROCww
11510IFwordswind%=1 PROCMenuTick(display_Menu%,2):PROCMenuTick(main_Menu%,2):PROCMenuTick(solve_Menu%,2)
11520PROCMenuDisable(main_Menu%,2):PROCMenuDisable(main_Menu%,3):PROCMenuDisable(main_Menu%,4):PROCMenuDisable(main_Menu%,5):PROCMenuDisable(display_Menu%,2)
11530PROCMenuDisable(solve_Menu%,2)
11540PROCMenuDisable(words_Menu%,2)
11550selected%()=0:mainwind%=0:solvewind%=0:dispwind%=0
11560SYS"Hourglass_Off"
11570ENDPROC
11580:
11590DEFPROCng
11600grid%()=0:start%()=0:dir%()=0:solveformat$="":high%=0:show%()=0
11610wsqx=0:wsqy=0:wsqwords%=0:gridsaved%=1:show%=0:found%=0:done%=0
11620PROCIconPutText(main_Window%,6,"No grid formed.")
11630PROCIconPutText(solve_Window%,5,"No wordsquare currently available."):PROCIconPutText(solve_Window%,6,"No words available - None shown.")
11640PROCMenuDisable(main_Menu%,4):PROCMenuDisable(main_Menu%,5):PROCMenuDisable(main_Menu%,6)
11650FORI%=4TO171:PROCsic(words_Window%,I%,7):NEXT
11660IFZ%=1 SYS"Hourglass_On":PROCsort(1):SYS"Hourglass_Off":ENDPROC
11670gaps=25:dimx=0:dimy=0
11680PROCIconPutText(main_Window%,20,STR$gaps)
11690ENDPROC
11700:
11710DEFPROCcloseall
11720PROCWindowClose(display_Window%):PROCWindowClose(main_Window%):PROCWindowClose(solve_Window%):PROCWindowClose(words_Window%):PROCWindowClose(prefs_Window%)
11730wordswind%=0:solvewind%=0:dispwind%=0
11740ENDPROC
11750:
11760DEFPROCdisplay
11770dummy%=0:FORI%=1TOdimy:dummy$="":FORJ%=1TOdimx:dummy%+=1
11780dummy$+=CHR$(grid%(dummy%)):IFJ%<>dimx dummy$+=" "
11790NEXT:IFLENdummy$<79 dummy$+=STRING$(79-LENdummy$," ")
11800PROCIconPutText(display_Window%,I%+1,dummy$):NEXT
11810IFdimy<60 FORI%=dimy+1TO60:PROCIconPutText(display_Window%,I%+1,STRING$(79," ")):NEXT
11820PROCresize(display_Window%,0,-84-(dimy*44),54+(dimx*32),0)
11830ENDPROC
11840:
11850DEFPROCupdatesolvestate
11860CASE solveformat$ OF
11870WHEN "own"
11880wordstatus$=FNoneormore(wsqwords%)+"in the grid - "+FNnone(high%)+"shown - "+FNnone(selection%)+"selected.":PROCIconPutText(solve_Window%,6,wordstatus$)
11890wordstatus$=FNoneormore(words%)+"entered - "+FNnone(selection%)+"selected.":PROCIconPutText(main_Window%,5,wordstatus$)
11900WHEN "text"
11910wordstatus$=FNoneormore(wsqwords%)+"in the grid - "+FNnone(high%)+"shown - "+FNnone(selection%)+"selected.":PROCIconPutText(solve_Window%,6,wordstatus$)
11920wordstatus$=FNoneormore(wsqwords%)+"found - "+FNnone(selection%)+"selected.":PROCIconPutText(main_Window%,5,wordstatus$)
11930WHEN ""
11940wordstatus$=FNoneormore(words%)+"entered - "+FNnone(selection%)+"selected.":PROCIconPutText(main_Window%,5,wordstatus$)
11950ENDCASE
11960ENDPROC
11970:
11980DEFPROCsetbutton
11990IFselection%<2 d$=" Word" ELSE d$=" Selection"
12000PROCIconPutText(main_Window%,25,"Delete"+d$)
12010PROCIconPutText(solve_Window%,8,"Remove"+d$)
12020PROCIconPutText(solve_Window%,9,"Show"+d$)
12030ENDPROC
12040:
12050DEFPROCfind(d$)
12060SYS"Hourglass_On"
12070w$=FNstrip(d$)
12080F%=0:I%=words%+1
12090FORA%=1TOdimx*dimy
12100SYS"Hourglass_Percentage",A%/(dimx*dimy)*100
12110IFgrid%(A%)=ASCLEFT$(d$,1) PROCnextstep
12120NEXT
12130SYS"Hourglass_Off"
12140IFF%=0 PROCAlert("WordSq","The word '"+d$+"' does not exist in the currently loaded wordsquare."):ENDPROC
12150IFF%>1 AND FNpalindrome(d$)=0 PROCAlert("WordSq","More than one occurrence of "+gibbet$+" has been found, so it will be ignored"):ENDPROC
12160SYS"Hourglass_On"
12170d$=FNIconText(solve_Window%,17):IFcaps%=-1 d$=FNcaps(d$)
12180words%+=1:wsqwords%+=1:word$(words%)=d$:len%(words%)=FNlen(d$):dir%(words%)=d%:needs%=SUMlen%():gaps=FNgaps
12190PROCpositions(words%,dir%(words%))
12200high%+=1:show%(words%)=1:PROCsort(1):FORI%=1TOwords%:PROCIconPutText(words_Window%,I%+3,word$(I%)):NEXT
12210PROCww
12220need%=1:wordssaved%=0
12230SYS"Hourglass_Off"
12240ENDPROC
12250:
12260DEFPROCnextstep
12270PROCends:L%=LENd$-1
12280IFA%-L%>=mw%ANDA%-(dimx*L%)>=1:dir%(I%)=8:PROCgetstring(-1,-dimx)
12290IFA%-L%>=mw%ANDA%+(dimx*L%)<=dimx*dimy:dir%(I%)=6:PROCgetstring(-1,dimx)
12300IFA%+L%<=me% AND A%+(dimx*L%)<=dimx*dimy:dir%(I%)=4:PROCgetstring(1,dimx)
12310IFA%+L%<=me% AND A%-(dimx*L%)>=1:dir%(I%)=2:PROCgetstring(1,-dimx)
12320IFA%-L%>=mw%:dir%(I%)=7:PROCgetstring(-1,0)
12330IFA%-(dimx*L%)>=1:dir%(I%)=1:PROCgetstring(0,-dimx)
12340IFA%+(dimx*L%)<=dimx*dimy:dir%(I%)=5:PROCgetstring(0,dimx)
12350IFA%+L%<=me%:dir%(I%)=3:PROCgetstring(1,0)
12360ENDPROC
12370:
12380DEFPROCgetstring(x,y)
12390dummy$=LEFT$(d$,1):p%=A%:FORJ%=2TOLENd$:p%+=x+y:dummy$+=CHR$grid%(p%):NEXT
12400IF dummy$=d$ F%+=1:start%(I%)=A%:d%=dir%(I%)
12410ENDPROC
12420:
12430DEFFNexists(d$)
12440SYS"Hourglass_On"
12450e%=0:FORW%=1TOwords%:IF d$=FNstrip(FNcaps(word$(W%))) e%=W%
12460NEXT
12470SYS"Hourglass_Off"
12480=e%
12490:
12500DEFFNpalindrome(o$)
12510dummy$="":FORo%=LENo$TO1 STEP-1:dummy$+=MID$(o$,o%,1):NEXT
12520IFo$=dummy$ =1 ELSE =0
12530:
12540DEFPROCcopyover
12550temp$()=""
12560FORI%=1TOwords%:temp$(I%)=word$(I%)
12570IFstart%(I%)=0 AND dir%(I%)=0 word$(I%)="~~"
12580NEXT:PROCsort(2):PROCrep(1)
12590ENDPROC
12600:
12610DEFPROCcopyback
12620word$()=""
12630FORI%=1TOwords%:SWAPtemp$(I%),word$(I%):NEXT
12640ENDPROC
12650:
12660DEFPROCautoload
12670SYS "OS_GetEnv" TO d$
12680d$=RIGHT$(d$,LENd$-20)
12690WHILE LEFT$(d$,1)<>" " AND LENd$<>0
12700d$=RIGHT$(d$,LENd$-1)
12710ENDWHILE
12720IFd$=" " d$=""
12730ENDPROC
12740:
12750DEFPROCcrossout(d%)
12760xpos%=x_origin%+14:ypos%=y_origin%-((d%-2)*36)-252+6
12770MOVE xpos%,ypos%:DRAW xpos%+(len%(d%)*16)+2,ypos%
12780ENDPROC
12790:
12800DEFPROCsic(w%,i%,c%)
12810!wimp%=w%:wimp%!4=i%:wimp%!8=c%<<24:wimp%!12=&0F000000
12820SYS"Wimp_SetIconState",0,wimp%
12830ENDPROC
12840:
12850DEFPROCsib(w%,i%,c%)
12860!wimp%=w%:wimp%!4=i%:wimp%!8=c%<<28:wimp%!12=&F0000000
12870SYS"Wimp_SetIconState",0,wimp%
12880ENDPROC
12890:
12900DEFFNgetword(startpos%,endpos%)
12910A%=startpos%:SWAPwsqx,dimx:SWAPwsqy,dimy:PROCends:SWAPwsqx,dimx:SWAPwsqy,dimy
12920scol%=startpos%MODwsqx:IFscol%=0 scol%=wsqx
12930ecol%=endpos%MODwsqx:IFecol%=0 ecol%=wsqx
12940srow%=((startpos%-1)DIVwsqx):erow%=((endpos%-1)DIVwsqx)
12950IFsrow%>erow% AND scol%=ecol% dx%=0:dy%=-wsqx:GOTO13030
12960IFsrow%>erow% AND scol%<ecol% dx%=1:dy%=-wsqx:GOTO13030
12970IFsrow%=erow% AND scol%<ecol% dx%=1:dy%=0:GOTO13030
12980IFsrow%<erow% AND scol%<ecol% dx%=1:dy%=wsqx:GOTO13030
12990IFsrow%<erow% AND scol%=ecol% dx%=0:dy%=wsqx:GOTO13030
13000IFsrow%<erow% AND scol%>ecol% dx%=-1:dy%=wsqx:GOTO13030
13010IFsrow%=erow% AND scol%>ecol% dx%=-1:dy%=0:GOTO13030
13020IFsrow%>erow% AND scol%>ecol% dx%=-1:dy%=-wsqx
13030dummy$="":p%=startpos%:o%=0
13040REPEAT
13050dummy$+=CHR$grid%(p%)
13060p%+=dx%+dy%
13070IFp%=endpos% o%=1:dummy$+=CHR$grid%(p%):p%=-1
13080UNTIL p%<0 OR p%>(wsqx*wsqy)
13090IFo%=1 ANDLENdummy$<19 AND LENdummy$>2 =dummy$ ELSE =""
13100:
13110DEFFNstrip(o$)
13120c$=FNcaps(o$):o%=LENc$:o$="":FORJ%=1TOo%:e$=MID$(c$,J%,1):IFe$<="Z"ANDe$>="A" o$+=e$
13130NEXT
13140=o$
13150:
13160DEFPROCpositions(d%,dir%)
13170IFstart%(d%)MODwsqx=0 xpos%=wsqx-1 ELSE xpos%=(start%(d%)MODwsqx)-1
13180ypos%=(start%(d%)DIVwsqx)
13190IFstart%(d%)/wsqx=INT(start%(d%)/wsqx) ypos%-=1
13200xpos%=(xpos%*32)+25:ypos%=(ypos%*44)+68
13210CASE dir% OF
13220WHEN 1:dx%=0:dy%=44
13230WHEN 2:dx%=32:dy%=44
13240WHEN 3:dx%=32:dy%=0
13250WHEN 4:dx%=32:dy%=-44
13260WHEN 5:dx%=0:dy%=-44
13270WHEN 6:dx%=-32:dy%=-44
13280WHEN 7:dx%=-32:dy%=0
13290WHEN 8:dx%=-32:dy%=44
13300ENDCASE
13310dy%=-dy%
13320sx%(d%)=xpos%:sy%(d%)=ypos%:ex%(d%)=xpos%+((len%(d%)-1)*dx%):ey%(d%)=ypos%+((len%(d%)-1)*dy%)
13330ENDPROC
13340:
13350DEFFNcase
13360d%=0
13370FORI%=1TOwords%:FORJ%=1TOLENword$(I%):d$=MID$(word$(I%),J%,1):IF d$>="A" AND d$<="Z" d%+=1
13380NEXT:NEXT
13390IFd%>(words%*2.5) =1 ELSE =0
13400:
13410DEFFNorigin
13420=16+wimp%!4-wimp%!20-18
13430:
13440DATA 11,13,15,17,19,21,24,26,28,29
13450:
13460DEFPROCAlert(title$,message$)
13470PROCAlertBox(title$,message$,0)
13480ENDPROC
13490:
13500DEFPROCAlertBox(title$,message$,button%)
13510LOCALresponse%:$(wimp%+4)=message$:CASE button% OF
13520WHEN 1:response%=15
13530WHEN 2:response%=1
13540WHEN 3:response%=(1<<5)+16
13550WHEN 4:response%=(1<<6)+16
13560OTHERWISE:response%=16
13570ENDCASE
13580SYS "Wimp_ReportError",wimp%,response%,title$ TO ,response%
13590ENDPROC
13600:
13610DEFFNWindowCancel(title$,message$)
13620$(wimp%+4)=message$:response%=23
13630SYS "Wimp_ReportError",wimp%,response%,title$ TO ,response%
13640=response%-2
13650:
13660DEFFNWindowTitle(window%)
13670wimp%!0=window%
13680SYS "Wimp_GetWindInfo",,wimp%
13690IF ((wimp%!60)AND&100)=0 ERROR 1,"Title isn't indirected"
13700=$(wimp%!76)
13710:
13720DEFFNWindowLoad(window$)
13730=FNWindowLoadFrom(window$,"<WordSq$Dir>.Templates")
13740:
13750DEFFNWindowLoadFrom(window$,template$)
13760LOCAL c%,i%,n%,j%,sp$,sp2$
13770SYS "Wimp_OpenTemplate",,template$
13780SYS "Wimp_LoadTemplate",,wimp%,icons%,icon_memory%,-1,window$,0 TO ,,icons%
13790CASE sprites% OF
13800WHEN 1:wimp%!64=sprites%
13810OTHERWISE:wimp%!64=sprites%
13820ENDCASE
13830SYS "Wimp_CreateWindow",,wimp% TO c%
13840SYS "Wimp_CloseTemplate"
13850SYS "Wimp_WhichIcon",c%,wimp%+40,1+2+(1<<8),2+(1<<8)
13860CASE wimp%!40 OF
13870WHEN -1
13880OTHERWISE:i%=40
13890REPEAT
13900wimp%!4=wimp%!i%:wimp%!0=c%
13910SYS "Wimp_GetIconState",,wimp%
13920sp$=FNGetStringAtAddress(wimp%!28)
13930SYS "Wimp_DeleteIcon",,wimp%
13940CASE sprites% OF
13950WHEN 1:wimp%!32=1
13960OTHERWISE
13970SYS "OS_SpriteOp",&108,sprites% TO ,,,n%
13980j%=0
13990REPEAT:j%+=1
14000SYS "OS_SpriteOp",&10D,sprites%,pointer_block%,20,j%
14010sp2$=FNGetStringAtAddress(pointer_block%)
14020UNTIL j%=n% OR sp$=sp2$
14030IF sp$=sp2$ THEN wimp%!32=sprites% ELSE wimp%!32=1
14040ENDCASE
14050wimp%!4=c%
14060SYS "Wimp_CreateIcon",,wimp%+4 TO handle%
14070i%+=4
14080UNTIL (wimp%!i%)=-1
14090ENDCASE
14100=c%
14110:
14120DEFPROCBringToTop(window%)
14130!wimp%=window%
14140SYS "Wimp_GetWindowState",,wimp%
14150wimp%!28=-1
14160SYS "Wimp_OpenWindow",,wimp%
14170IFwindow%=display_Window% dispwind%=1
14180ENDPROC
14190:
14200DEFPROCWindowClose(window%)
14210!wimp%=window%
14220SYS "Wimp_CloseWindow",,wimp%
14230IFwindow%=display_Window% dispwind%=0
14240ENDPROC
14250:
14260DEFPROCWindowForceDraw(window%)
14270CASE window% OF
14280WHEN -1:SYS "Wimp_ForceRedraw",-1,0,0,2*1280,2*1024
14290OTHERWISE:SYS "Wimp_ForceRedraw",window%,0,-2*1024,2*1280,0
14300ENDCASE
14310ENDPROC
14320:
14330DEFPROCWindowOpen(window%)
14340!wimp%=window%
14350SYS "Wimp_GetWindowState",,wimp%
14360SYS "Wimp_OpenWindow",,wimp%
14370ENDPROC
14380:
14390PROCWindowInterface
14400SYS"Wimp_BorderWindow",,wimp%
14410ENDPROC
14420:
14430DEFFNIconBar(Sprite$)
14440LOCAL icon%
14450wimp%!0=-1
14460wimp%!4=0:wimp%!8=0
14470wimp%!12=68:wimp%!16=68
14480wimp%!20=&3002
14490$(wimp%+24)=Sprite$
14500SYS "Wimp_CreateIcon",,wimp% TO icon%
14510=icon%
14520:
14530DEFPROCIconCaret(window%,icon%,chars%)
14540SYS "Wimp_SetCaretPosition",window%,icon%,,,-1,chars%
14550ENDPROC
14560:
14570DEFFNIconText(window%,icon%)
14580wimp%!0=window%:wimp%!4=icon%
14590SYS "Wimp_GetIconState",,wimp%
14600IF ((wimp%!24) AND &100)=0 ERROR 1,"Icon "+STR$icon%+" in window "+STR$window%+" isn't indirected"
14610=$(wimp%!28)
14620:
14630DEFFNIconValidation(window%,icon%)
14640wimp%!0=window%:wimp%!4=icon%
14650SYS "Wimp_GetIconState",,wimp%
14660IF ((wimp%!24) AND &100)=0 ERROR 1,"Icon "+STR$icon%+" in window "+STR$window%+" isn't indirected"
14670=$(wimp%!32)
14680:
14690DEFPROCIconDisable(window%,icon%)
14700wimp%!0=window%:wimp%!4=icon%
14710wimp%!8=1<<22:wimp%!12=1<<22
14720SYS "Wimp_SetIconState",,wimp%
14730ENDPROC
14740:
14750DEFPROCIconEnable(window%,icon%)
14760wimp%!0=window%:wimp%!4=icon%
14770wimp%!8=0:wimp%!12=1<<22
14780SYS "Wimp_SetIconState",,wimp%
14790ENDPROC
14800:
14810DEFFNIconPutSprite(window%,icon%,sprite$)
14820wimp%!0=window%:wimp%!4=icon%
14830SYS "Wimp_GetIconState",,wimp%
14840SYS "Wimp_DeleteIcon",,wimp%
14850wimp%!4=wimp%!8:wimp%!8=wimp%!12:wimp%!12=wimp%!16
14860wimp%!16=wimp%!20:wimp%!20=wimp%!24:$(wimp%+24)=sprite$
14870SYS "Wimp_CreateIcon",,wimp% TO icon%
14880=icon%
14890:
14900DEFPROCIconPutText(window%,icon%,text$)
14910wimp%!0=window% : wimp%!4=icon%
14920SYS "Wimp_GetIconState",,wimp%
14930IF ((wimp%!24) AND &100)=0 ERROR 1,"Icon "+STR$icon%+" in window "+STR$window%+" isn't indirected"
14940$(wimp%!28)=text$
14950wimp%!0=window%:wimp%!4=icon%
14960wimp%!8=0:wimp%!12=0
14970SYS "Wimp_SetIconState",,wimp%
14980ENDPROC
14990:
15000DEFPROCIconInterfaceStart
15010SYS"Wimp_BorderIcon",,wimp%
15020ENDPROC
15030:
15040DEFPROCIconInterfaceFinish
15050wimp%!8=0
15060SYS"Wimp_BorderIcon",,wimp%
15070ENDPROC
15080:
15090DEFPROCMenuAdjustOn(menu%)
15100SYS "Wimp_GetPointerInfo",,pointer_block%
15110IF ((pointer_block%!8)AND1)=1 THEN SYS "Wimp_CreateMenu",,menu%,pointer_block%!0,pointer_block%!4
15120ENDPROC
15130:
15140DEFFNMenuChoice(level%)
15150=(wimp%!(4*level%))+1
15160:
15170DEFFNMenuCreate(menu$)
15180IF menu$="Colours" THEN=FNMenuCreateColours(" ")
15190LOCAL menu%,index%,width%,length%,k%,s%
15200DIM menu% 28+FNMenuNoOfEntries(menu$)*24
15210menu%?12=7:menu%?13=2:menu%?14=7:menu%?15=0
15220menu%!16=140:menu%!20=44:menu%!24=0
15230index%=menu%+28
15240$menu%=LEFT$(menu$,INSTR(menu$,"\")-1)
15250width%=LEN(LEFT$(menu$,INSTR(menu$,"\")-1))
15260menu$+="\":Menu_NoOfEntries%=0
15270WHILE menu$<>""
15280menu$=MID$(menu$,INSTR(menu$,"\")+1)
15290CASE menu$ OF
15300WHEN ""
15310OTHERWISE
15320!index%=0:index%!4=-1:index%!8=&7000021
15330length%=INSTR(menu$,"\")-1
15340k%=INSTR(LEFT$(menu$,length%),">")
15350CASE k% OF
15360WHEN 0
15370OTHERWISE
15380s%=EVAL(MID$(menu$,k%+1,length%-k%))
15390index%!4=s%
15400length%=k%-1
15410ENDCASE
15420$(index%+12)=LEFT$(menu$,length%)
15430IF length%>width% THEN width%=length%
15440index%+=24
15450ENDCASE
15460ENDWHILE
15470menu%!16=16*(width%+1)
15480index%!-24=index%!-24 OR &80:=menu%
15490:
15500DEFFNMenuNoOfEntries(menu$)
15510LOCAL n%,j%:n%=0:j%=0
15520REPEAT
15530j%=INSTR(menu$,"\",j%+1)
15540IF j%<>0 THEN n%+=1
15550UNTIL j%=0
15560=n%
15570:
15580DEFPROCMenuClose
15590SYS "Wimp_CreateMenu",-1
15600ENDPROC
15610:
15620DEFPROCMenuDisable(menu%,item%)
15630menu%!(36+(item%-1)*24)=menu%!(36+(item%-1)*24)OR(1<<22)
15640ENDPROC
15650:
15660DEFPROCMenuEnable(menu%,item%)
15670PROCMenuDisable(menu%,item%)
15680menu%!(36+(item%-1)*24)=menu%!(36+(item%-1)*24)EOR(1<<22)
15690ENDPROC
15700:
15710DEFPROCMenuTick(menu%,item%)
15720menu%!(28+(item%-1)*24)=(menu%!(28+(item%-1)*24))EOR1
15730ENDPROC
15740:
15750DEFPROCSpritesLoad
15760PROCSpritesPathLoad("<WordSq$Dir>.Sprites")
15770direct_sprites%=sprites%
15780ENDPROC
15790:
15800DEFPROCSpritesPathLoad(pathname$)
15810LOCALS%,T%
15820S%=OPENIN"<WordSq$Dir>.Sprites":T%=EXT#S%+16:CLOSE#S%
15830DIMsprites%T%,spname%12
15840!sprites%=T%:sprites%!8=0
15850SYS"OS_SpriteOp",&109,sprites%
15860SYS"OS_SpriteOp",&10A,sprites%,pathname$
15870ENDPROC
15880:
15890DEFFNGetFilePathName
15900=FNGetStringAtAddress(wimp%+44)
15910:
15920DEFFNGetStringAtAddress(array%)
15930LOCALs$:s$=""
15940WHILE(?array%<>13)AND(?array%<>0):s$+=CHR$(?array%):array%+=1:ENDWHILE:
15950=s$
15960:
15970DEFFNGetFileFromPathname(f$)
15980CASE INSTR(f$,".") OF
15990WHEN 0:=f$
16000OTHERWISE:=FNGetFileFromPathname(RIGHT$(f$,LEN(f$)-INSTR(f$,".")))
16010ENDCASE
16020:
16030DEFPROCStart(TaskName$,wimp_memory%,icon%)
16040DIM wimp% wimp_memory%,icons% icon%
16050IF wimp_memory%<256 THEN wimp_memory%=256
16060icon_memory%=icons%+icon%
16070task$=TaskName$
16080indirect_sprites%=1:direct_sprites%=1
16090PROCSetEventVariables
16100SYS"Wimp_Initialise",200,&4B534154,TaskName$ TO version%,task%
16110ENDPROC
16120:
16130DEFPROCSetEventVariables
16140DIM pointer_block% 20
16150null%=1:draw%=2:pointer_leaving%=1<<4
16160pointer_entering%=1<<5:mouse%=1<<6:drag%=1<<7
16170key%=1<<8:menu%=1<<9:scroll%=1<<10
16180lose_caret%=1<<11:gain_caret%=1<<12:message%=(1<<17)+(1<<18)
16190recorder%=1<<18:acknowledge%=1<<19:window%=0
16200sprites%=1:version%=0:task%=0
16210Bar_Window%=-2:Bar_Icon%=0:Bar_Menu%=0
16220x_origin%=0:y_origin%=0:SaveWindow%=-3
16230message_quit%=0:message_save%=2:message_load%=3
16240mouse_button%=2:save_event%=0
16250top_line%=0:bottom_line%=0
16260ENDPROC
16270:
16280DEFPROCError
16290LOCALX$,x%
16300VDU3
16310ON ERROR OFF
16320SYS"Hourglass_Smash"
16330PROCMenuClose
16340x%=ERL
16350DIMErrorMsg%36
16360ErrorMsg%!0=36:ErrorMsg%!12=0:ErrorMsg%!16=&81080:ErrorMsg%!20=x%
16370$(ErrorMsg%+24)="!RunImage"
16380SYS"Wimp_SendMessage",17,ErrorMsg%
16390PROCAlert(task$,REPORT$+STR$ERL)
16400ENDCASE
16410ENDPROC
16420:
16430DEFPROCCloseDown
16440VDU3:SYS"Hourglass_Smash"
16450SYS"Wimp_CloseDown",task%,"TASK"
16460ENDPROC
16470:
16480DEFPROCQuit
16490finished%=TRUE
16500ENDPROC
16510:
16520DEFPROCpoll
16530LOCAL mask%,event%
16540finished%=FALSE
16550mask%=%111000011001
16560REPEAT
16570SYS"Wimp_Poll",mask%,wimp% TO event%
16580CASE event% OF
16590WHEN0
16600WHEN1:PROCPollDrawWindow
16610WHEN2:SYS "Wimp_OpenWindow",,wimp%
16620WHEN3:PROCPollCloseWindow
16630WHEN4
16640WHEN5
16650WHEN6:PROCPollMouseClick
16660WHEN7:PROCPollSaveMessage
16670WHEN8:PROCPollKeyPress
16680WHEN9:PROCEvent_MenuChoice(menu%)
16690WHEN10
16700WHEN11
16710WHEN12
16720WHEN17,18:PROCPollMessages
16730WHEN19
16740ENDCASE
16750UNTIL finished%
16760ENDPROC
16770:
16780DEFPROCPollDrawWindow
16790LOCAL more%
16800SYS"Wimp_RedrawWindow",,wimp%TOmore%
16810window%=wimp%!0
16820x_origin%=16+wimp%!4-wimp%!20:y_origin%=-16+wimp%!16-wimp%!24
16830WHILEmore%
16840SYS"Wimp_BorderWindow",,wimp%
16850PROCEvent_Draw(window%,x_origin%,y_origin%)
16860SYS"Wimp_GetRectangle",,wimp%TOmore%
16870ENDWHILE
16880ENDPROC
16890:
16900DEFPROCPollCloseWindow
16910SYS "Wimp_GetPointerInfo",,wimp%
16920window%=wimp%!12:buttons%=wimp%!8
16930PROCEvent_WindowClose(window%,buttons%)
16940!wimp%=window%:SYS "Wimp_CloseWindow",,wimp%
16950ENDPROC
16960:
16970DEFPROCPollMouseClick
16980button%=wimp%!8:window%=wimp%!12:icon%=wimp%!16:x%=wimp%!0:y%=wimp%!4
16990x_origin%=wimp%!4-wimp%!20+16
17000CASE button% OF
17010WHEN2:PROCPollMenuPopUp
17020OTHERWISE:CASE FNEvent_Save(window%) OF
17030WHEN TRUE:PROCPollMouseSave
17040WHEN FALSE:PROCPollEventMouseClick
17050ENDCASE
17060ENDCASE
17070ENDPROC
17080:
17090DEFPROCPollMenuPopUp
17100menu%=FNEvent_Menu(window%)
17110CASE menu% OF
17120WHEN FALSE
17130OTHERWISE
17140CASE window% OF
17150WHEN -2:n%=0
17160WHILE ((Bar_Menu%!(28+n%*24))AND%10000000)=0
17170n%+=1
17180ENDWHILE
17190SYS "Wimp_CreateMenu",,Bar_Menu%,x%-64,96+n%*44+44
17200OTHERWISE:SYS"Wimp_CreateMenu",,menu%,x%-64,y%+20
17210ENDCASE
17220ENDCASE
17230wsqtitle$=FNIconText(main_Window%,9)
17240ENDPROC
17250:
17260DEFPROCPollMouseSave
17270CASE icon% OF
17280WHEN 0:IF button% AND &50 THEN PROCPollDragBox(window%)
17290WHEN 2:IF button% AND 5 THEN PROCPollSaveFile(window%)
17300ENDCASE
17310ENDPROC
17320:
17330DEFPROCPollEventMouseClick
17340SYS"Wimp_BorderIcon",,wimp%
17350PROCEvent_MouseClick(window%,icon%,button%,x%,y%)
17360wimp%!0=x%:wimp%!4=y%:wimp%!8=0
17370wimp%!12=window%:wimp%!16=icon%
17380SYS"Wimp_BorderIcon",,wimp%
17390ENDPROC
17400:
17410DEFPROCPollSaveFile(window%)
17420LOCALfile$
17430wimp%!0=window%:wimp%!4=1:SYS "Wimp_GetIconState",,wimp%
17440file$=$(wimp%!28)
17450CASE INSTR(file$,".") OF
17460WHEN 0
17470$(wimp%+4)="To save, drag the icon to a directory window"
17480SYS "Wimp_ReportError",wimp%,16,task$
17490OTHERWISE
17500PROCEvent_SaveFile(file$,window%)
17510ENDCASE
17520SYS"Wimp_CreateMenu",-1
17530ENDPROC
17540:
17550DEFPROCPollDragBox(window%)
17560LOCALx%,y%
17570save%=window%
17580!wimp%=window%
17590SYS"Wimp_GetWindowState",,wimp%
17600x%=wimp%!4-wimp%!20:y%=wimp%!16-wimp%!24
17610wimp%!4=0
17620SYS"Wimp_GetIconState",,wimp%
17630!wimp%=window%
17640wimp%!4=5
17650wimp%!8=x%+wimp%!8:wimp%!12=y%+wimp%!12
17660wimp%!16=x%+wimp%!16:wimp%!20=y%+wimp%!20
17670wimp%!24=0:wimp%!28=0
17680wimp%!32=&7FFFFFFF:wimp%!36=&7FFFFFFF
17690SYS"Wimp_DragBox",,wimp%
17700ENDPROC
17710:
17720DEFPROCPollKeyPress
17730window%=wimp%!0:icon%=wimp%!4:key%=wimp%!24
17740CASE FNEvent_Save(window%) OF
17750WHEN TRUE:PROCWimpPoll_SaveFile(window%)
17760WHEN FALSE:PROCEvent_KeyPress(window%,icon%,key%)
17770ENDCASE
17780ENDPROC
17790:
17800DEFPROCPollSaveMessage
17810LOCALfile$,window%,icon%,x%,y%
17820SYS"Wimp_GetPointerInfo",,wimp%
17830window%=wimp%!12:icon%=wimp%!16:x%=wimp%!0:y%=wimp%!4
17840wimp%!0=save%:wimp%!4=1:SYS "Wimp_GetIconState",,wimp%
17850file$=$(wimp%!28)
17860file$=FNGetFileFromPathname(file$)
17870wimp%!20=window%
17880wimp%!24=icon%
17890wimp%!28=x%:wimp%!32=y%
17900wimp%!36=length%
17910wimp%!0=64
17920wimp%!12=0
17930wimp%!16=1
17940wimp%!40=&FFF
17950$(wimp%+44)=file$
17960SYS"Wimp_SendMessage",17,wimp%,wimp%!20,wimp%!24
17970ENDPROC
17980:
17990DEFPROCPollMessages
18000LOCAL file$
18010file$=FNGetStringAtAddress(wimp%+44)
18020block%=wimp%!16:CASE block% OF
18030WHEN 0:finished%=TRUE
18040WHEN 1
18050!wimp%=(48+16) ANDNOT3:wimp%!12=wimp%!8:wimp%!16=2:wimp%!36=-1
18060temp$=file$:$(wimp%+44)="<Wimp$Scrap>"+CHR$0
18070SYS"Wimp_SendMessage",17,wimp%,wimp%!4
18080GOTO18200
18090WHEN 2
18100PROCEvent_SaveFile(file$,save%)
18110wimp%!12=wimp%!8:wimp%!16=3
18120SYS"Wimp_SendMessage",17,wimp%,wimp%!20,wimp%!24
18130IFINSTR(file$,"Wimp$Scrap")=0 PROCIconPutText(save%,1,file$)
18140WHEN 3
18150IFtemp$="" temp$=file$
18160type%=wimp%!40:PROCEvent_LoadFile(file$,type%)
18170OSCLI"REMOVE <Wimp$Scrap>"
18180temp$=""
18190WHEN &502:PROChelp
18200ENDCASE
18210ENDPROC
18220:
18230DEFPROChelp
18240window%=wimp%!32:icon%=wimp%!36
18250IFwindow%=-2 PROCsend("This is the WordSq icon.|MClick SELECT to create or edit a wordsquare.|MClick MENU to edit a wordsquare, solve a wordsquare, set your preferences or clear all words and grid from memory."):ENDPROC
18260IFwindow%=display_Window% PROCsend("This is the display window.|MThe positions of any highlighted words will be shown."):ENDPROC
18270IFwindow%=words_Window% AND icon%<>2 AND icon%<>3 PROCsend("This is the words window.|MIt shows a complete list of all the words in memory."):ENDPROC
18280SYS "Wimp_SendInformation",,wimp%
18290ENDPROC
18300:
18310DEFPROCsend(d$)
18320wimp%!12=wimp%!8:wimp%!16=&503:$(wimp%+20)=d$+CHR$0
18330!wimp%=(25+LENd$)ANDNOT3
18340SYS"Wimp_SendMessage",17,wimp%,wimp%!4
18350ENDPROC
18360:
18370DEF FNMenuCreateColours(title$)
18380LOCAL x$,men%,j%,i%
18390x$=title$+"\0\1\2\3\4\5\6\7\8\9\10\11\12\13\14\15"
18400men%=FNMenuCreate(x$)
18410FOR i%=0 TO 15
18420CASE TRUE OF
18430WHEN i%<4,i%=9,i%=12,i%=14,i%=15 : j%=7
18440OTHERWISE : j%=0
18450ENDCASE
18460men%?(39+i%*24)=i%*16+j%
18470PROCMenuCentre(men%,i%+1)
18480NEXT
18490=men%
18500:
18510DEF PROCMenuCentre(menu%,item%)
18520menu%!(36+(item%-1)*24)=menu%!(36+(item%-1)*24)OR(1<<3)
18530ENDPROC
18540:
18550DEFPROCresize(w%,a%,b%,c%,d%)
18560!wimp%=a%:wimp%!4=b%:wimp%!8=c%:wimp%!12=d%
18570SYS"Wimp_SetExtent",w%,wimp%
18580wimp%!0=display_Window%:wimp%!4=dispbox%:SYS"Wimp_DeleteIcon",,wimp%
18590wimp%!0=display_Window%:wimp%!4=22:wimp%!8=b%+24
18600wimp%!12=c%-24:wimp%!16=-36:wimp%!20=&17000101:wimp%!24=text%
18610wimp%!28=valid%:wimp%!32=12
18620SYS"Wimp_CreateIcon",,wimp% TO dispbox%
18630PROCWindowForceDraw(display_Window%)
18640IFdispwind% PROCBringToTop(display_Window%)
18650ENDPROC
18660:
18670DEFPROCww
18680a%=-240-(words%*36):b%=352
18690!wimp%=0:wimp%!4=a%:wimp%!8=b%:wimp%!12=0
18700SYS"Wimp_SetExtent",words_Window%,wimp%
18710wimp%!0=words_Window%:wimp%!4=wordsbox%:SYS"Wimp_DeleteIcon",,wimp%
18720wimp%!0=words_Window%:wimp%!4=22:wimp%!8=a%+24
18730wimp%!12=b%-24:wimp%!16=-36:wimp%!20=&17000101:wimp%!24=text%
18740wimp%!28=valid%:wimp%!32=12
18750SYS"Wimp_CreateIcon",,wimp% TO wordsbox%
18760PROCWindowForceDraw(words_Window%)
18770IFwordswind% PROCBringToTop(words_Window%)
18780ENDPROC
� >WordSq$Dir.!RunImage
-� WordSquare Creation and Solving program
� By Matthew Eglise
(�
21� Copyright held by Archimedes World magazine
<'� This program is NOT Public Domain
F�
P(� Version 3.12 - 26th September 1992
Z�
d)mem1%=9042:mem2%=17100:filetype%=&03C
n
�autoload
xș"Hourglass_On"
� �Start("WordSq",mem1%,mem2%)
� �init
��Create_Windows
��Create_Menus
��loadprefs
��d$<>"" �LoadOwn(d$)
�ș"Hourglass_Off"
�� � �Error:�dH@
��
� �poll
�� �new("quit")<>0
��CloseDown
��
:
��init
8� word$(168),len%(168),grid%(2400),show%(168),b$(60)
"5� selected%(168),start%(168),dir%(168),temp$(168)
,)� sx%(168),sy%(168),ex%(168),ey%(168)
6-� valid% 32:$valid%="b1,0,15,4,0,1,14,12"
@� text% 8:$text%=""
J<wordswind%=0:words%=0:grid%=0:selection%=0:ef%=0:high%=0
T=nofit%=0:dimx=0:dimy=0:maxh=0:a=0:needs%=0:gaps=25:len%=0
^Mwsqtitle$="":selectedword$="":saveformat$="text":solveformat$="":temp$=""
hBmainwind%=0:solvewind%=0:dispwind%=0:wsqx=0:wsqy=0:wsqwords%=0
r?wordssaved%=1:gridsaved%=1:flag%=0:show%=0:found%=0:done%=0
| startx%=0:starty%=0:dispx%=0
�dispbox%=0:wordsbox%=0
��
�:
���Create_Windows
��SpritesLoad
�&solve_Window%=�WindowLoad("solve")
�$info_Window%=�WindowLoad("info")
�.savewords_Window%=�WindowLoad("savewords")
�*display_Window%=�WindowLoad("display")
�&words_Window%=�WindowLoad("words")
�$main_Window%=�WindowLoad("main")
�*savewsq_Window%=�WindowLoad("savewsq")
�&prefs_Window%=�WindowLoad("prefs")
!Bar_Icon%=�IconBar("!WordSq")
1�I%=4�171:�IconPutText(words_Window%,I%,""):�
�ww
&�
0:
:ݤEvent_Save(window%)
DȎ window% �
N� savewords_Window% :=�
X� savewsq_Window% :=�
b :=�
l�
v:
���Create_Menus
�� prefs_Menu%(1)
�Fmenu$="WordSq\Info>info_Window%\Edit\Solve\Preferences\Clear\Quit"
� Bar_Menu%=�MenuCreate(menu$)
�0menu$ ="Solve\Info>info_Window%\Show Words\"
�menu$+="Quit"
�"solve_Menu%=�MenuCreate(menu$)
�6menu$ ="Display\Info>info_Window%\Show Words\Quit"
�$display_Menu%=�MenuCreate(menu$)
�Bmenu$ ="Words\Info>info_Window%\Save Words>savewords_Window%\"
�menu$+="Quit"
�"words_Menu%=�MenuCreate(menu$)
�"WlMenu%=�MenuCreate("Colours")
"SmMenu%=�MenuCreate("Colours")
!LMenu%=�MenuCreate("Colours")
"ClMenu%=�MenuCreate("Colours")
Zmenu$="Colours\Words list>WlMenu%\Start mark>SmMenu%\Lines>LMenu%\Latest line>ClMenu%"
*%prefs_Menu%(1)=�MenuCreate(menu$)
4@menu$ ="Prefs\Info>info_Window%\Colours>prefs_Menu%(1)\Quit"
>"prefs_Menu%=�MenuCreate(menu$)
H1menu$ ="Create\Info>info_Window%\Show Words\"
Rcmenu$+="Save Words>savewords_Window%\Save Square>savewsq_Window%\Print Words\Print Square\Quit"
\!main_Menu%=�MenuCreate(menu$)
f2savewsq_Menu%=0:info_Menu%=0:savewords_Menu%=0
p�MenuDisable(main_Menu%,2)
z�MenuDisable(main_Menu%,3)
��MenuDisable(main_Menu%,4)
��MenuDisable(main_Menu%,5)
��MenuDisable(main_Menu%,6)
��MenuDisable(solve_Menu%,2)
�!�MenuDisable(display_Menu%,2)
��
�:
�ݤEvent_Menu(window%)
�Ȏ window% �
�� Bar_Window%:=Bar_Menu%
� � solve_Window%:=solve_Menu%
�$� display_Window%:=display_Menu%
� � words_Window%:=words_Menu%
� main_Window%:=main_Menu%
� prefs_Window%:=prefs_Menu%
:=�
$�
.:
8)��Event_WindowClose(window%,buttons%)
BȎ window% �
L � solve_Window%:solvewind%=0
V� info_Window%
`� savewords_Window%
j!� display_Window%:dispwind%=0
tl� words_Window%:wordswind%=0:�MenuTick(main_Menu%,2):�MenuTick(solve_Menu%,2):�MenuTick(display_Menu%,2)
~� main_Window%:mainwind%=0
�� savewsq_Window%
�� prefs_Window%
��
��
�:
�-��Event_Draw(window%,x_origin%,y_origin%)
�Ȏ window% �
�(� savewsq_Window%:�DrawsavewsqWindow
�$� solve_Window%:�DrawsolveWindow
�"� info_Window%:�DrawinfoWindow
�,� savewords_Window%:�DrawsavewordsWindow
�$� prefs_Window%:�DrawprefsWindow
(� display_Window%:�DrawdisplayWindow
$� words_Window%:�DrawwordsWindow
"� main_Window%:�DrawmainWindow
�
(�
2:
<��DrawsavewsqWindow
F�
P:
Z��DrawsolveWindow
d�
n:
x��DrawinfoWindow
��
�:
���DrawsavewordsWindow
��
�:
���DrawprefsWindow
��
�:
���DrawwordsWindow
��
�:
���DrawmainWindow
��
:
��DrawdisplayWindow
e�startx%<>0 � starty%<>0 ș"Wimp_SetColour",mcol%:ȓ Ȑ x_origin%+startx%,y_origin%+starty%,22,32
"�I%=1�words%
,4�show%(I%)=0 � (start%(I%)=0 � dir%(I%)=0) �DJF
6@�I%=show% ș"Wimp_SetColour",lcol% � ș"Wimp_SetColour",col%
@M� x_origin%+sx%(I%),y_origin%-sy%(I%),x_origin%+ex%(I%),y_origin%-ey%(I%)
J�
Tdispx%=x_origin%-18
^�
h:
r3��Event_MouseClick(window%,icon%,button%,x%,y%)
|Ȏ window% �
�� Bar_Window%:�MouseBar
�.� solve_Window%:�Mousesolve(button%,icon%)
�,� info_Window%:�Mouseinfo(button%,icon%)
�2� display_Window%:�Mousedisplay(button%,icon%)
�.� prefs_Window%:�Mouseprefs(button%,icon%)
�.� words_Window%:�Mousewords(button%,icon%)
�,� main_Window%:�Mousemain(button%,icon%)
��
��
�:
���MouseBar
�)�BringToTop(main_Window%):mainwind%=1
��
:
��Mouseprefs(button%,icon%)
Ȏ icon% �
&.� 1:�saveprefs:�WindowClose(prefs_Window%)
0.� 11:�getprefs:�WindowClose(prefs_Window%)
:$� 12:�WindowClose(prefs_Window%)
D;�tempdbl%<>dbl% �SetIcon(prefs_Window%,3):tempdbl%=dbl%
N[�tempcaps%<>caps% �SetIcon(prefs_Window%,29):�SetIcon(prefs_Window%,30):tempcaps%=caps%
X_�tempforce%<>force% �SetIcon(prefs_Window%,45):�SetIcon(prefs_Window%,46):tempforce%=force%
b1�temptitlept%<>titlept% temptitlept%=titlept%
l-�tempgridpt%<>gridpt% tempgridpt%=gridpt%
v1�tempwordspt%<>wordspt% tempwordspt%=wordspt%
�!�tempcol%<>col% tempcol%=col%
�%�tempmcol%<>mcol% tempmcol%=mcol%
�%�tempwcol%<>wcol% tempwcol%=wcol%
�%�templcol%<>lcol% templcol%=lcol%
�
�setprefs
�.� 3:� tempdbl%=-1 tempdbl%=0 � tempdbl%=-1
�=� 29:�button%=1 � tempcaps%=-1 �SetIcon(prefs_Window%,29)
�tempcaps%=-1
�<� 30:�button%=1 � tempcaps%=0 �SetIcon(prefs_Window%,30)
�tempcaps%=0
�:� 31,33:temptitlept%=�bumppt(icon%-32,temptitlept%,32)
�8� 34,36:tempgridpt%=�bumppt(icon%-35,tempgridpt%,35)
�:� 37,39:tempwordspt%=�bumppt(icon%-38,tempwordspt%,38)
?� 45:� button%=1 � tempforce%=-1 �SetIcon(prefs_Window%,45)
tempforce%=-1
>� 46:� button%=1 � tempforce%=0 �SetIcon(prefs_Window%,45)
tempforce%=0
*0:�Alert("WordSq","Invalid Templates file.")
4�
>�
H:
R��Mousesolve(button%,icon%)
\�button%<>1 � button%<>4 �
f��solveformat$="" �Alert("WordSq","No wordsquare is currently available - either create one or load a plain text wordsquare."):�
p@�icon%=9 � (selection%=0 � �IconText(solve_Window%,17)="") �
zȎ icon% �
�?� 8:�BringToTop(display_Window%):dispwind%=1:�removepressed
�=� 9:�BringToTop(display_Window%):dispwind%=1:�showpressed
�:� 11:�BringToTop(display_Window%):dispwind%=1:�showall
�� 10:�removeall
�0:�Alert("WordSq","Invalid Templates file.")
��
��
�:
�!��Mousedisplay(button%,icon%)
��button%<>4 � button%<>1 �
��icon%-1>wsqy �
�T!wimp%=display_Window%:ș "Wimp_GetWindowState",,wimp%:dispx%=wimp%!4-wimp%!20-2
�{�button%=4 startpos%=0:startx%=0:starty%=0:endpos%=0 � �button%=1 � startpos%=0 button%=4:startx%=0:starty%=0:endpos%=0
,icon%-=1:i%=((24+((x%-dispx%)/16))/2)-12
�i%>wsqx �
p%=((icon%-1)*wsqx)+i%
$Ȏ button% �
.� 4:startpos%=p%
87startx%=22+((i%-1)*32)-8:starty%=-84-((icon%-1)*44)
B� 1:endpos%=p%
LDd$=�getword(startpos%,endpos%):�IconPutText(solve_Window%,17,d$)
V)�startpos%<>endpos% � o%=1 � d$<>"" �
`�caret((�d$/2)+1000)
j&ex%=�exists(d$):p%=�palindrome(d$)
t^�ex%=0 �Alert("WordSq","The word '"+d$+"' does not exist in the current word list."):�t\I
~��ex%>0 � startpos%<>0 � endpos%<>0 � startpos%<>start%(ex%) � p%=0 �Alert("WordSq","Although the word "+d$+" does exist in the current wordsquare, it is not at this position."):�t\I
�[�ex%>0 � startpos%<>0 � endpos%<>0 � startpos%<>start%(ex%) � p%=1 Ȕ startpos%,endpos%
�b�ex%>0:�show%(ex%)=0 high%+=1:show%(ex%)=2:�sic(words_Window%,ex%+3,wcol%):show%=ex%:found%+=1
�-startx%=0:starty%=0:startpos%=0:endpos%=0
��
��
�%�WindowForceDraw(display_Window%)
��updatesolvestate
��solveformat$<>"own" �
�k�found%=wsqwords% � done%=0 �wsqwords%=1 �Alert("WordSq","Well Done, you've found the word."):done%=1:�
��high%=wsqwords% � found%<wsqwords% � done%=0 � wsqwords%=1 � found%>0 �Alert("WordSq","Although you have found the word, you had to seek help with it."):done%=1:�
�|�found%=wsqwords% � done%=0 �Alert("WordSq","Well Done, you've found all "+�oneormore(wsqwords%)+"in the grid."):done%=1
���high%=wsqwords% � found%<wsqwords% � done%=0 � found%>0 �Alert("WordSq","Although you have found all "+�oneormore(wsqwords%)+"in the grid, you had to seek help with "+�(wsqwords%-found%)+" of them."):done%=1
�
:
��showpressed
8�solveformat$="" �IconPutText(solve_Window%,17,""):�
(4gibbet$=�IconText(solve_Window%,17):need%=0:F%=0
2ex%=�exists(gibbet$)
<h�caps%=-1 �IconPutText(main_Window%,26,�caps(gibbet$)):�IconPutText(solve_Window%,17,�caps(gibbet$))
F)�len(gibbet$)<3 � selection%=0 �TNK
Po�selection%=0 � solveformat$="text" � ex%=0 �find(�caps(gibbet$)):�IconPutText(main_Window%,20,�gaps):�TDK
Z(�selection%=0 � solveformat$="own" �
dc�ex%=0 �Alert("WordSq","The word '"+gibbet$+"' does not exist in the current word list."):�tBJ
n��ex%>0 � startpos%<>0 � endpos%<>0 � startpos%<>start%(ex%) �Alert("WordSq","Although the word "+gibbet$+" does exist in the current wordsquare, it is not at this position."):�tBJ
x`�ex%>0 need%=1:�show%(ex%)=0 high%+=1:show%(ex%)=1:�sic(words_Window%,ex%+3,wcol%):show%=ex%
��
�-�selection%=0 � solveformat$="own" � �TNK
��selection%>0 �
��o%=0:�I%=1�words%:�selected%(I%)=1 � start%(I%)=0 � dir%(I%)=0 o%+=1 � �selected%(I%)=1 � show%(I%)=0 high%+=1:show%(I%)=1:need%=1:�sic(words_Window%,I%+3,wcol%)
��
��selection%>1 show%=0
��o%>0 �
�!�o%=1 o$=" does " � o$=" do "
�f�o%=1 � selection%=1 d$="This word does ":� d$=�oneormore(o%)+"amongst the selection"+o$:o$="they"
��o%=1 o$="it"
�[�Alert("WordSq",d$+"not appear in the current wordsquare so "+o$+" will not be shown.")
��
��
o%=selection%
Z�clearall:�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�caret(0)
��words%=1:�MenuEnable(main_Menu%,2):�MenuEnable(main_Menu%,3):�MenuEnable(main_Menu%,5):�MenuEnable(solve_Menu%,2):�MenuEnable(words_Menu%,2):�MenuEnable(display_Menu%,2)
"�words%=0 done%=0
,startx%=0:starty%=0
6%�WindowForceDraw(display_Window%)
@D�updatesolvestate:�solveformat$<>"own" �o%>=wsqwords% �done%=1 �
J��high%=wsqwords% � found%<wsqwords% �wsqwords%=1 �Alert("WordSq","Although you found the word, you had to seek help with it."):done%=1:�
T��high%=wsqwords% � found%<wsqwords% � found%>0 �Alert("WordSq","Although you have found all "+�oneormore(wsqwords%)+"in the grid, you had to seek help with "+�(wsqwords%-found%)+" of them."):done%=1
^�
h:
r��removepressed
|B�solveformat$="" �IconPutText(solve_Window%,17,""):�caret(0):�
��selection%=0 �
�need%=0:�I%=1�words%
�,�show%(I%)=2 � selected%(I%)=1 found%-=1
�l�selected%(I%)=1 � show%(I%)>0 high%-=1:show%(I%)=0:need%=1:�sic(words_Window%,I%+3,7):�I%=show% show%=0
��
�done%=0
�Z�clearall:�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�caret(0)
�,�need% �WindowForceDraw(display_Window%)
��updatesolvestate
��
�:
���Mouseinfo(button%,icon%)
��
:
��Mousewords(button%,icon%)
�icon%>3 � icon%<=words%+3 �
&Ȏ button% �
0� 4:
:N�I%=1�words%:�selected%(I%)=1 �SetIcon(words_Window%,I%+3):selected%(I%)=0
Dm�:�SetIcon(words_Window%,icon%):selected%(icon%-3)=1:selection%=1:selectedword$=word$(icon%-3):�setbutton
N� 1:
X!�SetIcon(words_Window%,icon%)
bl�selected%(icon%-3)=0 selected%(icon%-3)=1:selection%+=1:� selected%(icon%-3)=0:selection%-=1:�setbutton
l�selection%<>1 �t@L
v>�I%=1�words%:�selected%(I%)=1 selectedword$=word$(I%):�:��
��
�Ȏ selection% �
�[� 0:�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):selectedword$=""
�`� 1:�IconPutText(main_Window%,26,selectedword$):�IconPutText(solve_Window%,17,selectedword$)
�Y:�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):selectedword$=""
��
��
�� icon%=2 �selectall
�� icon%=3 �clearall
��updatesolvestate
��caret(�selectedword$/2)
��setbutton
��
:
��Mousemain(button%,icon%)
� button%<>1 � button%<>4 �
/�icon%=24 � �IconText(main_Window%,26)="" �
*Ȏ icon% �
4� 24:�addword
>� 25:�deleteword
H� 28:�amendword
R� 29:�create
\� 11,13:�bumpx(icon%-12)
f� 15,17:�bumpy(-(icon%-16))
p"� 19,21:�bumpgaps(-(icon%-20))
zB� 30:�button%=1 � saveformat$="text" �SetIcon(main_Window%,30)
�Fsaveformat$="text":d%=�IconPutSprite(savewsq_Window%,0,"file_fff")
�B� 32:�button%=1 � saveformat$="draw" �SetIcon(main_Window%,32)
�Fsaveformat$="draw":d%=�IconPutSprite(savewsq_Window%,0,"file_fff")
�A� 33:�button%=1 � saveformat$="own" �SetIcon(main_Window%,33)
�Esaveformat$="own":d%=�IconPutSprite(savewsq_Window%,0,"file_03c")
�A� 34:�button%=1 � saveformat$="imp" �SetIcon(main_Window%,34)
�Esaveformat$="imp":d%=�IconPutSprite(savewsq_Window%,0,"file_fff")
�0:�Alert("WordSq","Invalid Templates file.")
��
��
�:
���selectall
�R�I%=4�words%+3:�selected%(I%-3)=0 �SetIcon(words_Window%,I%):selected%(I%-3)=1
"�:selection%=words%:�setbutton
�
:
$��clearall
.R�I%=4�words%+3:�selected%(I%-3)=1 �SetIcon(words_Window%,I%):selected%(I%-3)=0
8�:selection%=0:�setbutton
B�
L:
V
��showall
`X�I%=1�words%:�start%(I%)<>0 � dir%(I%)<>0 show%(I%)=1:�sic(words_Window%,I%+3,wcol%)
j'�:�WindowForceDraw(display_Window%)
t5high%=wsqwords%:done%=1:show%=0:�updatesolvestate
~�
�:
���removeall
�I�I%=1�words%:show%(I%)=0:�sic(words_Window%,I%+3,7):�I%=show% show%=0
��
�%�WindowForceDraw(display_Window%)
�.high%=0:found%=0:done%=0:�updatesolvestate
��
�:
�(��Event_KeyPress(window%,icon%,key%)
�Ȏ window% �
�.� solve_Window%:�KeyPresssolve(icon%,key%)
�� info_Window%
� display_Window%
� words_Window%
,� main_Window%:�KeyPressmain(icon%,key%)
.� prefs_Window%:�KeyPressprefs(icon%,key%)
(�
2.key%=0:wsqtitle$=�IconText(main_Window%,9)
<�
F:
P��KeyPresssolve(icon%,key%)
Z&�key%<>13 ș"Wimp_ProcessKey",key%
dX�key%=13 � icon%=17 � (selection%<>0 � �IconText(solve_Window%,17)<>"") �showpressed
n3�key%=13 � icon%=17 � solveformat$="" �caret(0)
x�
�:
���KeyPressmain(icon%,key%)
�d%=icon%
�@�key%=399 � icon%=26 icon%=9 � � key%=398 � icon%=9 icon%=26
�S�d%<>icon% �IconCaret(main_Window%,icon%,�(��IconText(main_Window%,icon%)/2)):�
�Z�key%=13 � icon%=26 � �IconText(main_Window%,26)<>"" � solveformat$<>"text" �addword:�
�ș"Wimp_ProcessKey",key%
��
�:
���KeyPressprefs(icon%,key%)
�d%=icon%
�
Ȏ key% �
� � 399
��icon%=24 � icon%=25 � icon%=26 � icon%=27 icon%-=1 � � icon%=23 icon%=17 � � icon%=41 icon%=27 � � icon%=43 icon%=41 � � icon%=9 icon%=7 � � icon%=13 icon%=9 � � icon%=17 icon%=13
� 398
��icon%=23 � icon%=24 � icon%=25 � icon%=26 icon%+=1 � � icon%=41 icon%=43 � � icon%=27 icon%=41 � � icon%=17 icon%=23 � � icon%=7 icon%=9 � � icon%=9 icon%=13 � � icon%=13 icon%=17
" ș"Wimp_ProcessKey",key%
,�
6S�icon%<>d% �IconCaret(prefs_Window%,icon%,�(��IconText(prefs_Window%,icon%)/2))
@�
J:
T��Event_MenuChoice(menu%)
^Ȏ menu% �
h� Bar_Menu%:�MenuChoiceBar
r� savewsq_Menu%
|"� solve_Menu%:�MenuChoicesolve
�� info_Menu%
�� savewords_Menu%
�"� prefs_Menu%:�MenuChoiceprefs
�&� display_Menu%:�MenuChoicedisplay
�"� words_Menu%:�MenuChoicewords
� � main_Menu%:�MenuChoicemain
��
��
�:
���MenuChoiceBar
�Ȏ �MenuChoice(0) �
�� 1
�-� 2:�BringToTop(main_Window%):mainwind%=1
B� 3:�solveformat$<>"" �BringToTop(display_Window%):dispwind%=1
+�BringToTop(solve_Window%):solvewind%=1
"� 4:�BringToTop(prefs_Window%)
&� 5:
0)�new("clear all variables")=1 �reset
:� 6:finished%=�
D�
N�
X:
b��MenuChoiceprefs
lȎ �MenuChoice(0) �
v� 1
�� 2:Ȏ �MenuChoice(1) �
�5� 1:�MenuChoice(2)<>0 tempwcol%=�MenuChoice(2)-1
�5� 2:�MenuChoice(2)<>0 tempmcol%=�MenuChoice(2)-1
�4� 3:�MenuChoice(2)<>0 tempcol%=�MenuChoice(2)-1
�5� 4:�MenuChoice(2)<>0 templcol%=�MenuChoice(2)-1
��
�� 3:finished%=�
��
�D�sib(prefs_Window%,50,tempcol%):�sib(prefs_Window%,51,tempmcol%)
�E�sib(prefs_Window%,53,tempwcol%):�sib(prefs_Window%,54,templcol%)
��
�:
���MenuChoicesolve
Ȏ �MenuChoice(0) �
� 1
}� 2:�MenuTick(solve_Menu%,2):�MenuTick(main_Menu%,2):�MenuTick(display_Menu%,2):�wordswind%=0 wordswind%=1 � wordswind%=0
� 3:finished%=�
*�
4K� wordswind%=1 �BringToTop(words_Window%) � �WindowClose(words_Window%)
>�
H:
R��MenuChoicedisplay
\Ȏ �MenuChoice(0) �
f� 1
p}� 2:�MenuTick(solve_Menu%,2):�MenuTick(main_Menu%,2):�MenuTick(display_Menu%,2):�wordswind%=0 wordswind%=1 � wordswind%=0
z� 3:finished%=�
��
�K� wordswind%=1 �BringToTop(words_Window%) � �WindowClose(words_Window%)
��
�:
���MenuChoicewords
�Ȏ �MenuChoice(0) �
�� 1
�� 2
�� 3:finished%=�
��
��
�:
���MenuChoicemain
Ȏ �MenuChoice(0) �
� 1
�� 2:�MenuTick(main_Menu%,2):�MenuTick(solve_Menu%,2):�MenuTick(display_Menu%,2):�wordswind%=0 wordswind%=1:�BringToTop(words_Window%) � wordswind%=0:�WindowClose(words_Window%)
$� 3
.� 4
8]� 5:old$=saveformat$:saveformat$="print":�2:�pre:�savewords(""):�post:�3:saveformat$=old$
BZ� 6:old$=saveformat$:saveformat$="print":�2:�pre:�savesquare:�post:�3:saveformat$=old$
L� 7:finished%=�
V�
`�
j:
t!��Event_LoadFile(file$,type%)
~ș"Hourglass_On"
�Ȏ type% �
�>� &FFF:�new("load a new file")=1 �reset:�LoadWords(file$)
�R� filetype%:�new("load a new set of words and grid")=1 �reset:�LoadOwn(file$)
��
�ș"Hourglass_Off"
��
�:
���LoadWords(file$)
�file=�file$
�dummy$=�caps(�#file)
�]�dummy$,"ORD") � �dummy$,"UARE"):dimx=��#file:words%=0:solveformat$="text":�loadsquare:�
��#file:file=�file$
words%=1:�
dummy$=�#file
�len(dummy$)>2 �
>word$(words%)=�dummy$,18):len%(words%)=�len(word$(words%))
(-�caps% word$(words%)=�caps(word$(words%))
2
words%+=1
<�
F��#file �words%=169
Pwords%-=1:needs%=Ǝlen%()
Z
�#file
d�words%=0 �
n�sort(1)
x9�MenuDisable(main_Menu%,4):�MenuDisable(main_Menu%,6)
��rec(2)
��afterload
�!�WindowClose(display_Window%)
�C�file$,"Wimp$Scrap")=0 �IconPutText(savewords_Window%,1,file$)
��
�:
���afterload
ȉ�MenuEnable(main_Menu%,2):�MenuEnable(main_Menu%,3):�MenuEnable(main_Menu%,5):�MenuEnable(solve_Menu%,2):�MenuEnable(display_Menu%,2)
�:�I%=1�168:�IconPutText(words_Window%,I%+3,word$(I%)):�
�Swordstatus$=�(words%)+" words loaded.":�IconPutText(main_Window%,5,wordstatus$)
�<�IconPutText(main_Window%,9,�GetFileFromPathname(temp$))
�high%=0:�updatesolvestate
�>�I%=1�168:�words%<I% �IconPutText(words_Window%,I%+3,""):�
�ww
8�BringToTop(main_Window%):�BringToTop(words_Window%)
]�wordswind%=0 �MenuTick(main_Menu%,2):�MenuTick(solve_Menu%,2):�MenuTick(display_Menu%,2)
"'wordswind%=1:mainwind%=1:len%=�long
,�MenuEnable(words_Menu%,2)
6o�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy):�IconPutText(main_Window%,20,�gaps)
@�
J:
T��LoadOwn(file$)
^file=�file$
h;wsqtitle$=�#file:gaps=��#file:dimx=��#file:dimy=��#file
rwords%=��#file
|�I%=1�words%
�%word$(I%)=�#file:len%(I%)=��#file
�'start%(I%)=��#file:dir%(I%)=��#file
�show%(I%)=��#file
�#sx%(I%)=��#file:sy%(I%)=��#file
�#ex%(I%)=��#file:ey%(I%)=��#file
��
��I%=1�dimx*dimy
�grid%(I%)=�#file
��
�
�#file
�solveformat$="own"
��afterload
�*�IconPutText(main_Window%,9,wsqtitle$)
7�MenuEnable(main_Menu%,4):�MenuEnable(main_Menu%,6)
P�IconPutText(main_Window%,6,�oneormore(words%)+"placed - "+�gaps+"% gaps. ")
A�file$,"Wimp$Scrap")=0 �IconPutText(savewsq_Window%,1,file$)
&S�display:�IconPutText(solve_Window%,5,"Using wordsquare from creator program.")
08wsqx=dimx:wsqy=dimy:wsqwords%=words%:needs%=Ǝlen%()
:E�I%=1�words%:�show%(I%)>0 high%+=1:�sic(words_Window%,I%+3,wcol%)
D�
N�updatesolvestate
X�
b:
l��loadsquare
v �#file:file=�file$:d$=�#file
�dimy=0:d%=0:�:d$=�#file
�:�d$>0 dimy+=1:�I%=1�dimx:d%+=1:grid%(d%)=��d$,I%,1):�
���#file
�wsqx=dimx:wsqy=dimy
�
�#file
�2�:�I%=1�10:�d%:�IconDisable(main_Window%,d%):�
�Jwordstatus$="No words found.":�IconPutText(main_Window%,5,wordstatus$)
�*�I%=4�6�2:�MenuEnable(main_Menu%,I%):�
�high%=0
�p�BringToTop(solve_Window%):�BringToTop(display_Window%):�WindowClose(words_Window%):wordswind%=0:dispwind%=1
�|solvewind%=1:�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy):�IconPutText(main_Window%,20,"100")
�i�display:�IconPutText(solve_Window%,5,"Using textfile wordsquare '"+�GetFileFromPathname(temp$)+"'.")
�_�IconPutText(main_Window%,6,"Using textfile wordsquare '"+�GetFileFromPathname(temp$)+"'.")
3�IconPutText(solve_Window%,6,"No words found.")
A�file$,"Wimp$Scrap")=0 �IconPutText(savewsq_Window%,1,file$)
�
:
*��loadprefs
4file=�"<WordSq$Dir>.Prefs"
>-dbl%=��#file:force%=��#file:caps%=��#file
H/� dbl%=0 for spacing off, -1 for spacing on
R2� caps%=0 for preserve case, -1 for capitalise
\B� force%=0 for force single column, -1 for automatic selection
fcol%=��#file:mcol%=��#file
pwcol%=��#file:lcol%=��#file
z&titlefont$=�#file:titlept%=��#file
�$gridfont$=�#file:gridpt%=��#file
�&wordsfont$=�#file:wordspt%=��#file
�pre$=�#file:post$=�#file
�"overon$=�#file:overoff$=�#file
�$underon$=�#file:underoff$=�#file
�"emphon$=�#file:emphoff$=�#file
�
�#file
�3tempdbl%=dbl%:tempcaps%=caps%:tempforce%=force%
�Atempcol%=col%:tempwcol%=wcol%:templcol%=lcol%:tempmcol%=mcol%
�Ctemptitlept%=titlept%:tempgridpt%=gridpt%:tempwordspt%=wordspt%
�
�setprefs
�%�dbl%=0 �SetIcon(prefs_Window%,3)
�C�caps%=-1 �SetIcon(prefs_Window%,29):�SetIcon(prefs_Window%,30)
C�force%=0 �SetIcon(prefs_Window%,45):�SetIcon(prefs_Window%,46)
<�sib(prefs_Window%,50,col%):�sib(prefs_Window%,51,mcol%)
=�sib(prefs_Window%,53,wcol%):�sib(prefs_Window%,54,lcol%)
$�
.:
8:
B��setprefs
L[�IconPutText(prefs_Window%,7,titlefont$):�IconPutText(prefs_Window%,32,�titlept%+" pt")
VY�IconPutText(prefs_Window%,9,gridfont$):�IconPutText(prefs_Window%,35,�gridpt%+" pt")
`\�IconPutText(prefs_Window%,13,wordsfont$):�IconPutText(prefs_Window%,38,�wordspt%+" pt")
j��IconPutText(prefs_Window%,17,pre$):�IconPutText(prefs_Window%,23,post$):�IconPutText(prefs_Window%,24,overon$):�IconPutText(prefs_Window%,25,overoff$)
t��IconPutText(prefs_Window%,26,underon$):�IconPutText(prefs_Window%,27,underoff$):�IconPutText(prefs_Window%,41,emphon$):�IconPutText(prefs_Window%,43,emphoff$)
~<�sib(prefs_Window%,50,col%):�sib(prefs_Window%,51,mcol%)
�=�sib(prefs_Window%,53,wcol%):�sib(prefs_Window%,54,lcol%)
�9�I%=1�168:�show%(I%)>0 �sic(words_Window%,I%+3,wcol%)
��
�%�WindowForceDraw(display_Window%)
��
�:
���getprefs
�3dbl%=tempdbl%:caps%=tempcaps%:force%=tempforce%
�Acol%=tempcol%:mcol%=tempmcol%:wcol%=tempwcol%:lcol%=templcol%
�Otitlefont$=�IconText(prefs_Window%,7):titlept%=��IconText(prefs_Window%,32)
�Mgridfont$=�IconText(prefs_Window%,9):gridpt%=��IconText(prefs_Window%,35)
�Pwordsfont$=�IconText(prefs_Window%,13):wordspt%=��IconText(prefs_Window%,38)
Fpre$=�IconText(prefs_Window%,17):post$=�IconText(prefs_Window%,23)
Loveron$=�IconText(prefs_Window%,24):overoff$=�IconText(prefs_Window%,25)
Nunderon$=�IconText(prefs_Window%,26):underoff$=�IconText(prefs_Window%,27)
Lemphon$=�IconText(prefs_Window%,41):emphoff$=�IconText(prefs_Window%,43)
(9�I%=1�168:�show%(I%)>0 �sic(words_Window%,I%+3,wcol%)
2�
<%�WindowForceDraw(display_Window%)
F�
P:
Z#��Event_SaveFile(file$,window%)
dȎ window% �
n!� savewsq_Window%:�savesquare
x� solve_Window%
�� info_Window%
�� prefs_Window%
�)� savewords_Window%:�savewords(file$)
�� display_Window%
�� words_Window%
�� main_Window%
��
��MenuClose
��
�:
���savewords(file$)
�%�saveformat$<>"print" file=�file$
�$�I%=1�words%:�put(word$(I%),0):�
H�saveformat$<>"print" �#file:�"SETTYPE "+file$+" Text":wordssaved%=1
�
:
"��saveown(file$)
,1Ȕ dimx,wsqx:Ȕ dimy,wsqy:Ȕ words%,wsqwords%
6file=�file$
@;�#file,wsqtitle$:�#file,�gaps:�#file,�dimx:�#file,�dimy
J�#file,�words%
T�I%=1�words%
^%�#file,word$(I%):�#file,�len%(I%)
h'�#file,�start%(I%):�#file,�dir%(I%)
r�#file,�show%(I%)
|#�#file,�sx%(I%):�#file,�sy%(I%)
�#�#file,�ex%(I%):�#file,�ey%(I%)
��
��I%=1�dimx*dimy
��#file,grid%(I%)
��
�
�#file
��"SETTYPE "+file$+" 03C"
�1Ȕ dimx,wsqx:Ȕ dimy,wsqy:Ȕ words%,wsqwords%
�gridsaved%=1:wordssaved%=1
��
�:
���savesquare
�(�saveformat$="own" �saveown(file$):�
�copyover
1Ȕ dimx,wsqx:Ȕ dimy,wsqy:Ȕ words%,wsqwords%
,�saveformat$="draw" pad$=�160 � pad$=" "
&<len%=�long:b$()="":dummy%=0:�dbl%=-1 d%=dimx*2 � d%=dimx
0#�I%=1�dimy:�J%=1�dimx:dummy%+=1
:=b$(I%)+=�(grid%(dummy%)):�dbl%=-1 � J%<>dimx b$(I%)+=pad$
D�:�
N'dimx+=-(dbl%*dimx):�dbl%=-1 dimx-=1
X%�force%=0 � words%<=60 c%=1:�tJ[
b.�(words%>(4*dimy) � words%>120) c%=4:�tJ[
l2�saveformat$="draw" � dimx<(len%*2) c%=1:�tJ[
v-�words%>(1.3*dimy) � words%>60 c%=2:�tJ[
�c%=1
��saveformat$="imp" �tabs
�-�saveformat$<>"print" file=�file$:�header
�8�saveformat$<>"print" �#file,wsqtitle$:� �printtitle
�Ȏ c% �
�� 1:�format1
�� 2:�format2
�� 4:�format3
��
�[�dbl%=-1 � dimx/2=�(dimx/2) dimx=dimx/2:� �dbl%=-1 � dimx/2<>�(dimx/2) dimx=�(dimx/2)+1
�1Ȕ dimx,wsqx:Ȕ dimy,wsqy:Ȕ words%,wsqwords%
�
�copyback
�I�saveformat$<>"print" �#file,�10:�#file:�"SETTYPE "+file$+" Text" � �
gridsaved%=1:wordssaved%=1
�
:
��saveprefs
*
�getprefs
4file=�"<WordSq$Dir>.Prefs"
>-�#file,�dbl%:�#file,�force%:�#file,�caps%
H�#file,�col%:�#file,�mcol%
R�#file,�wcol%:�#file,�lcol%
\&�#file,titlefont$:�#file,�titlept%
f$�#file,gridfont$:�#file,�gridpt%
p&�#file,wordsfont$:�#file,�wordspt%
z�#file,pre$:�#file,post$
�"�#file,overon$:�#file,overoff$
�$�#file,underon$:�#file,underoff$
�"�#file,emphon$:�#file,emphoff$
�
�#file
��
�:
���SetIcon(w%,i%)
�4wimp%!0=w%:wimp%!4=i%:wimp%!8=&200000:wimp%!12=0
�!ș "Wimp_SetIconState",,wimp%
��
�:
���rec(type%)
��words%<1 dimx=0:dimy=0:�
�type%=2 gaps=25
needs%=Ǝlen%()
Ia=(1/(1-(gaps/100)))*needs%:dimy=�round(�(a/1.2)):dimx=�round(a/dimy)
$7� words%<=120 maxh=60 � maxh=�(59-((words%-120)/2))
.len%=�long
8�len%>�max �drec:�
B8�dimy<3 dimy=3 � � dimx>40 dimx=40:dimy=�round(a/40)
L�maxh<dimy dimy=maxh
V��gaps<10 � (dimx<len% � dimy<len%) �Alert("WordSq","All of these words will not fit into the largest size grid - you must delete a few, or shorten some of the longer ones.")
`�type%=2 gaps=�gaps
j�gaps<0 gaps=0
t'�IconPutText(main_Window%,20,�gaps)
~�
�:
�
��drec
�AI%=0:�:I%+=1:�I%*len%>a*0.95:dimx=len%:dimy=I%:�dimy<3 dimy=3
�;�type%=2 gaps=�gaps:�IconPutText(main_Window%,20,�gaps)
��
�:
�ݤlen(dummy$)
�TJ%=�dummy$:�I%=1��dummy$:C=�(�dummy$,I%,1)):� C<65 � C>122 � (C>90 � C<97) J%-=1
� �:=J%
�:
�
ݤlong
�/D=0:�I%=1�words%:�word$(I%)>D D=�word$(I%)
�:=D
:
ݤmax
�dimx>dimy =dimx � =dimy
(:
2ݤround(num)=�(num+0.5)
<:
F
��addword
P|w$=�IconText(main_Window%,26):�len(w$)<3 �Alert("WordSq","Words must be three alphabetical characters long or more."):�
Zș"Hourglass_On"
d��words%=0 �MenuEnable(main_Menu%,2):�MenuEnable(main_Menu%,3):�MenuEnable(main_Menu%,5):�MenuEnable(solve_Menu%,2):�MenuEnable(display_Menu%,2)
nwords%+=1:word$(words%)=w$
x
�clearall
�?�updatesolvestate:�caps% word$(words%)=�caps(word$(words%))
�$len%(words%)=�len(word$(words%))
��sort(1)
�=�I%=1�words%:�IconPutText(words_Window%,I%+3,word$(I%)):�
��ww
�S�rec(2):�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy)
���words%=1 �MenuEnable(words_Menu%,2):�wordswind%=0 wordswind%=1:�BringToTop(words_Window%):�MenuTick(solve_Menu%,2):�MenuTick(main_Menu%,2):�MenuTick(display_Menu%,2)
�P�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�caret(0)
�wordssaved%=0
�ș"Hourglass_Off"
��
�:
���deleteword
�selection%=0 �
�solveformat$<>"own" �DT_
`o%=-1:number%=0:�I%=1�words%:�selected%(I%)=1 � start%(I%)<>0 � dir%(I%)<>0 number%+=1:�:� �
"�number%>0 �
,^�selection%=1 d$="This word forms " � d$=�oneormore(number%)+"amongst the selection form "
6�o%=�WindowCancel("WordSq",d$+"part of the current wordsquare. Continuing with this operation will cause the wordsquare to be deleted. Click OK to delete.")
@�
JB�o%=0 � � �o%=-1 � number%>0 �WindowClose(display_Window%):�ng
Tș"Hourglass_On"
^�number%=0:�I%=1�words%:�selected%(I%)=1 word$(I%)="~~":number%+=1:�SetIcon(words_Window%,I%+3):selected%(I%)=0:�show%(I%)>0 show%(I%)=0:high%-=1
h�:selection%=0:�setbutton
r�sort(1):�rep(0)
|=�I%=1�words%:�IconPutText(words_Window%,I%+3,word$(I%)):�
�;words%-=number%:�solveformat$="text" wsqwords%-=number%
�%�updatesolvestate:needs%=Ǝlen%()
��words%=0 �
���MenuDisable(main_Menu%,3):�MenuDisable(main_Menu%,2):�MenuDisable(solve_Menu%,2):�MenuDisable(main_Menu%,5):�MenuDisable(display_Menu%,2):�WindowClose(words_Window%)
�O�MenuTick(main_Menu%,2):�MenuTick(solve_Menu%,2):�MenuTick(display_Menu%,2)
�wordswind%=0:wordssaved%=1
��
��words%>0 wordssaved%=0
�P�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�caret(0)
�6�ww:�dispwind%=1 �WindowForceDraw(display_Window%)
�[�solveformat$="text" gaps=�gaps:�IconPutText(main_Window%,20,�gaps):ș"Hourglass_Off":�
�/gaps=25:�IconPutText(main_Window%,20,�gaps)
�S�rec(2):�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy)
ș"Hourglass_Off"
�
:
&��amendword
0�selection%<>1 �
:|w$=�IconText(main_Window%,26):�len(w$)<3 �Alert("WordSq","Words must be three alphabetical characters long or more."):�
D�solveformat$="" �tJ`
N`o%=-1:number%=0:�I%=1�words%:�selected%(I%)=1 � start%(I%)<>0 � dir%(I%)<>0 number%+=1:�:� �
X�number%>0 �
b^�selection%=1 d$="This word forms " � d$=�oneormore(number%)+"amongst the selection form "
l�o%=�WindowCancel("WordSq",d$+"part of the current wordsquare. Continuing with this operation will cause the wordsquare to be deleted. Click OK to amend.")
v�
�B�o%=0 � � �o%=-1 � number%>0 �WindowClose(display_Window%):�ng
�ș"Hourglass_On"
�+�I%=1�words%:�selected%(I%)=1 dummy%=I%
�O�:word$(dummy%)=�IconText(main_Window%,26):len%(dummy%)=�len(word$(dummy%))
�P�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�caret(0)
�$�SetIcon(words_Window%,dummy%+3)
�F�sort(1):�I%=1�words%:�IconPutText(words_Window%,I%+3,word$(I%)):�
��ww
�/selected%(dummy%)=0:selection%=0:�setbutton
��updatesolvestate
�S�rec(2):�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy)
�wordssaved%=0
�ș"Hourglass_Off"
!�
!:
!��sort(type%)
! �type%=2 type%=1:r%=1 � r%=0
!*P%=words%�2:�P%=0�
!4�:R%=words%-P%:Q%=1
!>�:W%=Q%
!H�:U%=W%+P%
!R,�type%=1�word$(W%)<=word$(U%)ef%=1:�tDa
!\*�type%=0�len%(W%)>=len%(U%)ef%=1:�tDa
!fȔword$(W%),word$(U%)
!p��r%=0 Ȕlen%(W%),len%(U%):Ȕstart%(W%),start%(U%):Ȕdir%(W%),dir%(U%):Ȕshow%(W%),show%(U%):Ȕsx%(W%),sx%(U%):Ȕsy%(W%),sy%(U%):Ȕex%(W%),ex%(U%):Ȕey%(W%),ey%(U%)
!z
W%-=P%
!��W%<1�ef%=1:ef%=0:Q%+=1
!��Q%>R%:P%=P%�2
!� �P%=0
!��
!�:
!���rep(type%)
!�"�I%=1�words%:�word$(I%)="~~" �
!�word$(I%)=""
!�s�type%=0 len%(I%)=0:start%(I%)=0:dir%(I%)=0:selected%(I%)=0:show%(I%)=0:sx%(I%)=0:sy%(I%)=0:ex%(I%)=0:ey%(I%)=0
!��
!��
!��
!�:
"��bumpx(inc%)
"�words%=0 �
"�button%=1 inc%=-inc%
"$+� (dimx*dimy)<(needs%*1.12) � inc%=-1 �
"..� (dimx=40 � inc%>0) � (dimx=0 � inc%<0) �
"8&dimx+=inc%:� �gaps<10:dimx-=inc%:�
"B'�IconPutText(main_Window%,12,�dimx)
"L2gaps=�gaps:�IconPutText(main_Window%,20,�gaps)
"V�
"`:
"j��bumpy(inc%)
"t�words%=0 �
"~�button%=1 inc%=-inc%
"�5� (dimx*dimy)<(needs%*(1+(gaps/100))) � inc%=-1 �
"�0� (dimy=maxh � inc%>0) � (dimy=0 � inc%<0) �
"�&dimy+=inc%:� �gaps<10:dimy-=inc%:�
"�'�IconPutText(main_Window%,16,�dimy)
"�2gaps=�gaps:�IconPutText(main_Window%,20,�gaps)
"��
"�:
"���bumpgaps(inc%)
"��gaps<10 �rec(0):�
"��button%=1 inc%=-inc%
"�� (gaps=10 � inc%=-1) �
"�� (gaps=maxh � inc%=1) �
# gaps+=inc%
#
'�IconPutText(main_Window%,20,�gaps)
#S�rec(0):�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy)
#�
#(:
#2ݤbumppt(inc%,dummy%,d%)
#<9� (dummy%=6 � inc%=-1) � (dummy%=24 � inc%=1):=dummy%
#F�button%=1 inc%=-inc%
#P=dummy%+=inc%:�IconPutText(prefs_Window%,d%,�dummy%+" pt")
#Z=dummy%
#d:
#n
ݤgaps
#x�dimx*dimy=0 =gaps
#�3=�round((((dimx*dimy)-needs%)/(dimx*dimy))*100)
#�:
#�ݤoneormore(dummy%)
#�� dummy%=1 ="1 word "
#�� dummy%=0 ="No words "
#�=�dummy%+" words "
#�:
#�ݤnone(dummy%)
#�%�dummy%=0 ="None " � =�dummy%+" "
#�:
#���create
#�T� words%<1 �Alert("WordSq","There are no words to be placed in a wordsquare!"):�
#�Xd%=0:�words%<121 �Tbd �:�(dbl%=0 � dimx<((len%*2)+1)) � (dbl%=-1 � dimx<(len%+1)) �
$&� dbl%=0 d%=(len%*2)+1 � d%=len%+1
$��Alert("WordSq","The number of words means that the grid must be at least "+�d%+" characters across. Please reset this value and try again.")
$�
$"�d%>0 �
$,'wsqtitle$=�IconText(main_Window%,9)
$6��(dimx*dimy)<(1.1*needs%) � (dimx<len% � dimy<len%) �Alert("WordSq","All of these words will not fit into the largest size grid - you must delete a few, or shorten some of the longer ones."):�
$@ș"Hourglass_On"
$Jwsqx=dimx:wsqy=dimy
$T*not%=0:pla%=0:F%=0:startx%=0:starty%=0
$^*grid%()=0:start%()=0:dir%()=0:�sort(0)
$h*Z%=0:�I%=1�words%:w$=�strip(word$(I%))
$rA%=0:tr%=0:F%=0
$|�:tr%+=1
$�8�-113 �Alert("WordSq","Creation interrupted."):Z%=1
$�A%=�(dimx*dimy)
$�/� grid%(A%)<>0 � grid%(A%)<>�(�w$,1)) �tPd
$��ends:�fit
$�-�F%=1 � Z%=1 � tr%>=(dimx*dimy)+dimx+dimy
$�"�Z%=1 I%=words%+1:�:�ng:Z%=0:�
$�J�tr%>=(dimx*dimy)+dimx+dimy not%+=1:start%(I%)=0:dir%(I%)=99:� pla%+=1
$�P�IconPutText(main_Window%,6,"Creating - "+�oneormore(pla%)+"placed so far.")
$�)�dir%(I%)<>99 �positions(I%,dir%(I%))
$�;ș"Hourglass_Percentage",�round((pla%+not%)/words%*100)
$�b�:�gaps:�sort(1):�IconPutText(main_Window%,6,�oneormore(pla%)+"placed - "+�wsqgaps+"% gaps. ")
$�$ș"Hourglass_Off":wsqwords%=pla%
$��� pla%=0 �Alert("WordSq","In fact, no words could be placed. Try increasing the grid size."):�IconPutText(main_Window%,6,"No grid formed."):�
%
�not%>0 �
%!�not%=1 d$="It " � d$="They "
%��Alert("WordSq","When creating the wordsquare, "+�oneormore(not%)+"could not be placed. "+d$+"will remain in memory and appear selected in the word list window, but will not show up on the wordsquare.")
%&+�clearall:selectedword$="":�I%=1�words%
%0n�dir%(I%)=99 dir%(I%)=0:�SetIcon(words_Window%,I%+3):selected%(I%)=1:selection%+=1:selectedword$=word$(I%)
%:�:�setbutton
%D*�selection%=1 d$=selectedword$ � d$=""
%NT�IconPutText(main_Window%,26,d$):�IconPutText(solve_Window%,17,d$):�caret(�d$/2)
%X�
%bQ�MenuEnable(main_Menu%,4):�MenuEnable(main_Menu%,5):�MenuEnable(main_Menu%,6)
%l1�display:solveformat$="own":�updatesolvestate
%vJ�IconPutText(solve_Window%,5,"Using wordsquare from creator program.")
%�,�solvewind% �BringToTop(display_Window%)
%�$wsqx=dimx:wsqy=dimy:gridsaved%=0
%��
%�:
%�ݤcaps(d$)
%��K%
%��d$=0 =""
%��K%=1��d$:ch%=�(�d$,K%,1))
%�*�ch%>96 � ch%<123 �d$,K%,1)=�(ch%�223)
%��
%�=d$
%�:
%�
��ends
&Cpo=A%:po-=1:�:po+=1:��(po/dimx)=po/dimx:me%=po:mw%=me%-(dimx-1)
&�
&:
& ��fit
&*L%=�w$-1
&4C�A%-L%>=mw% � A%-(dimx*L%)>=1 �fill(-1,-dimx):dir%(I%)=8:� F% �
&>J�A%-L%>=mw% � A%+(dimx*L%)<=dimx*dimy �fill(-1,dimx):dir%(I%)=6:� F% �
&HI�A%+L%<=me% � A%+(dimx*L%)<=dimx*dimy �fill(1,dimx):dir%(I%)=4:� F% �
&RB�A%+L%<=me% � A%-(dimx*L%)>=1 �fill(1,-dimx):dir%(I%)=2:� F% �
&\-�A%-L%>=mw% �fill(-1,0):dir%(I%)=7:� F% �
&f5�A%-(dimx*L%)>=1 �fill(0,-dimx):dir%(I%)=1:� F% �
&p<�A%+(dimx*L%)<=dimx*dimy �fill(0,dimx):dir%(I%)=5:� F% �
&z,�A%+L%<=me%:�fill(1,0):dir%(I%)=3:� F% �
&��
&�:
&���fill(x,y)
&�p%=A%:�K%=2��w$:p%+=(x+y)
&�7�grid%(p%)<>�(�w$,K%,1))� grid%(p%)<>0 K%=�w$+1:�:�
&��
&�start%(I%)=A%
&�;p%=A%:�K%=1��w$:grid%(p%)=�(�w$,K%,1)):p%+=(x+y):�:F%=1
&��
&�:
&�
��gaps
&�Hwsqgaps=0:�I%=1�dimx*dimy:�grid%(I%)=0 grid%(I%)=�(26)+64:wsqgaps+=1
&�/�:wsqgaps=�round((wsqgaps/(dimx*dimy))*100)
'�
':
'
��format1
'$�I%=1�words%
'.)�I%=1 �under � �I%=dimy+1 �over:�DVg
'8P�saveformat$="draw" �#file,"\1";:��saveformat$="imp" �#file,"{""Grid"" on}";
'BE�I%<=dimy �put(b$(I%),1):� �saveformat$<>"imp" �put(�pad(dimx),1)
'LQ�saveformat$="draw" �#file,"\2";:��saveformat$="imp" �#file,"{""Words"" on}";
'V�put(�pad(3),1)
'`�put(word$(I%),0):�
'j*�words%=dimy �over:�:�� words%>=dimy �
'td�I%=words%+1 � dimy:�saveformat$="draw" �#file,"\1";:��saveformat$="imp" �#file,"{""Grid"" on}";
'~�put(b$(I%),0):�
'��
'��
'�:
'�
��format2
'�L�(words%/2)<>words%/2 C1=�(words%/2)+1:C2=words%-C1:� C1=words%/2:C2=C1
'��I%=1�C1
'�)�I%=1 �under � �I%=dimy+1 �over:�dlg
'�Q�saveformat$="draw" �#file,"\1";:� �saveformat$="imp" �#file,"{""Grid"" on}";
'�E�I%<=dimy �put(b$(I%),1):� �saveformat$<>"imp" �put(�pad(dimx),1)
'�R�saveformat$="draw" �#file,"\2";:� �saveformat$="imp" �#file,"{""Words"" on}";
'�\�put(�pad(3),1):�put(word$(I%),1):�put(�pad(len%-�word$(I%)+1),1):�put(word$(C1+I%),0):�
'�"�C1=dimy �over:�:�� C1>=dimy �
( Q�saveformat$="draw" �#file,"\1";:� �saveformat$="imp" �#file,"{""Grid"" on}";
(
$�I%=C1+1 � dimy:�put(b$(I%),0):�
( �over
(�
((:
(2
��format3
(<AC%=words%-((dimy+1)*2):D%=C%+1:�:D%-=1:��(D%/4)=D%/4:E%=C%-D%
(F)� E%=0:E%=4:C1=D%/4:C2=C1:C3=C1:C4=C3
(P*� E%=1:C1=(D%/4)+1:C2=D%/4:C3=C2:C4=C3
(Z0� E%=2:C1=(D%/4)+1:C2=(D%/4)+1:C3=D%/4:C4=C3
(d6� E%=3:C1=(D%/4)+1:C2=(D%/4)+1:C3=(D%/4)+1:C4=D%/4
(n�I%=1�dimy
(x�I%=1�under
(�Q�saveformat$="draw" �#file,"\1";:� �saveformat$="imp" �#file,"{""Grid"" on}";
(�q�put(b$(I%),1):�put(�pad(3),1):�saveformat$="draw" �#file,"\2";:� �saveformat$="imp" �#file,"{""Words"" on}";
(�e�put(word$(C1+C2+I%),1):�put(�pad(len%+1-�word$(C1+C2+I%)),1):�put(word$(dimy+C1+C2+C3+1+I%),0):�
(�Q�saveformat$="draw" �#file,"\1";:� �saveformat$="imp" �#file,"{""Grid"" on}";
(��over:�put(�pad(3),1)
(�R�saveformat$="draw" �#file,"\2";:� �saveformat$="imp" �#file,"{""Words"" on}";
(�m�put(word$(dimy+C1+C2+1),1):�put(�pad(len%+1-�word$(dimy+C1+C2+1)),1):�put(word$(dimy+dimy+C1+C2+C3+2),0)
(��I%=1�C1
(�R�saveformat$="draw" �#file,"\2";:� �saveformat$="imp" �#file,"{""Words"" on}";
(�5�put(word$(I%),1):�put(�pad(len%+1-�word$(I%)),1)
(�s�I%<C1 � (I%=C1 � E%>=2) �put(word$(C1+I%),1):�put(�pad(dimx+3-(len%+1-�word$(I%)+�word$(I%)+�word$(C1+I%))),1)
(�h�I%<C1 � (I%=C1 � E%>=3) �put(word$(dimy+C1+C2+1+I%),1):�put(�pad(len%+1-�word$(dimy+C1+C2+1+I%)),1)
(�C�I%<C1 � (I%=C1 � E%>=4) �put(word$(dimy+dimy+C1+C2+C3+2+I%),0)
)�
)�
):
)"
��tabs
),case%=�case
)6&�case%=0 a=2.7:b=0.44 � a=4:b=0.65
)@Ȏ c% �
)JE� 1:t1%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:tab$="tabs "+�t1%+"pt"
)Tv� 2:t1%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:t2%=t1%+5+(len%*(a+((wordspt%-6)*b))):tab$="tabs "+�t1%+"pt,"+�t2%+"pt"
)^�� 4:t1%=15+(len%*(a+((wordspt%-6)*b))):t2%=(dimx*(3.65+((gridpt%-6)*0.6)))+22:t3%=t2%+15+(len%*(a+((wordspt%-6)*b))):tab$="tabs "+�t1%+"pt,"+�t2%+"pt,"+�t3%+"pt"
)h�
)r�
)|:
)���header
)�Ȏ saveformat$ �
)�� "text"
)��� "draw":header$="\! 1"+�10+"\F 0 "+titlefont$+" "+�titlept%+�10+"\F 1 "+gridfont$+" "+�gridpt%+�10+"\F 2 "+wordsfont$+" "+�wordspt%+�10+"\L"+�(�round(gridpt%*1.08))+�10
)�9header$+="\P"+�(�round((gridpt%*1.08)/1.75))+�10+"\0"
)��#file,header$
)¯� "imp":header$="{define style ""Title"";font "+titlefont$+";fontsize "+�titlept%+"pt;"+tab$+"}{define style ""Grid"";font "+gridfont$+";fontsize "+�gridpt%+"pt;"+tab$+"}"
)�kheader$+="{define style ""Words"";font "+wordsfont$+";fontsize "+�wordspt%+"pt;"+tab$+"}{""Title"" on}"
)��#file,header$;
)��
)��
)�:
)�
ݤpad(d%)
* � saveformat$="imp" ="{tab}"
*#� saveformat$="draw" =�d%,�160)
*
=�d%," ")
*&:
*0��put(d$,d%)
*:%�saveformat$="print" �d$;:�d%=0 �
*D4�saveformat$<>"print" �#file,d$;:�d%=0 �#file,""
*N�
*X:
*b
��over
*l5�saveformat$="draw" a$="\1":b$=�pad(dimx):c$="\2"
*v�saveformat$="imp" �
*��c%=4 b$="{tab}" � b$=""
*�*a$="{""Grid"" on}":c$="{""Words"" on}"
*��
*�1�saveformat$="text" a$="":b$=�pad(dimx):c$=""
*�G�saveformat$<>"print" � overon$="" � overoff$="" �put(a$+b$+c$,1):�
*�;�getecho(overon$):�put(�pad(dimx),1):�getecho(overoff$)
*��
*�:
*���under
*�C�saveformat$<>"print" � underon$="" � underoff$="" �put("",0):�
*�=�getecho(underon$):�put(�pad(dimx),0):�getecho(underoff$)
*��
*�:
+ ��pre
+%�saveformat$<>"print" � pre$="" �
+�getecho(pre$)
+ �
+*:
+4
��post
+>&�saveformat$<>"print" � post$="" �
+H�getecho(post$)
+R�
+\:
+f��printtitle
+p*�emphon$="" � emphoff$="" �wsqtitle$:�
+z3�getecho(emphon$):�wsqtitle$:�getecho(emphoff$)
+��
+�:
+���getecho(d$)
+�d%=1
+�e�K%=1��d$:dummy$="":�d$,K%,1)="," dummy$=�d$,d%,K%-d%):d%=K%+1:� � K%=�d$ dummy$=�d$,d%,K%-d%+1)
+��dummy$<>"" �1;��dummy$;
+��
+��
+�:
+���caret(c%)
+�Q�c%>1000 � solvewind% c%-=1000:�IconCaret(solve_Window%,17,c%):� � �c%>1000 �
+�/�solvewind% �IconCaret(solve_Window%,17,c%)
+�D�mainwind% � solveformat$<>"text" �IconCaret(main_Window%,26,c%)
,�
,:
,ݤnew(extra$)
,$fmessage$="You have not saved your ":�wordssaved%=0 message$+="words":�gridsaved%=0 message$+=" or"
,.6�gridsaved%=0 message$+=" grid. " � message$+=". "
,84message$+="Are you sure you want to "+extra$+"?"
,B-�wordssaved%=1 � gridsaved%=1 message$=""
,L9� message$<>"":�WindowCancel("WordSq",message$)=0 =0
,V=1
,`:
,j��reset
,tș"Hourglass_On"
,~
�closeall
,�Mselection%=0:word$()="":grid%()=0:start%()=0:dir%()=0:len%()=0:�setbutton
,�Dwords%=0:gaps=25:dimx=0:dimy=0:solveformat$="":high%=0:show%()=0
,�<sx%()=0:sy%()=0:ex%()=0:ey%()=0:show%=0:found%=0:done%=0
,�Lwsqx=0:wsqy=0:wsqwords%=0:wordssaved%=1:gridsaved%=1:startx%=0:starty%=0
,�1�:�I%=1�10:�d%:�IconEnable(main_Window%,d%):�
,�c�IconPutText(main_Window%,5,"No words entered."):�IconPutText(main_Window%,6,"No grid formed.")
,�o�IconPutText(main_Window%,12,�dimx):�IconPutText(main_Window%,16,�dimy):�IconPutText(main_Window%,20,�gaps)
,·�IconPutText(solve_Window%,5,"No wordsquare currently available."):�IconPutText(solve_Window%,6,"No words available - None shown.")
,�p�IconPutText(main_Window%,26,""):�IconPutText(solve_Window%,17,""):�IconPutText(main_Window%,9,"<Untitled>")
,��I%=4 � 171:�IconPutText(words_Window%,I%,""):�sic(words_Window%,I%,7):�selected%(I%-3)=1 selected%(I%-3)=0:�SetIcon(words_Window%,I%):�:� �
,��ww
,�]�wordswind%=1 �MenuTick(display_Menu%,2):�MenuTick(main_Menu%,2):�MenuTick(solve_Menu%,2)
- ��MenuDisable(main_Menu%,2):�MenuDisable(main_Menu%,3):�MenuDisable(main_Menu%,4):�MenuDisable(main_Menu%,5):�MenuDisable(display_Menu%,2)
-
�MenuDisable(solve_Menu%,2)
-�MenuDisable(words_Menu%,2)
-6selected%()=0:mainwind%=0:solvewind%=0:dispwind%=0
-(ș"Hourglass_Off"
-2�
-<:
-F��ng
-PCgrid%()=0:start%()=0:dir%()=0:solveformat$="":high%=0:show%()=0
-ZCwsqx=0:wsqy=0:wsqwords%=0:gridsaved%=1:show%=0:found%=0:done%=0
-d2�IconPutText(main_Window%,6,"No grid formed.")
-n��IconPutText(solve_Window%,5,"No wordsquare currently available."):�IconPutText(solve_Window%,6,"No words available - None shown.")
-xT�MenuDisable(main_Menu%,4):�MenuDisable(main_Menu%,5):�MenuDisable(main_Menu%,6)
-�(�I%=4�171:�sic(words_Window%,I%,7):�
-�7�Z%=1 ș"Hourglass_On":�sort(1):ș"Hourglass_Off":�
-�gaps=25:dimx=0:dimy=0
-�'�IconPutText(main_Window%,20,�gaps)
-��
-�:
-���closeall
-Ȑ�WindowClose(display_Window%):�WindowClose(main_Window%):�WindowClose(solve_Window%):�WindowClose(words_Window%):�WindowClose(prefs_Window%)
-�)wordswind%=0:solvewind%=0:dispwind%=0
-��
-�:
-�
��display
-�6dummy%=0:�I%=1�dimy:dummy$="":�J%=1�dimx:dummy%+=1
.2dummy$+=�(grid%(dummy%)):�J%<>dimx dummy$+=" "
.*�:�dummy$<79 dummy$+=�79-�dummy$," ")
./�IconPutText(display_Window%,I%+1,dummy$):�
."H�dimy<60 �I%=dimy+1�60:�IconPutText(display_Window%,I%+1,�79," ")):�
.,;�resize(display_Window%,0,-84-(dimy*44),54+(dimx*32),0)
.6�
.@:
.J��updatesolvestate
.TȎ solveformat$ �
.^� "own"
.h�wordstatus$=�oneormore(wsqwords%)+"in the grid - "+�none(high%)+"shown - "+�none(selection%)+"selected.":�IconPutText(solve_Window%,6,wordstatus$)
.rvwordstatus$=�oneormore(words%)+"entered - "+�none(selection%)+"selected.":�IconPutText(main_Window%,5,wordstatus$)
.|� "text"
.��wordstatus$=�oneormore(wsqwords%)+"in the grid - "+�none(high%)+"shown - "+�none(selection%)+"selected.":�IconPutText(solve_Window%,6,wordstatus$)
.�wwordstatus$=�oneormore(wsqwords%)+"found - "+�none(selection%)+"selected.":�IconPutText(main_Window%,5,wordstatus$)
.�� ""
.�vwordstatus$=�oneormore(words%)+"entered - "+�none(selection%)+"selected.":�IconPutText(main_Window%,5,wordstatus$)
.��
.��
.�:
.���setbutton
.�.�selection%<2 d$=" Word" � d$=" Selection"
.�-�IconPutText(main_Window%,25,"Delete"+d$)
.�-�IconPutText(solve_Window%,8,"Remove"+d$)
.�+�IconPutText(solve_Window%,9,"Show"+d$)
.��
/:
/��find(d$)
/ș"Hourglass_On"
/&w$=�strip(d$)
/0F%=0:I%=words%+1
/:�A%=1�dimx*dimy
/D/ș"Hourglass_Percentage",A%/(dimx*dimy)*100
/N �grid%(A%)=��d$,1) �nextstep
/X�
/bș"Hourglass_Off"
/lc�F%=0 �Alert("WordSq","The word '"+d$+"' does not exist in the currently loaded wordsquare."):�
/v��F%>1 � �palindrome(d$)=0 �Alert("WordSq","More than one occurrence of "+gibbet$+" has been found, so it will be ignored"):�
/�ș"Hourglass_On"
/�9d$=�IconText(solve_Window%,17):�caps%=-1 d$=�caps(d$)
/�lwords%+=1:wsqwords%+=1:word$(words%)=d$:len%(words%)=�len(d$):dir%(words%)=d%:needs%=Ǝlen%():gaps=�gaps
/�#�positions(words%,dir%(words%))
/�_high%+=1:show%(words%)=1:�sort(1):�I%=1�words%:�IconPutText(words_Window%,I%+3,word$(I%)):�
/��ww
/�need%=1:wordssaved%=0
/�ș"Hourglass_Off"
/��
/�:
/���nextstep
/��ends:L%=�d$-1
/�?�A%-L%>=mw%�A%-(dimx*L%)>=1:dir%(I%)=8:�getstring(-1,-dimx)
0F�A%-L%>=mw%�A%+(dimx*L%)<=dimx*dimy:dir%(I%)=6:�getstring(-1,dimx)
0G�A%+L%<=me% � A%+(dimx*L%)<=dimx*dimy:dir%(I%)=4:�getstring(1,dimx)
0@�A%+L%<=me% � A%-(dimx*L%)>=1:dir%(I%)=2:�getstring(1,-dimx)
0 +�A%-L%>=mw%:dir%(I%)=7:�getstring(-1,0)
0*3�A%-(dimx*L%)>=1:dir%(I%)=1:�getstring(0,-dimx)
04:�A%+(dimx*L%)<=dimx*dimy:dir%(I%)=5:�getstring(0,dimx)
0>*�A%+L%<=me%:dir%(I%)=3:�getstring(1,0)
0H�
0R:
0\��getstring(x,y)
0f>dummy$=�d$,1):p%=A%:�J%=2��d$:p%+=x+y:dummy$+=�grid%(p%):�
0p/� dummy$=d$ F%+=1:start%(I%)=A%:d%=dir%(I%)
0z�
0�:
0�ݤexists(d$)
0�ș"Hourglass_On"
0�9e%=0:�W%=1�words%:� d$=�strip(�caps(word$(W%))) e%=W%
0��
0�ș"Hourglass_Off"
0�=e%
0�:
0�ݤpalindrome(o$)
0�/dummy$="":�o%=�o$�1 �-1:dummy$+=�o$,o%,1):�
0��o$=dummy$ =1 � =0
0�:
0���copyover
1temp$()=""
1$�I%=1�words%:temp$(I%)=word$(I%)
1-�start%(I%)=0 � dir%(I%)=0 word$(I%)="~~"
1$�:�sort(2):�rep(1)
1.�
18:
1B��copyback
1Lword$()=""
1V(�I%=1�words%:Ȕtemp$(I%),word$(I%):�
1`�
1j:
1t��autoload
1~ș "OS_GetEnv" � d$
1�d$=�d$,�d$-20)
1�ȕ �d$,1)<>" " � �d$<>0
1�d$=�d$,�d$-1)
1��
1��d$=" " d$=""
1��
1�:
1���crossout(d%)
1�8xpos%=x_origin%+14:ypos%=y_origin%-((d%-2)*36)-252+6
1�/� xpos%,ypos%:� xpos%+(len%(d%)*16)+2,ypos%
1��
1�:
2 ��sic(w%,i%,c%)
2
:!wimp%=w%:wimp%!4=i%:wimp%!8=c%<<24:wimp%!12=&0F000000
2!ș"Wimp_SetIconState",0,wimp%
2�
2(:
22��sib(w%,i%,c%)
2<:!wimp%=w%:wimp%!4=i%:wimp%!8=c%<<28:wimp%!12=&F0000000
2F!ș"Wimp_SetIconState",0,wimp%
2P�
2Z:
2d ݤgetword(startpos%,endpos%)
2nFA%=startpos%:Ȕwsqx,dimx:Ȕwsqy,dimy:�ends:Ȕwsqx,dimx:Ȕwsqy,dimy
2x,scol%=startpos%�wsqx:�scol%=0 scol%=wsqx
2�*ecol%=endpos%�wsqx:�ecol%=0 ecol%=wsqx
2�7srow%=((startpos%-1)�wsqx):erow%=((endpos%-1)�wsqx)
2�4�srow%>erow% � scol%=ecol% dx%=0:dy%=-wsqx:�dfr
2�4�srow%>erow% � scol%<ecol% dx%=1:dy%=-wsqx:�dfr
2�0�srow%=erow% � scol%<ecol% dx%=1:dy%=0:�dfr
2�3�srow%<erow% � scol%<ecol% dx%=1:dy%=wsqx:�dfr
2�3�srow%<erow% � scol%=ecol% dx%=0:dy%=wsqx:�dfr
2�4�srow%<erow% � scol%>ecol% dx%=-1:dy%=wsqx:�dfr
2�1�srow%=erow% � scol%>ecol% dx%=-1:dy%=0:�dfr
2�/�srow%>erow% � scol%>ecol% dx%=-1:dy%=-wsqx
2�dummy$="":p%=startpos%:o%=0
2��
2�dummy$+=�grid%(p%)
3p%+=dx%+dy%
3-�p%=endpos% o%=1:dummy$+=�grid%(p%):p%=-1
3� p%<0 � p%>(wsqx*wsqy)
3"/�o%=1 ��dummy$<19 � �dummy$>2 =dummy$ � =""
3,:
36ݤstrip(o$)
3@Kc$=�caps(o$):o%=�c$:o$="":�J%=1�o%:e$=�c$,J%,1):�e$<="Z"�e$>="A" o$+=e$
3J�
3T=o$
3^:
3h��positions(d%,dir%)
3r?�start%(d%)�wsqx=0 xpos%=wsqx-1 � xpos%=(start%(d%)�wsqx)-1
3|ypos%=(start%(d%)�wsqx)
3�0�start%(d%)/wsqx=�(start%(d%)/wsqx) ypos%-=1
3�+xpos%=(xpos%*32)+25:ypos%=(ypos%*44)+68
3�
Ȏ dir% �
3�� 1:dx%=0:dy%=44
3�� 2:dx%=32:dy%=44
3�� 3:dx%=32:dy%=0
3�� 4:dx%=32:dy%=-44
3�� 5:dx%=0:dy%=-44
3�� 6:dx%=-32:dy%=-44
3�� 7:dx%=-32:dy%=0
3�� 8:dx%=-32:dy%=44
3��
3�dy%=-dy%
4asx%(d%)=xpos%:sy%(d%)=ypos%:ex%(d%)=xpos%+((len%(d%)-1)*dx%):ey%(d%)=ypos%+((len%(d%)-1)*dy%)
4�
4:
4&
ݤcase
40d%=0
4:P�I%=1�words%:�J%=1��word$(I%):d$=�word$(I%),J%,1):� d$>="A" � d$<="Z" d%+=1
4D�:�
4N�d%>(words%*2.5) =1 � =0
4X:
4bݤorigin
4l=16+wimp%!4-wimp%!20-18
4v:
4�#� 11,13,15,17,19,21,24,26,28,29
4�:
4���Alert(title$,message$)
4� �AlertBox(title$,message$,0)
4��
4�:
4�'��AlertBox(title$,message$,button%)
4�/�response%:$(wimp%+4)=message$:Ȏ button% �
4�� 1:response%=15
4�� 2:response%=1
4�� 3:response%=(1<<5)+16
4�� 4:response%=(1<<6)+16
4�:response%=16
5�
5=ș "Wimp_ReportError",wimp%,response%,title$ � ,response%
5�
5 :
5*#ݤWindowCancel(title$,message$)
54$$(wimp%+4)=message$:response%=23
5>=ș "Wimp_ReportError",wimp%,response%,title$ � ,response%
5H=response%-2
5R:
5\ݤWindowTitle(window%)
5fwimp%!0=window%
5p ș "Wimp_GetWindInfo",,wimp%
5z6� ((wimp%!60)�&100)=0 � 1,"Title isn't indirected"
5�=$(wimp%!76)
5�:
5�ݤWindowLoad(window$)
5�6=�WindowLoadFrom(window$,"<WordSq$Dir>.Templates")
5�:
5�'ݤWindowLoadFrom(window$,template$)
5�� c%,i%,n%,j%,sp$,sp2$
5�%ș "Wimp_OpenTemplate",,template$
5�Mș "Wimp_LoadTemplate",,wimp%,icons%,icon_memory%,-1,window$,0 � ,,icons%
5�Ȏ sprites% �
5�� 1:wimp%!64=sprites%
5�:wimp%!64=sprites%
5��
6&ș "Wimp_CreateWindow",,wimp% � c%
6ș "Wimp_CloseTemplate"
67ș "Wimp_WhichIcon",c%,wimp%+40,1+2+(1<<8),2+(1<<8)
6$Ȏ wimp%!40 �
6.� -1
68:i%=40
6B�
6Lwimp%!4=wimp%!i%:wimp%!0=c%
6V!ș "Wimp_GetIconState",,wimp%
6`%sp$=�GetStringAtAddress(wimp%!28)
6jș "Wimp_DeleteIcon",,wimp%
6tȎ sprites% �
6~� 1:wimp%!32=1
6�
6�*ș "OS_SpriteOp",&108,sprites% � ,,,n%
6�j%=0
6��:j%+=1
6�7ș "OS_SpriteOp",&10D,sprites%,pointer_block%,20,j%
6�,sp2$=�GetStringAtAddress(pointer_block%)
6�� j%=n% � sp$=sp2$
6�/� sp$=sp2$ � wimp%!32=sprites% � wimp%!32=1
6��
6�wimp%!4=c%
6�+ș "Wimp_CreateIcon",,wimp%+4 � handle%
6� i%+=4
7 � (wimp%!i%)=-1
7
�
7=c%
7:
7(��BringToTop(window%)
72!wimp%=window%
7<#ș "Wimp_GetWindowState",,wimp%
7Fwimp%!28=-1
7Pș "Wimp_OpenWindow",,wimp%
7Z(�window%=display_Window% dispwind%=1
7d�
7n:
7x��WindowClose(window%)
7�!wimp%=window%
7� ș "Wimp_CloseWindow",,wimp%
7�(�window%=display_Window% dispwind%=0
7��
7�:
7���WindowForceDraw(window%)
7�Ȏ window% �
7�3� -1:ș "Wimp_ForceRedraw",-1,0,0,2*1280,2*1024
7�6:ș "Wimp_ForceRedraw",window%,0,-2*1024,2*1280,0
7��
7��
7�:
7���WindowOpen(window%)
8!wimp%=window%
8#ș "Wimp_GetWindowState",,wimp%
8ș "Wimp_OpenWindow",,wimp%
8"�
8,:
86�WindowInterface
8@ ș"Wimp_BorderWindow",,wimp%
8J�
8T:
8^ݤIconBar(Sprite$)
8h� icon%
8rwimp%!0=-1
8|wimp%!4=0:wimp%!8=0
8�wimp%!12=68:wimp%!16=68
8�wimp%!20=&3002
8�$(wimp%+24)=Sprite$
8�'ș "Wimp_CreateIcon",,wimp% � icon%
8�
=icon%
8�:
8�%��IconCaret(window%,icon%,chars%)
8�8ș "Wimp_SetCaretPosition",window%,icon%,,,-1,chars%
8��
8�:
8�ݤIconText(window%,icon%)
8�!wimp%!0=window%:wimp%!4=icon%
8�!ș "Wimp_GetIconState",,wimp%
9Y� ((wimp%!24) � &100)=0 � 1,"Icon "+�icon%+" in window "+�window%+" isn't indirected"
9=$(wimp%!28)
9:
9&#ݤIconValidation(window%,icon%)
90!wimp%!0=window%:wimp%!4=icon%
9:!ș "Wimp_GetIconState",,wimp%
9DY� ((wimp%!24) � &100)=0 � 1,"Icon "+�icon%+" in window "+�window%+" isn't indirected"
9N=$(wimp%!32)
9X:
9b ��IconDisable(window%,icon%)
9l!wimp%!0=window%:wimp%!4=icon%
9v wimp%!8=1<<22:wimp%!12=1<<22
9�!ș "Wimp_SetIconState",,wimp%
9��
9�:
9���IconEnable(window%,icon%)
9�!wimp%!0=window%:wimp%!4=icon%
9�wimp%!8=0:wimp%!12=1<<22
9�!ș "Wimp_SetIconState",,wimp%
9��
9�:
9�*ݤIconPutSprite(window%,icon%,sprite$)
9�!wimp%!0=window%:wimp%!4=icon%
9�!ș "Wimp_GetIconState",,wimp%
9�ș "Wimp_DeleteIcon",,wimp%
:6wimp%!4=wimp%!8:wimp%!8=wimp%!12:wimp%!12=wimp%!16
:;wimp%!16=wimp%!20:wimp%!20=wimp%!24:$(wimp%+24)=sprite$
:'ș "Wimp_CreateIcon",,wimp% � icon%
:
=icon%
:*:
:4&��IconPutText(window%,icon%,text$)
:>#wimp%!0=window% : wimp%!4=icon%
:H!ș "Wimp_GetIconState",,wimp%
:RY� ((wimp%!24) � &100)=0 � 1,"Icon "+�icon%+" in window "+�window%+" isn't indirected"
:\$(wimp%!28)=text$
:f!wimp%!0=window%:wimp%!4=icon%
:pwimp%!8=0:wimp%!12=0
:z!ș "Wimp_SetIconState",,wimp%
:��
:�:
:���IconInterfaceStart
:�ș"Wimp_BorderIcon",,wimp%
:��
:�:
:���IconInterfaceFinish
:�
wimp%!8=0
:�ș"Wimp_BorderIcon",,wimp%
:��
:�:
:���MenuAdjustOn(menu%)
:�,ș "Wimp_GetPointerInfo",,pointer_block%
;^� ((pointer_block%!8)�1)=1 � ș "Wimp_CreateMenu",,menu%,pointer_block%!0,pointer_block%!4
;�
;:
;$ݤMenuChoice(level%)
;.=(wimp%!(4*level%))+1
;8:
;BݤMenuCreate(menu$)
;L/� menu$="Colours" �=�MenuCreateColours(" ")
;V'� menu%,index%,width%,length%,k%,s%
;`)� menu% 28+�MenuNoOfEntries(menu$)*24
;j/menu%?12=7:menu%?13=2:menu%?14=7:menu%?15=0
;t'menu%!16=140:menu%!20=44:menu%!24=0
;~index%=menu%+28
;� $menu%=�menu$,�menu$,"\")-1)
;�#width%=�(�menu$,�menu$,"\")-1))
;�"menu$+="\":Menu_NoOfEntries%=0
;�ȕ menu$<>""
;�menu$=�menu$,�menu$,"\")+1)
;�Ȏ menu$ �
;�� ""
;�
;�+!index%=0:index%!4=-1:index%!8=&7000021
;�length%=�menu$,"\")-1
;�k%=��menu$,length%),">")
;�Ȏ k% �
<