Home » Archimedes archive » Archimedes World » AW-1997-02.adf » !MbookDemo_MathsBook » !MbookDemo/!Runimage
!MbookDemo/!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-1997-02.adf » !MbookDemo_MathsBook |
| Filename: | !MbookDemo/!Runimage |
| Read OK: | ✔ |
| File size: | 195A0 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > !Runimage
20REM Addition and subtraction.
30REM Version 0.30, 9th Sept 96
40ON ERROR PROCerror("Maths_task"):PROCend(-1):END
50
60PROCinitialise
70PROCwimp_poll
80PROCend(-1)
90END
100
110
120DEF PROCinitialise
130LOCAL n%
140DIM block% 3000,block2% 60,results% 44000
150DIM Prect% 16,Ptrans% 16,Pplot% 8,lev% 48,Hlev% 48
160DIM dig1$(5),dig2$(4),dig3$(5),answer$(5),carry$(5),car_dig%(5),dig_limQ%(9),dig_limA%(7),handle%(3),dig_name$(4),colname$(4),strike$(6),st_dig%(6),Pdig1$(9,4),Pdig2$(9,4),Pop%(9),Pdec%(9),PlimQ%(9),PlimA%(9),Cdone%(4),STdone%(4),name$(43),message$(2)
170DIM Alevel%(43),Slevel%(43),Hlevel%(43),MHlevel%(43),auto%(43),autohelp%(43),force%(43),tries%(43),mode%(43),decimal%(43),MenuBuff%(14)
180DIM operator%(43),no_quest%(43),timelim%(43),Notimer%(43),calc%(43),printer%(43),score%(43),next%(43),stop%(43),colname%(43),estimate%(43),newlevR%(43),newlevW%(43),BothOp%(43),saveR%(43),ownsum%(43),speech%(43)
190end%=0:drag%=0:double%=0:initx%=0:inity%=0:initnum%=0:dragval%=0:PrevOp%=0
200quest%=0:try%=0:sesstime%=0:game%=0:start%=-1:drawfont%=0:SCformat%=1:EstVal%=0:marked%=0:Owin%=0:dragx%=0:dragy%=0:ownOp%=0:rubber%=0
210carry%=0:strike%=0:reduce%=0:Bstep%=0:force5%=0:nextcheck%=0:path$="":Rcnt%=0:Rcnt2%=0:dirpath$="":alter%=0:startOwn%=0
220nextdig%=0:rubdig%=-1:stopped%=0:anslim%=0:sum%=0:notsavedR%=0:newR%=0
230CorrectAns%=0:correct%=0:message$()="":nextmess%=0
240Pcount%=-1:Psave%=0:Pprint%=0:driver%=0
250CCsum=0:CCnum=0:CCnum$="":CCstart%=0:CCop%=0:CCprev%=0
260
270y1%=-296:y2%=y1%-75:y3%=y2%-75:y0%=y1%+92
280mkx%=FNdigx(0)+110
290
300SYS"Wimp_Initialise",200,&4B534154,"Maths_task"
310IBhandle%=FNicon_bar_icon("!mbookDemo")
320PROCset_fonts
321PROCload_sprites
330PROCcreate_windows
340PROCicon_menu
350Thandle%=FNcentre_window(Thandle%,"Y")
360TLtime%=TIME
380PROCset_option_variables
390PROCset_mode_independance
400ENDPROC
410
420
430DEF PROCicon_menu
440REM Sets up menu
450DIM menu% 244,rmenu% 172,mbuff% 115
460DIM item$(8),data%(8,4)
470item$()="Info","See options","See/edit group","Load/new group","Save group","Results","Enable printer","Whole screen","Quit"
480data%()=2,Ihandle%,0,0,0,0,-1,1,0,0,0,-1,1,mbuff%,15,0,-1,0,mbuff%+84,15,0,-1,1,0,0,2,rmenu%,0,0,0,0,-1,0,mbuff%+100,15,0,-1,0,0,0,&80,-1,0,0,0
490PROCset_up_menu("MathsBook",menu%,8,item$(),data%())
500
510item$()="See results","Print results","Print summary","Save results","Auto save results","Wipe results"
520data%()=0,-1,1,0,0,0,-1,0,mbuff%+35,14,0,-1,0,mbuff%+50,14,0,SVhandle2%,1,0,0,0,-1,0,mbuff%+65,18,&80,-1,0,0,0
530PROCset_up_menu("Results",rmenu%,5,item$(),data%())
540ENDPROC
550
560
570DEF PROCcreate_windows
580REM Load template files
590DIM Abuff% 500,Sbuff% 500,Ibuff% 150,Cbuff% 800,SCbuff% 250,N2buff% 900,calcbuff% 200,SVbuff% 300,SV2buff% 300,Fbuff% 200,Pbuff% 100,STbuff% 100,Icbuff% 100,Obuff% 200,Smbuff% 100,Lbuff% 400,Drbuff% 100,Ebuff% 100,Rbuff% 100,Edbuff% 100,Dembuff% 150
600DIM Mbuff% 500,P2buff% 100,font% 255
610FOR n%=0 TO 255 STEP 4:!(font%+n%)=0:NEXT
620DIM name% 11
630
640SYS"Wimp_OpenTemplate",,"<Maths$Dir>.Templates2"
650handle%(1)=FNtemp_window(Abuff%,500,name%,"addition",-1)
660titlebuff1%=block%!72
670handle%(2)=FNtemp_window(Sbuff%,500,name%,"subtraction",-1)
680titlebuff2%=block%!72
690Ihandle%=FNtemp_window(Ibuff%,150,name%,"info",-1)
710Chandle%=FNtemp_window(Cbuff%,800,name%,"config",-1)
720level_buffA%=FNicon_buffer(5)
730level_buffS%=FNicon_buffer(8)
740Qbuff%=FNicon_buffer(16)
750Tbuff%=FNicon_buffer(19)
760Tmbuff%=FNicon_buffer(22)
770Hbuff%=FNicon_buffer(31)
780MHbuff%=FNicon_buffer(37)
790levRbuff%=FNicon_buffer(53)
800levWbuff%=FNicon_buffer(57)
810titlebuffC%=block%!72
820
830SChandle%=FNtemp_window(SCbuff%,250,name%,"score",font%)
840Snamebuff%=FNicon_buffer(1)
850SCtbuff%=FNicon_buffer(2)
860SCQbuff%=FNicon_buffer(4)
870SCRbuff%=FNicon_buffer(6)
880SCWbuff%=FNicon_buffer(8)
890
900NGhandle%=FNtemp_window(N2buff%,900,name%,"name2",-1)
910Ntitlebuff%=block%!72
920
930CChandle%=FNtemp_window(calcbuff%,200,name%,"calc",-1)
940CCbuff%=FNicon_buffer(17)
950
960Lhandle%=FNtemp_window(Lbuff%,400,name%,"Loadbox",font%)
970loadbuff%=FNicon_buffer(2)
980Mhandle%=FNtemp_window(Mbuff%,500,name%,"DirMenu",-1)
990FOR n%=0 TO 14:MenuBuff%(n%)=FNicon_buffer(n%):NEXT
1000
1010SVhandle%=FNtemp_window(SVbuff%,300,name%,"savebox",-1)
1020savebuff%=FNicon_buffer(1)
1030
1040Drhandle%=FNtemp_window(Drbuff%,100,name%,"dirmess",-1)
1050Phandle%=FNtemp_window(Pbuff%,100,name%,"printmess",-1)
1060P2handle%=FNtemp_window(P2buff%,100,name%,"printmess2",-1)
1070SThandle%=FNtemp_window(STbuff%,100,name%,"stopmess",-1)
1080Ichandle%=FNtemp_window(Icbuff%,100,name%,"iconmess",-1)
1090icbuff%=FNicon_buffer(0)
1100Smhandle%=FNtemp_window(Smbuff%,100,name%,"savemess",-1)
1110Ehandle%=FNtemp_window(Ebuff%,100,name%,"endsave",-1)
1120Eicbuff%=FNicon_buffer(1)
1130Rhandle%=FNtemp_window(Rbuff%,100,name%,"rejectmess",-1)
1140Ricbuff%=FNicon_buffer(0)
1150Edhandle%=FNtemp_window(Edbuff%,100,name%,"namemess",-1)
1160
1170Dhandle%=FNtemp_window(-1,-1,name%,"dribble",-1)
1180SVhandle2%=FNtemp_window(SV2buff%,300,name%,"savebox2",-1)
1190savetextbuff%=FNicon_buffer(1)
1200
1210Ohandle%=FNtemp_window(Obuff%,200,name%,"ownsum",font%)
1220Osum1buff%=FNicon_buffer(3)
1230Osum2buff%=FNicon_buffer(4)
1240Osgnbuff%=FNicon_buffer(5)
1250
1260Thandle%=FNtemp_window(-1,-1,name%,"title",-1)
1270
1280Demhandle%=FNtemp_window(Dembuff%,150,name%,"demo",-1)
1290DemIc%=FNicon_buffer(1)
1300
1310SYS"Wimp_CloseTemplate"
1320ENDPROC
1330
1340
1350DEF PROCload_sprites
1360LOCAL mem%
1370mem%=258000:REM 143124+114796
1380DIM sarea% mem%
1390!sarea%=mem%:sarea%!8=16
1400SYS"OS_SpriteOp",&109,sarea%
1410SYS"OS_SpriteOp",&10A,sarea%,"<Maths$Dir>.sprites"
1420ENDPROC
1430
1440
1450DEF PROCset_mode_independance
1460DIM scale% 16,trans% 255,pal% 64,scale27% 16
1470PROCsource_mode_factors(12,scale%)
1480PROCcurrent_mode_factors(scale%)
1490PROCpalette_block("n0",sarea%,pal%)
1500PROCtranstable(12,pal%,-1,trans%)
1510PROCmessage_mode_independance
1520
1530PROCsource_mode_factors(27,scale27%)
1540PROCcurrent_mode_factors(scale27%)
1550ENDPROC
1560
1570
1580DEF PROCwimp_poll
1590REPEAT
1600SYS"Wimp_Poll",0,block% TO reason%
1610CASE reason% OF
1620 WHEN 0:PROCnull_event
1630 WHEN 1:PROCredraw
1640 WHEN 2:PROCopen_windows
1650 WHEN 3:PROCclose_windows
1660 WHEN 6:PROCbutton_clicks
1670 WHEN 7:IF FNwindow_open(SVhandle%) THEN PROCsave_request(&FFD,savebuff%,72+20*Ncount%)
1680 IF FNwindow_open(SVhandle2%) THEN PROCsave_request(&FFF,savetextbuff%,Rptr%+1)
1690 WHEN 8:PROCkeys
1700 WHEN 9:PROCselect_menu
1710 WHEN 17,18:PROCmessages
1720ENDCASE
1730UNTIL end%=-1
1740ENDPROC
1750
1760
1770DEF PROCkeys
1780CASE !block% OF
1790 WHEN CChandle%:PROCkeys_calc
1800 WHEN Ohandle%:PROCown_sum_keys
1810 WHEN NGhandle%:IF create%<0 THEN
1820 PROCkeys_name(NameNo%)
1830 ELSE
1840 IF NameNo%=Ncount%+1 THEN PROCkeys_name(Ncount%+1)
1850 IF NameNo%>0 AND block%!24=13 THEN PROCkeys_name(NameNo%)
1860 ENDIF
1870OTHERWISE
1880 SYS"Wimp_ProcessKey",block%!24
1890ENDCASE
1900ENDPROC
1910
1920
1930DEF PROCmessages
1940CASE block%!16 OF
1950 WHEN 0:end%=-1
1960 WHEN 2:REM IF FNwindow_open(SVhandle%) PROCsave_file(FNstring(block%+44))
1970 REM IF FNwindow_open(SVhandle2%) PROCresults_text_file(FNstring(block%+44))
1980 PROCclose_window(Smhandle%)
1990 WHEN 3:IF block%!40=&FFD THEN PROCdragload_message
2000 WHEN &400C1:PROCmode_change
2010 WHEN 5:IF block%!40=&1000 THEN PROCbroadcast_message
2020ENDCASE
2030ENDPROC
2040
2050
2060DEF PROCset_up_loadbox
2070LOCAL item%,file$,n%:item%=0
2080PROCloadbox_windows(-1):PROCclose_window(Drhandle%)
2090FOR n%=0 TO 14:$(MenuBuff%(n%))="":NEXT:n%=-1
2100
2110$(block%+12)=path$:SYS"OS_GBPB",9,block%+12,block%,1,0,11 TO ,,,,item%
2120WHILE item%>-1 AND n%<14
2130 file$=FNstring(block%)
2140 IF file$<>"results" THEN n%+=1:$(MenuBuff%(n%))=file$
2150 SYS"OS_GBPB",9,block%+12,block%,1,item%,11 TO ,,,,item%
2160ENDWHILE
2170
2180path$=path$+"."
2190ENDPROC
2200
2210
2220DEF PROCbroadcast_message
2230IF RIGHT$(FNstring(block%+44),9)="Mfiles_+-" AND create%<0 THEN
2240 path$=FNstring(block%+44):dirpath$=path$
2250 $loadbuff%="":PROCreset_icon(Lhandle%,3)
2260 PROCshade_icon(Lhandle%,1,0)
2270 PROCset_up_loadbox
2280ENDIF
2290ENDPROC
2300
2310
2320DEF PROCdragload_message
2330LOCAL file$,leaf$,whandle%
2340whandle%=block%!20
2350file$=FNstring(block%+44)
2360REM IF (notsavedO% OR notsavedR%)=-1 THEN nextfile$=file$:PROCend_save(3):ENDPROC
2370PROCfile_vars(file$)
2380PROCload_file(file$)
2390
2400IF whandle%=Lhandle% THEN
2410 PROCreset_icon(Lhandle%,2)
2420ELSE
2430 IF whandle%=-2 THEN PROCloadbox_windows(0)
2440ENDIF
2450ENDPROC
2460
2470
2480DEF PROCfile_vars(file$)
2490$savebuff%=file$:$loadbuff%=FNgetleaf(file$,0)
2500path$=LEFT$(file$,LEN file$-LEN $loadbuff%)
2510IF INSTR(file$,"Mfiles_+-") THEN $savetextbuff%=path$+"results."+$loadbuff% ELSE $savetextbuff%=path$+"R"+$loadbuff%
2520ENDPROC
2530
2540
2550DEF PROCmode_change
2560PROCtranstable(12,pal%,-1,trans%)
2570PROCcurrent_mode_factors(scale%)
2580PROCcurrent_mode_factors(scale27%)
2590PROCmessage_mode_independance
2600drawfont%=(game%>0 AND SCformat%=2)
2610PROCset_windows
2620IF FNwindow_open(Ohandle%) THEN Ohandle%=FNcentre_window(Ohandle%,"Y")
2630IF FNwindow_open(Lhandle%) THEN PROCloadbox_windows(-1)
2640IF FNwindow_open(CChandle%) THEN CChandle%=FNcentre_window(CChandle%,"Y")
2650IF FNwindow_open(Dhandle%) THEN Dhandle%=FNcentre_window(Dhandle%,"")
2660ENDPROC
2670
2680
2690DEF PROCselect_menu
2700LOCAL no%,scx%,scy%
2710CASE !block% OF
2720 WHEN 1:no%=NameNo%
2730 PROCset_config_title(no%)
2740 PROCset_preferences(no%)
2750 Chandle%=FNcentre_window(Chandle%,"")
2760 WHEN 2:create%=-1:PROCbuild_name_windowG
2770 WHEN 3:create%=-2:PROCopen_window(Drhandle%):nextfile$=""
2780 IF game% THEN PROCclose_window(handle%(game%)):game%=0
2790 REM IF (notsavedO% OR notsavedR%)=-1 THEN PROCend_save(3)
2800 WHEN 4:REM PROCsave_file($savebuff%):PROCopen_window(Smhandle%)
2810 $DemIc%="saves the children's levels."
2820 Demhandle%=FNcentre_window(Demhandle%,"Y")
2830 WHEN 5:PROCselect_menu_results
2840 WHEN 6:REM enprint%=NOT enprint%
2850 REM PROCsingle_tick(menu%,6,enprint%)
2860 REM IF NameNo% THEN PROCset_printer(NameNo%)
2870 $DemIc%="can print out sums.":Demhandle%=FNcentre_window(Demhandle%,"Y")
2880 WHEN 7:screen%=NOT screen%
2890 PROCsingle_tick(menu%,7,screen%)
2900 PROCset_windows
2910 WHEN 8:REM IF (notsavedO% OR notsavedR%)=-1 AND path$<>"" THEN nextfile$="":PROCend_save(3):end%=1 ELSE end%=-1
2920 end%=-1
2930ENDCASE
2940PROCmenu_adjust(menu%,block%,9)
2950ENDPROC
2960
2970
2980DEF PROCend_save(file%)
2990IF notsavedO%=-1 AND (file%=1 OR file%=3) THEN $Eicbuff%="current group file ?"
3000IF notsavedR%=-1 AND (file%=2 OR file%=3) THEN $Eicbuff%="results file ?"
3010IF (notsavedO% AND notsavedR%)=-1 AND file%=3 THEN $Eicbuff%="group and results file ?"
3020PROCopen_window(Ehandle%)
3030savend%=file%
3040ENDPROC
3050
3060
3070DEF PROCselect_end_save
3080IF block%!16=2 THEN
3090 REM IF notsavedO%-1 AND (savend% AND 1)=1 THEN PROCsave_file($savebuff%)
3100 IF notsavedR%=-1 AND (savend% AND 2)=2 THEN PROCresults_text_file($savetextbuff%)
3110 IF savend%=2 THEN PROCreset_results
3120ENDIF
3130PROCclose_window(Ehandle%)
3140end%=(end%=1):notsavedO%=0:notsavedR%=0
3150IF nextfile$<>"" AND end%=0 THEN PROCfile_vars(nextfile$):PROCload_file(nextfile$)
3160ENDPROC
3170
3180
3190DEF PROCmenu_adjust(menu%,block%,num%)
3200SYS"Wimp_GetPointerInfo",,block%
3210IF block%!8=1 THEN PROCshow_menu(menu%,block%,num%)
3220ENDPROC
3230
3240
3250DEF PROCselect_menu_results
3260LOCAL response%
3270CASE block%!4 OF
3280 WHEN 0:Dhandle%=FNcentre_window(Dhandle%,"")
3290 WHEN 1:PROCprintout_results(-1)
3300 WHEN 2:PROCprintout_results(0)
3310 WHEN 3:PROCresults_text_file($savetextbuff%):PROCopen_window(Smhandle%)
3320 WHEN 4:autosaveR%=NOT autosaveR%
3330 PROCsingle_tick(rmenu%,4,autosaveR%)
3340 WHEN 5:IF notsavedR% THEN nextfile$="":PROCend_save(2)
3350ENDCASE
3360ENDPROC
3370
3380
3390DEF PROCend(f%)
3400IF f% THEN PROClose_fonts
3410*POINTER
3420*SET Maths1$Running <>
3430SYS"Wimp_CloseDown"
3440ENDPROC
3450
3460
3470DEF PROCopen_windows
3480SYS"Wimp_OpenWindow",,block%
3490IF !block%=handle%(game%) THEN
3500 IF Owin%=-1 THEN PROCopen_window(Ohandle%)
3510 IF FNwindow_open(Chandle%) THEN PROCopen_window(Chandle%)
3520ENDIF
3530IF !block%=Lhandle% THEN Mhandle%=FNrelative_window(Lhandle%,Mhandle%,358,0)
3540ENDPROC
3550
3560
3570DEF PROCclose_windows
3580LOCAL handle%:handle%=!block%
3590CASE handle% OF
3600 WHEN handle%(game%):SThandle%=FNrelative_window(handle%(game%),SThandle%,450,556)
3610 WHEN NGhandle%:create%=0:NameNo%=0:PROCshade_item(menu%,1,1)
3620 WHEN Lhandle%:PROCclose_window(Mhandle%):create%=-2
3630ENDCASE
3640IF handle%<>handle%(game%) THEN PROCclose_window(handle%)
3650IF end%=1 THEN end%=0
3660ENDPROC
3670
3680
3690DEF PROCredraw
3700LOCAL flg%,Handle%:Handle%=!block%
3710PROCwork_area_origin(!block%,ox%,oy%)
3720SYS"Wimp_RedrawWindow",,block% TO flg%
3730WHILE flg%
3740 CASE Handle% OF
3750 WHEN handle%(game%):PROCredraw_game
3760 WHEN NGhandle%:PROCredraw_class_list
3770 WHEN Dhandle%:PROCset_results_window(ox%,oy%,-1)
3780 ENDCASE
3790 SYS"Wimp_GetRectangle",,block% TO flg%
3800ENDWHILE
3810ENDPROC
3820
3830
3840DEF PROCredraw_game
3850LOCAL sc%
3860PROCgrid
3870
3880IF SCformat%=2 OR estimate%(NameNo%)=0 THEN
3890 PROCsum_parts:PROCsum_numbers
3900 IF mode%(NameNo%) THEN PROCinput_box(nextdig%)
3910 IF marked% THEN PROCmark
3920 IF message$(1)<>"" AND drawfont%=0 THEN SYS"OS_SpriteOp",&134,sarea%,"message",ox%+600,oy%+y3%-25,0,-1,-1
3930ELSE
3940 SYS"OS_SpriteOp",&134,sarea%,"estimate",ox%+14,oy%-462,8,scale27%,trans%
3950 PROCplace_estimate
3960 PROCsum_numbers_est
3970ENDIF
3980
3990SYS"OS_SpriteOp",&134,sarea%,"backtop1",ox%+150,oy%-146,0,scale%,trans%:REM rub out
4000IF drag%=-1 AND (dragval%<>10 OR dragval%=10 AND dragy%<-150) THEN
4001 IF dragval%=10 THEN sc%=scale% ELSE sc%=scale27%
4010 SYS"OS_SpriteOp",&134,sarea%,"move"+STR$dragval%,ox%+dragx%,oy%+dragy%,8,sc%,trans%
4011ENDIF
4020ENDPROC
4030
4040
4050DEF PROCbutton_clicks
4060LOCAL no%
4070IF block%!8=2 AND block%!12<>-2 THEN ENDPROC
4080CASE block%!12 OF
4090 WHEN -2:IF block%!16=IBhandle% THEN PROCselect_IBicon
4100 WHEN handle%(game%):IF block%!8=4 THEN PROCicon_selection
4110 WHEN Chandle%:no%=NameNo%:PROCselect_options(no%)
4120 WHEN SChandle%:PROCselect_score
4130 WHEN CChandle%:PROCcalcalator(block%!16)
4140 WHEN NGhandle%:IF create%=0 THEN PROCselect_nameG ELSE PROCedit_nameG
4150 WHEN SVhandle%:PROCselect_savebox
4160 WHEN SVhandle2%:PROCselect_save_text
4170 WHEN SThandle%:IF block%!16=2 THEN PROCgame_end
4180 PROCclose_window(SThandle%)
4190 WHEN Ohandle%:PROCselect_sum_window
4200 WHEN Lhandle%:PROCselect_loadfile
4210 WHEN Mhandle%:PROCselect_file_menu(block%!16)
4220 WHEN Ehandle%:PROCselect_end_save
4230 WHEN P2handle%:IF block%!16=2 THEN PROCsum_printout
4240 Pcount%=-1
4250 WHEN Phandle%,Ichandle%,Smhandle%,Drhandle%,Rhandle%,Edhandle%,Demhandle%:PROCclose_window(block%!12)
4260ENDCASE
4270ENDPROC
4280
4290
4300DEF PROCselect_loadfile
4310LOCAL file%,error%
4320SYS"Wimp_SetCaretPosition",Lhandle%,2,46,-210,-1,-1
4330IF block%!16<>3 OR $loadbuff%="" THEN ENDPROC
4340PROCclose_window(Thandle%)
4350
4360$savebuff%=path$+$loadbuff%
4370IF INSTR(path$,"Mfiles_+-") THEN $savetextbuff%=path$+"results."+$loadbuff% ELSE $savetextbuff%="R"+$savebuff%
4380
4390IF create% THEN
4400 IF FNcheck_file THEN
4410 PROCload_file($savebuff%)
4420 PROCbuild_name_windowG
4430 ELSE
4440 REM PROCload_file("<Obey$Dir>.default")
4450 REM PROCsave_file($savebuff%)
4460 $DemIc%="allows files to be created."
4470 Demhandle%=FNcentre_window(Demhandle%,"Y")
4480 ENDIF
4490ENDIF
4500PROCloadbox_windows(0)
4510ENDPROC
4520
4530
4540DEF PROCselect_file_menu(icon%)
4550IF $MenuBuff%(icon%)="" THEN ENDPROC
4560create%=-1:path$=dirpath$+"."
4570PROCclose_window(Ichandle%)
4580$loadbuff%=$MenuBuff%(icon%)
4590PROCreset_icon(Lhandle%,2)
4600ENDPROC
4610
4620
4630DEF FNcheck_file
4640LOCAL n%,flg%
4650REPEAT
4660 IF $loadbuff%=$MenuBuff%(n%) THEN flg%=-1
4670 n% +=1
4680UNTIL n%=15 OR flg%=-1
4690=flg%
4700
4710
4720DEF PROCloadbox_windows(open%)
4730IF open% THEN
4740 Lhandle%=FNcentre_window(Lhandle%,"Y")
4750 Mhandle%=FNrelative_window(Lhandle%,Mhandle%,358,0)
4760 SYS"Wimp_SetCaretPosition",Lhandle%,2,46,-210,-1,-1
4770ELSE
4780 PROCclose_window(Lhandle%)
4790 PROCclose_window(Mhandle%)
4800 PROCclose_window(Ichandle%)
4810ENDIF
4820ENDPROC
4830
4840
4850DEF PROCselect_IBicon
4860IF block%!8=2 THEN
4870 PROCallow_print_results
4880 PROCshow_menu(menu%,!block%,9)
4890ELSE
4900 IF start% THEN
4910 IF create% THEN
4920 PROCopen_window(Drhandle%)
4930 ELSE
4940 PROCbuild_name_windowG
4950 PROCloadbox_windows(0)
4960 ENDIF
4970 ENDIF
4980ENDIF
4990PROCclose_window(Ichandle%)
5000PROCclose_window(Smhandle%)
5010PROCclose_window(Ehandle%)
5020PROCclose_window(Rhandle%)
5030PROCclose_window(Thandle%)
5040ENDPROC
5050
5060
5070DEF PROCswitch_window(h%)
5080LOCAL n%
5090!block2%=handle%(3-h%):SYS"Wimp_GetWindowState",,block2%
5100!block%=handle%(h%):SYS"Wimp_GetWindowInfo",,block%
5110FOR n%=4 TO 24 STEP 4:block%!n%=block2%!n%:NEXT
5120!block2%=handle%(h%):SYS"Wimp_DeleteWindow",,block2%
5130SYS"Wimp_CreateWindow",,block%+4 TO handle%(h%)
5140PROCopen_window(handle%(h%))
5150ENDPROC
5160
5170
5180DEF PROCselect_options(no%)
5190LOCAL icon%,help%,reset%,svR%,n%:reset%=0:svR%=saveR%(no%)
5200help%=Hlevel%(no%):notsavedO%=(path$<>""):icon%=block%!16
5210IF alter%=0 THEN alter%=(icon%<>68 AND no%=0)
5220CASE icon% OF
5230 WHEN 2,3:PROCselect_operators(icon%-1,no%):reset%=(Owin%=0)
5240 WHEN 6:Alevel%(no%)=FNinc_buffer(Chandle%,5,Alevel%(no%),level_buffA%,1,1,7,0):reset%=1
5250 IF decimal%(no%)=1 AND Alevel%(no%)=5 THEN PROCset_dec_levels(no%)
5260 WHEN 7:Alevel%(no%)=FNinc_buffer(Chandle%,5,Alevel%(no%),level_buffA%,1,1,7,-1):reset%=1
5270 WHEN 9:Slevel%(no%)=FNinc_buffer(Chandle%,8,Slevel%(no%),level_buffS%,1,1,9,0):reset%=1
5280 IF decimal%(no%)=1 AND Slevel%(no%)=5 THEN PROCset_dec_levels(no%)
5290 WHEN 10:Slevel%(no%)=FNinc_buffer(Chandle%,8,Slevel%(no%),level_buffS%,1,1,9,-1):reset%=1
5300 WHEN 17:no_quest%(no%)=FNinc_buffer(Chandle%,16,no_quest%(no%),Qbuff%,1,1,99,0)
5310 WHEN 18:no_quest%(no%)=FNinc_buffer(Chandle%,16,no_quest%(no%),Qbuff%,1,1,99,-1)
5320 WHEN 20:tries%(no%)=FNinc_buffer(Chandle%,19,tries%(no%),Tbuff%,1,1,3,0)
5330 WHEN 21:tries%(no%)=FNinc_buffer(Chandle%,19,tries%(no%),Tbuff%,1,1,3,-1)
5340 WHEN 23:timelim%(no%)=FNinc_buffer(Chandle%,22,timelim%(no%),Tmbuff%,1,1,30,0)
5350 WHEN 24:timelim%(no%)=FNinc_buffer(Chandle%,22,timelim%(no%),Tmbuff%,1,1,30,-1)
5360 WHEN 25:Notimer%(no%)=-FNicon_selected(Chandle%,25)
5370 PROCshade_3icons(Chandle%,22,Notimer%(no%))
5380 WHEN 32:Hlevel%(no%)=FNinc_buffer(Chandle%,31,Hlevel%(no%),Hbuff%,1,0,5,0)
5390 PROCreset_help_level(no%)
5400 IF force5%=0 THEN Helplev%=Hlevel%(no%)
5410 IF Hlevel%(no%)=0 THEN PROCset_top_icon(2,0)
5420 WHEN 33:Hlevel%(no%)=FNinc_buffer(Chandle%,31,Hlevel%(no%),Hbuff%,1,0,5,-1)
5430 PROCreset_help_level(no%)
5440 IF force5%=0 THEN Helplev%=Hlevel%(no%)
5450 IF Hlevel%(no%)=1 THEN PROCset_top_icon(2,-1)
5460 WHEN 34:force%(no%)=-FNicon_selected(Chandle%,34)
5470 WHEN 38:MHlevel%(no%)=FNinc_buffer(Chandle%,37,MHlevel%(no%),MHbuff%,1,0,5,0)
5480 PROCreset_help_level(no%)
5490 WHEN 39:MHlevel%(NameNo%)=FNinc_buffer(Chandle%,37,MHlevel%(no%),MHbuff%,1,0,5,-1)
5500 PROCreset_help_level(no%)
5510 WHEN 28,29:mode%(no%)=icon%-28:PROCadjust_for_mode(no%):reset%=1
5520 WHEN 42:calc%(no%)=-FNicon_selected(Chandle%,42)
5530 PROCset_delete_icon(no%)
5540 IF calc%(no%)=0 THEN PROCclose_window(CChandle%)
5550 WHEN 43:REM PROCset_printer(no%)
5560 PROCselect_icon(Chandle%,43,0)
5570 $DemIc%="can print out sums."
5580 Demhandle%=FNcentre_window(Demhandle%,"Y")
5590 WHEN 44:score%(no%)=-FNselect_display(44,-score%(no%),4)
5600 WHEN 46:PROCset_next(no%)
5610 WHEN 47:stop%(no%)=-FNselect_display(47,-stop%(no%),6)
5620 WHEN 48:colname%(no%)=-FNicon_selected(Chandle%,48)
5630 WHEN 45:PROCset_estimate(no%)
5640 WHEN 61:PROCset_keep_results(no%)
5650 WHEN 49:PROCset_auto(no%)
5660 WHEN 50:autohelp%(no%)=-FNicon_selected(Chandle%,50)
5670 PROCset_autohelp(no%)
5680 WHEN 51:PROCclose_window(Chandle%)
5690 startOwn%=(startOwn%=1 AND game%>0):reset%=startOwn%
5691 nextmess%=(Helplev%=5 AND game%>0)
5700 WHEN 54:newlevR%(no%)=FNinc_buffer(Chandle%,53,newlevR%(no%),levRbuff%,1,1,10,0)
5710 WHEN 55:newlevR%(no%)=FNinc_buffer(Chandle%,53,newlevR%(no%),levRbuff%,1,1,10,-1)
5720 WHEN 58:newlevW%(no%)=-FNinc_buffer(Chandle%,57,-newlevW%(no%),levWbuff%,1,1,10,0)
5730 WHEN 59:newlevW%(no%)=-FNinc_buffer(Chandle%,57,-newlevW%(no%),levWbuff%,1,1,10,-1)
5740 WHEN 62:PROCset_decimal:reset%=(Owin%=0)
5750 WHEN 63:ownsum%(no%)=-FNicon_selected(Chandle%,63)
5760 PROCset_own_sum(no%):startOwn%=-(ownsum%(no%)=1 AND game%>0)
5770 IF ownsum%(no%)=0 THEN PROCclose_window(Ohandle%):Owin%=0
5780 WHEN 64:FOR n%=1 TO Ncount%:PROCset_new_name_levels(n%,0):NEXT
5790 PROCclose_window(Chandle%)
5800 WHEN 65:PROCset_new_name_levels(no%,0)
5810 PROCset_preferences(no%)
5820 WHEN 66:PROCclose_window(Chandle%)
5830 WHEN 67:PROCselect_icon(Chandle%,67,0)
5840 $DemIc%="includes speech."
5850 Demhandle%=FNcentre_window(Demhandle%,"Y")
5860 WHEN 68:IF alter% THEN PROCset_new_name_levels(0,43)
5870 PROCclose_window(Chandle%)
5880ENDCASE
5890IF game%>0 AND icon%<>51 AND icon%<63 OR startOwn%=-1 THEN
5900 IF reset% THEN
5910 IF ownsum%(NameNo%)=0 THEN PROCset_sum ELSE PROCset_up_sum_window
5920 ENDIF
5930
5940 IF (icon%=32 OR icon%=33) AND mode%(no%)=1 THEN
5950 PROCchange_help_display(help%)
5960 IF game%>0 THEN PROCremove_message
5970 ENDIF
5980
5990 IF (icon%=45 OR icon%=48) AND Owin%=0 THEN SYS"Wimp_ForceRedraw",handle%(game%),0,-844,1280,-150
6000ENDIF
6010ENDPROC
6020
6030
6040DEF PROCset_delete_icon(no%)
6050LOCAL n%
6060FOR n%=1 TO 2:PROCdelete_icon(handle%(n%),3,(calc%(no%)=0)):NEXT
6070IF game% THEN SYS"Wimp_ForceRedraw",handle%(game%),450,-150,600,0
6080ENDPROC
6090
6100
6110DEF PROCset_next(no%)
6120next%(no%)=-FNicon_selected(Chandle%,46)
6130PROCset_top_icon(5,(next%(no%)=1 AND try%>0))
6140IF marked%=-1 AND next%(no%)=0 THEN
6150 correct%=0
6160 IF quest%<no_quest%(no%) THEN PROCset_sum ELSE PROCgame_end
6170ENDIF
6180ENDPROC
6190
6200
6210DEF PROCset_keep_results(no%)
6220saveR%(no%)=-FNicon_selected(Chandle%,61)
6230IF svR%=saveR%(no%) THEN ENDPROC
6240IF saveR%(no%)=0 AND newR%=0 THEN PROCend_levels
6250newR%=saveR%(no%)
6260ENDPROC
6270
6280
6290DEF PROCset_estimate(no%)
6300estimate%(no%)=-FNicon_selected(Chandle%,45)
6310IF estimate%(no%)=0 AND SCformat%=1 THEN sum%=0:Estval%=0:dig3$()=""
6320IF sum%=0 AND force5%=0 THEN SCformat%=2-estimate%(no%):message$(1)=""
6330IF game%>0 THEN PROCshade_icon(handle%(game%),2,(SCformat%=1))
6340ENDPROC
6350
6360
6370DEF PROCset_decimal
6380decimal%(no%)=-FNicon_selected(Chandle%,62)
6390IF decimal%(no%) THEN PROCset_dec_levels(no%)
6400IF FNwindow_open(Ohandle%) THEN
6410 $Osum1buff%=FNset_dec($Osum1buff%):$Osum2buff%=FNset_dec($Osum2buff%)
6420 PROCreset_icon(Ohandle%,3):PROCreset_icon(Ohandle%,4)
6430ENDIF
6440ENDPROC
6450
6460
6470DEF PROCset_printer(no%)
6480printer%(no%)=-FNselect_display(43,-printer%(no%),7)
6490PROCshade_icon(SChandle%,11,(printer%(no%)=0 OR driver%=0 OR enprint%=0))
6500PROCset_top_icon(7,(printer%(no%)=1 AND driver%=-1 AND enprint%=-1))
6510ENDPROC
6520
6530
6540DEF PROCshade_3icons(whandle%,ihandle%,sh%)
6550LOCAL n%
6560FOR n%=ihandle% TO ihandle%+2
6570 PROCshade_icon(whandle%,n%,sh%)
6580NEXT
6590ENDPROC
6600
6610
6620DEF PROCset_auto(no%)
6630LOCAL n%
6640auto%(no%)=-FNicon_selected(Chandle%,49)
6650PROCshade_3icons(Chandle%,53,(auto%(no%)=0))
6660PROCshade_3icons(Chandle%,57,(auto%(no%)=0))
6670ENDPROC
6680
6690
6700DEF PROCset_autohelp(no%)
6710LOCAL n%
6720PROCshade_3icons(Chandle%,37,(mode%(no%)=0 OR autohelp%(no%)=0))
6730PROCreset_help_level(no%)
6740ENDPROC
6750
6760
6770DEF PROCreset_help_level(no%)
6780IF autohelp%(no%) THEN
6790 IF Hlevel%(no%)<MHlevel%(no%) THEN
6800 Hlevel%(no%)=MHlevel%(no%):$Hbuff%=STR$MHlevel%(no%)
6810 Helplev%=Hlevel%(no%)
6820 PROCreset_icon(Chandle%,31)
6830 ENDIF
6840ELSE
6850 MHlevel%(no%)=Hlevel%(no%):$MHbuff%=STR$Hlevel%(no%)
6860ENDIF
6870ENDPROC
6880
6890
6900DEF FNselect_display(icon%,var%,topicon%)
6910var%=FNicon_selected(Chandle%,icon%)
6920PROCset_top_icon(topicon%,var%)
6930=var%
6940
6950
6960DEF PROCselect_operators(icon%,no%)
6970LOCAL PrevOp%:PrevOp%=operator%(no%)
6980operator%(no%)=-FNicon_selected(Chandle%,2)-2*FNicon_selected(Chandle%,3)
6990IF operator%(no%)=0 THEN PROCselect_icon(Chandle%,2,1)
7000BothOp%(no%)=(operator%(no%)=3)
7010
7020IF BothOp%(no%)=-1 OR operator%(no%)=0 THEN
7030 IF ownsum%(no%)=0 THEN operator%(no%)=1 ELSE operator%(no%)=PrevOp%
7040ENDIF
7050IF ownsum%(no%)=0 THEN PROCshade_op_levels(no%) ELSE PROCset_own_sum_operators(no%)
7060PROCset_carry_variableY
7070
7080IF FNwindow_open(Ohandle%) THEN
7090 IF operator%(no%)=1 THEN sgn$="+" ELSE sgn$="-"
7100 $Osgnbuff%=sgn$:PROCreset_icon(Ohandle%,5)
7110ENDIF
7120
7130IF game%>0 THEN
7140 PROCclose_window(handle%(game%))
7150 IF game%>0 THEN game%=operator%(no%)
7160 IF Owin%=0 OR PrevOp%=operator%(no%) THEN PROCopen_window(handle%(game%))
7170 IF FNwindow_open(Ohandle%) THEN PROCopen_window(Ohandle%)
7180 IF FNwindow_open(Chandle%) THEN PROCopen_window(Chandle%)
7190ENDIF
7200ENDPROC
7210
7220
7230DEF PROCset_own_sum_operators(no%)
7240PROCshade_icon(Ohandle%,7+operator%(no%),0)
7250PROCshade_icon(Ohandle%,10-operator%(no%),(BothOp%(no%)=0))
7260PROCselect_icon(Ohandle%,10-operator%(no%),0)
7270PROCselect_icon(Ohandle%,7+operator%(no%),-1)
7280ownOp%=operator%(no%)
7290ENDPROC
7300
7310
7320DEF PROCadjust_for_mode(no%)
7330LOCAL n%
7340PROCshade_3icons(Chandle%,31,(mode%(no%)=0))
7350PROCshade_3icons(Chandle%,37,(mode%(no%)=0 OR autohelp%(no%)=0))
7360PROCshade_icon(Chandle%,50,(mode%(no%)=0))
7370PROCshade_icon(Chandle%,34,(mode%(no%)=0))
7380IF mode%(no%)=0 THEN
7390 autohelp%(no%)=0:PROCselect_icon(Chandle%,50,0)
7400 force%(no%)=0:PROCselect_icon(Chandle%,34,0)
7410 message$()=""
7420ENDIF
7430ENDPROC
7440
7450
7460DEF PROCreset_game
7470LOCAL n%,m%
7480quest%=0:try%=0:CorrectAns%=0:sesstime%=TIME:stopped%=0:Pcount%=-1:AnumRW%=0:SnumRW%=0:force5%=0
7490IF ownsum%(NameNo%)=0 THEN
7500 PROCset_sum
7510ELSE
7520 IF decimal%(NameNo%)=0 THEN $Osum1buff%="1000":$Osum2buff%="100" ELSE $Osum1buff%="10.00":$Osum2buff%="1.00"
7530 PROCset_up_sum_window
7540ENDIF
7550ENDPROC
7560
7570
7580DEF PROCset_sum
7590dig1$()="":dig2$()="":dig3$()="":carry$()="":car_dig%()=(operator%(NameNo%)=2):strike$()="":nextdig%=0:rubdig%=-1:message$()="":initx%=0:inity%=0:initnum%=0:nexterr%=anslim%:Cdone%()=0:STdone%()=0:correct%=0
7600sum%=0:drag%=0:rubber%=0:marked%=0:double%=0:Psave%=0:nextcheck%=0
7610carry%=0:strike%=0:reduce%=0:Bstep%=0:SCformat%=2-estimate%(NameNo%)
7620IF force5%=-1 THEN SCformat%=2 ELSE try%=0
7630nextmess%=-(Helplev%=5 AND mode%(NameNo%)=1 AND SCformat%=2)
7640PROCset_top_icon(0,0)
7650PROCset_top_icon(1,-1)
7660PROCshade_item(menu%,2,1)
7670
7680IF force5%<>-1 THEN
7690 IF BothOp%(NameNo%) THEN
7700 IF ownsum%(NameNo%)=0 THEN
7710 PrevOp%=operator%(NameNo%)
7720 operator%(NameNo%)=2+(quest%+1<=no_quest%(NameNo%)/2+.5)
7730 ENDIF
7740 game%=operator%(NameNo%):Helplev%=Hlevel%(NameNo%)
7750 PROCset_carry_variableY
7760 IF PrevOp%<>game% THEN
7770 PROCclose_window(handle%(PrevOp%))
7780 PROCswitch_window(game%)
7790 IF FNwindow_open(Chandle%) THEN PROCopen_window(Chandle%)
7800 ENDIF
7810 ENDIF
7820 IF ownsum%(NameNo%)=0 THEN
7830 IF game%=1 THEN PROCmake_add(Alevel%(NameNo%)) ELSE PROCmake_sub(Slevel%(NameNo%))
7840 ENDIF
7850ENDIF
7860
7870PROCdigits(num1%,dig1$())
7880PROCdigits(num2%,dig2$())
7890PROCdigits(ans%,answer$())
7900PROCcarry_positions:PrevOp%=0
7910PROCset_top_icon(5,0)
7920PROCset_top_icon(2,(SCformat%=2 AND mode%(NameNo%)=1 AND Helplev%>0))
7930PROCclose_window(P2handle%)
7940SYS"Wimp_ForceRedraw",handle%(game%),0,-675,1280,-150
7950ENDPROC
7960
7970
7980DEF PROCset_carry_variableY
7990IF operator%(NameNo%)=1 THEN ycar%=y3%-44 ELSE ycar%=y1%+48
8000ENDPROC
8010
8020
8030DEF PROCplace_estimate
8040LOCAL sumx1%,sumx2%,st2%,x%,y%,symbol$,power%:y%=-596
8050IF operator%(NameNo%)=1 THEN symbol$="plus" ELSE symbol$="minus"
8060st2%=825-75*LEN STR$ num2%:symb%=st2%-75
8070sumx1%=symb%-373:sumx2%=452
8080SYS"Wimp_SetColour",7
8090FOR pos%=0 TO 4
8100 x1%=FNprintdigx(sumx1%,pos%)
8110 x2%=FNprintdigx(sumx2%,pos%)
8120 IF dig1$(pos%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"n"+dig1$(pos%),ox%+x1%,oy%+y%,0,scale27%,trans%
8130 IF dig2$(pos%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"n"+dig2$(pos%),ox%+x2%,oy%+y%,0,scale27%,trans%
8140
8150 IF colname%(NameNo%) THEN
8160 x%=FNprintdigx(902,pos%)+19+14*(pos%=4 AND decimal%(NameNo%)=0)
8170 power%=pos%+2*(decimal%(NameNo%)=1)
8180 SYS"OS_SpriteOp",&134,sarea%,"dig"+STR$power%,ox%+x%,oy%+y%+88,0,scale%,trans%
8190 ENDIF
8200NEXT
8210IF decimal%(NameNo%) THEN
8220 SYS"OS_SpriteOp",&134,sarea%,"decpoint",ox%+FNprintdigx(sumx1%,2),oy%+y%,8,scale%,trans%
8230 SYS"OS_SpriteOp",&134,sarea%,"decpoint",ox%+FNprintdigx(sumx2%,2),oy%+y%,8,scale%,trans%
8240 SYS"OS_SpriteOp",&134,sarea%,"decpoint",ox%+FNprintdigx(902,2),oy%+y%,8,scale%,trans%
8250ENDIF
8260SYS"OS_SpriteOp",&134,sarea%,symbol$,ox%+symb%+2,oy%+y%,0,scale%,trans%
8270SYS"OS_SpriteOp",&134,sarea%,"equals",ox%+827,oy%+y%,0,scale%,trans%
8280SYS"OS_SpriteOp",&134,sarea%,"equals2",ox%+1052,oy%+y%+150,0,scale%,trans%
8290RECTANGLE FILL ox%+900,oy%+y%-12,375,8
8300ENDPROC
8310
8320
8330DEF PROCset_format2
8340EstVal%=sum%:sum%=0:dig3$()="":SCformat%=2
8350PROCshade_icon(handle%(game%),2,0)
8360IF Helplev%=5 THEN nextmess%=-1
8370SYS"Wimp_ForceRedraw",handle%(game%),0,-675,1280,-150
8380ENDPROC
8390
8400
8410DEF PROCicon_selection
8420LOCAL icon%:icon%=block%!16
8430IF Owin%=-1 AND icon%<>6 THEN ENDPROC
8440CASE icon% OF
8450 WHEN 0:IF SCformat%=1 THEN PROCset_format2 ELSE IF correct%=0 AND nextcheck%=0 THEN PROCcheck_sum
8460 WHEN 1:IF rubber%=0 THEN PROCset_up_rub_out ELSE PROCreplace_number(10):rubber%=0:*POINTER 1
8470 WHEN 2:PROCmessage("?")
8480 WHEN 3:IF FNwindow_open(Chandle%)=0 THEN $CCbuff%="0":CCsum=0:CCnum=0:CCop%=0:CCprev%=0:PROCreset_icon(CChandle%,17)
8490 CChandle%=FNcentre_window(CChandle%,"Y")
8500 SYS"Wimp_SetCaretPosition",CChandle%,-1,0,0,0,-1
8510 WHEN 4:PROCshow_score("")
8520 WHEN 5:IF printer%(NameNo%)=1 AND driver%=-1 AND correct%=0 AND Psave%=0 THEN PROCsave_sum("S")
8530 force5%=0
8540 IF marked%=0 THEN quest% +=1
8550 IF quest%<no_quest%(NameNo%) THEN
8560 IF auto%(NameNo%)=1 AND ownsum%(NameNo%)=0 THEN PROCnew_auto_level(correct%)
8570 IF ownsum%(NameNo%)=0 THEN PROCset_sum ELSE PROCset_up_sum_window
8580 ELSE
8590 PROCgame_end
8600 ENDIF
8610 WHEN 6:SThandle%=FNrelative_window(handle%(game%),SThandle%,450,556)
8620 WHEN 7:IF printer%(NameNo%)=1 AND Psave%=0 THEN PROCsave_sum("S"):Phandle%=FNrelative_window(handle%(game%),Phandle%,900,406)
8630 WHEN 8,9,10,11,12,13,14,15,16,17,38:IF double%=-1 THEN
8640 IF mode%(NameNo%)=1 THEN PROCplace_double_click
8650 ELSE
8660 IF drag% AND initnum%=icon%-8 THEN PROCreplace_number(icon%-8) ELSE PROCselect_digit(icon%-8)
8670 ENDIF
8680 WHEN 18,19,20,21,22,28,29,30,31,32:IF drag% THEN
8690 IF rubber%=0 THEN PROCplace_number(icon%) ELSE PROCrub_out(icon%)
8700 ELSE
8710 PROCremove_digit(icon%)
8720 ENDIF
8730 WHEN 23,24,25,26:IF operator%(NameNo%)=1 THEN PROCcarry_pos(icon%-22) ELSE PROCstrike_through(icon%-22)
8740 WHEN 33,34,35,36,37:IF operator%(NameNo%)=2 THEN PROCcarry_pos(icon%-33)
8750 WHEN 27:IF SCformat%=1 THEN PROCset_format2
8760ENDCASE
8770ENDPROC
8780
8790
8800DEF PROCcarry_pos(icon%)
8810IF dragval%=30 OR SCformat%=1 THEN ENDPROC
8820IF drag% THEN
8830 IF rubber%=0 THEN PROCplace_carry(icon%) ELSE PROCrub_out_carry(icon%)
8840ELSE
8850 PROCremove_carry(icon%)
8860ENDIF
8870ENDPROC
8880
8890
8900DEF PROCstrike_through(icon%)
8910IF drag% THEN
8920 IF double%=0 AND strike$(icon%)="" AND rubber%=0 THEN PROCplace_strike(icon%) ELSE IF rubber% THEN PROCrub_out_strike(icon%)
8930ELSE
8940 PROCremove_strike(icon%)
8950ENDIF
8960ENDPROC
8970
8980
8990DEF PROCselect_digit(num%)
9000LOCAL x%,y%
9010IF rubber% THEN rubber%=0:*POINTER
9020IF mode%(NameNo%) THEN double%=-1
9030IF drag% THEN SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
9040dragval%=num%:nextcheck%=0
9050PROCpick_up_number
9060ENDPROC
9070
9080
9090DEF PROCremove_digit(icon%)
9100LOCAL x%,Y3%,Mode%,flg%,dig%:rubber%=0
9110Mode%=-(mode%(NameNo%)=1 AND SCformat%=2)
9120
9130IF SCformat%=2 THEN
9140 dig%=icon%-18:Y3%=y3%
9150 x%=FNdigx(dig%):flg%=(icon%>26)
9160ELSE
9170 dig%=icon%-28:Y3%=-596:flg%=(icon%<28)
9180 x%=FNprintdigx(902,dig%)
9190ENDIF
9200IF flg% THEN ENDPROC
9210
9220IF dig3$(dig%)="" THEN ENDPROC
9230dragval%=VAL dig3$(dig%):dig3$(dig%)=""
9240sum% -=dragval%*10^dig%
9250SYS"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75
9260IF Mode%=1 AND dig%<nextdig% THEN PROCdelete_current_box(dig%)
9270PROCpick_up_number
9280IF message$(0)<>"" THEN PROCremove_message
9290nextmess%=-(Helplev%=5 AND Mode%=1)
9300IF sum%=0 THEN PROCset_top_icon(0,0)
9310ENDPROC
9320
9330
9340DEF PROCdelete_current_box(dig%)
9350LOCAL x%,Y3%,h%,olddig%
9360REM Clears box in next position.
9370IF rubdig%>-1 AND dig%<rubdig% THEN olddig%=rubdig% ELSE IF rubdig%=-1 THEN olddig%=nextdig%
9380IF olddig%=0 THEN ENDPROC
9390
9400IF operator%(NameNo%)=2 AND carry%=-1 AND olddig%<>rubdig% AND Helplev%>2 THEN
9410 IF strike%=0 THEN
9420 PROCcarry_redraw(olddig%,Bstep%)
9430 ELSE
9440 PROCstrike_redraw(olddig%,Bstep%)
9450 ENDIF
9460ELSE
9470 IF operator%(NameNo%)=1 THEN PROCdig_carry_redraw(olddig%) ELSE PROCdigit_redraw(olddig%)
9480ENDIF
9490rubdig%=dig%
9500ENDPROC
9510
9520
9530DEF PROCpick_up_number
9540LOCAL w%,h%
9550IF rubber%=0 THEN w%=18-3*(dragval%=30):h%=22 ELSE w%=6:h%=12
9560x%=!block%-w%:y%=block%!4-h%
9570PROCwork_area_origin(handle%(game%),ox%,oy%)
9580dragx%=x%+4-ox%:dragy%=y%+8-oy%:drag%=-1
9590initx%=dragx%:inity%=dragy%:initnum%=dragval%
9600PROCmove_number
9610ENDPROC
9620
9630
9640DEF PROCrub_out_strike(dig%)
9650LOCAL x%,y%
9660IF strike$(dig%)="" THEN ENDPROC
9670strike$(dig%)=""
9680PROCstrike_redraw(dig%,0)
9690ENDPROC
9700
9710
9720DEF PROCremove_strike(dig%)
9730IF strike$(dig%)="" THEN ENDPROC
9740PROCrub_out_strike(dig%)
9750dragval%=30
9760PROCpick_up_number
9770ENDPROC
9780
9790
9800DEF PROCset_up_rub_out
9810IF drag% THEN SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
9820dragval%=10:rubber%=-1
9830*POINTER 0
9840PROCpick_up_number
9850ENDPROC
9860
9870
9880DEF PROCrub_out(icon%)
9890LOCAL x%,Y3%,Mode%,flg%,dig%
9900Mode%=-(mode%(NameNo%)=1 AND SCformat%=2)
9910
9920IF SCformat%=2 THEN
9930 dig%=icon%-18:flg%=(icon%>26)
9940 Y3%=y3%:x%=FNdigx(dig%)
9950ELSE
9960 dig%=icon%-28:flg%=(icon%<28)
9970 Y3%=-596:x%=FNprintdigx(902,dig%)
9980ENDIF
9990IF flg% THEN ENDPROC
10000IF dig3$(dig%)="" THEN ENDPROC
10010
10020sum% -=VALdig3$(dig%)*10^dig%
10030dig3$(dig%)="":nextmess%=-(Helplev%=5 AND Mode%=-1)
10040SYS"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75
10050IF Mode%=1 AND dig%<nextdig% THEN PROCdelete_current_box(dig%)
10060IF sum%=0 THEN PROCset_top_icon(0,0)
10070IF message$(0)<>"" THEN PROCremove_message
10080nextmess%=-(Helplev%=5 AND Mode%=1)
10090ENDPROC
10100
10110
10120DEF FNcheck_rubout
10130LOCAL n%:n%=rubdig%
10140REPEAT
10150 n% +=1
10160UNTIL dig3$(n%)="" OR n%=nextdig% OR n%=anslim%
10170IF dig3$(n%)="" AND n%<nextdig% THEN =n% ELSE =-1
10180
10190
10200DEF PROCplace_carry(pos%)
10210LOCAL x%,x2%,h%,valid%,digcase%:double%=0:digcase%=0
10220
10230valid%=(pos%=nextdig%+Bstep% AND carry%=-1 AND strike%=0 OR Cdone%(pos%)=-1 OR Helplev%<=2 AND pos%<=anslim% OR try%>0)
10240IF mode%(NameNo%)=1 AND valid%=0 THEN PROCmessage("pl"):ENDPROC
10250IF mode%(NameNo%)=1 AND Helplev%=5 AND FNcheck_dig_val(pos%,"c")=0 THEN PROCmessage("ck"):ENDPROC
10260IF mode%(NameNo%)=0 AND (pos%>anslim% AND operator%(NameNo%)=1 OR pos%>FNquest_limit AND operator%(NameNo%)=2) THEN ENDPROC
10270
10280IF message$(1)<>"" AND mode%(NameNo%)=1 AND NOT(Helplev%=5 AND Cdone%(pos%)=-1) THEN PROCremove_message
10290nextmess%=-(Helplev%=5 AND nextdig%<=anslim% AND mode%(NameNo%)=1 AND (Cdone%(pos%)=0 OR Cdone%(pos%)=-1 AND FNcarry_2dig(pos%)=-1))
10300
10310SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
10320
10330IF operator%(NameNo%)=2 AND LEN carry$(pos%)=1 AND dragval%=1 AND FNcarry_2dig(pos%)=-1 THEN
10340 carry$(pos%)="1"+carry$(pos%)
10350 IF Cdone%(pos%)=-1 AND pos%=nextdig%+Bstep% THEN Cdone%(pos%)=0
10360ELSE
10370 carry$(pos%)=STR$dragval%
10380ENDIF
10390
10400drag%=0
10410PROCcarry_redraw(pos%,0)
10420IF Helplev%=2 AND st_dig%(pos%)=1 AND strike$(pos%)="" OR Cdone%(pos%)=-1 THEN ENDPROC
10430Cdone%(pos%)=-1
10440
10450IF mode%(NameNo%)=1 AND operator%(NameNo%)=2 THEN
10460 IF pos%=nextdig% THEN reduce%=0:carry%=0:REM Triggers next digit
10470 IF FNcarry_2dig(pos%)=-1 AND LENcarry$(pos%)=1 AND Helplev%=2 AND pos%=nextdig% THEN
10480 IF strike$(pos%+1)="/" THEN digcase%=-1 ELSE PROCcount_steps:pos%=nextdig%+Bstep%+1
10490 Bstep% +=1:reduce%=-1
10500 ENDIF
10510ENDIF
10520
10530IF mode%(NameNo%)=1 AND pos%=nextdig%+Bstep% THEN
10540 REM Cdone%(pos%)=-1
10550 IF operator%(NameNo%)=1 THEN
10560 IF Helplev%>2 THEN PROCdig_carry_redraw(nextdig%)
10570 IF pos%=nextdig% THEN carry%=0
10580 ELSE
10590 IF reduce%=-1 THEN
10600 reduce%=digcase%:Bstep% -=1
10610 IF strike$(nextdig%+Bstep%)="" AND st_dig%(nextdig%+Bstep%)=1 THEN
10620 strike%=-1:carry%=-1
10630 IF Helplev%>2 THEN PROCstrike_redraw(nextdig%,Bstep%)
10640 ELSE
10650 reduce%=0
10660 IF Bstep%=0 AND VALcarry$(nextdig%)=car_dig%(nextdig%) THEN
10670 IF Helplev%>2 THEN PROCdigit_redraw(nextdig%):carry%=0
10680 ELSE
10690 IF Helplev%>2 THEN PROCcarry_redraw(nextdig%,Bstep%)
10700 ENDIF
10710 ENDIF
10720 ELSE
10730 IF Helplev%>2 THEN PROCdigit_redraw(nextdig%)
10740 carry%=0:reduce%=0:Bstep%=0
10750 ENDIF
10760 ENDIF
10770ENDIF
10780ENDPROC
10790
10800
10810DEF FNcarry_2dig(pos%)=car_dig%(pos%)>9 AND car_dig%(pos%) MOD 10<>VAL dig1$(pos%)
10820
10830
10840DEF PROCcarry_posx(pos%,RETURN x%,RETURN h%)
10850IF operator%(NameNo%)=1 THEN
10860 x%=FNdigx(pos%)+37:h%=26
10870ELSE
10880 x%=FNdigx(pos%)-14:h%=35
10890ENDIF
10900ENDPROC
10910
10920
10930DEF PROCremove_carry(pos%)
10940LOCAL x%,h%
10950IF carry$(pos%)="" THEN ENDPROC
10960PROCsplit_carry(pos%,dragval%)
10970PROCcarry_redraw(pos%,0)
10980rubber%=0
10990SYS"Wimp_GetPointerInfo",,block%
11000PROCpick_up_number
11010PROCmove_number
11020ENDPROC
11030
11040
11050DEF PROCsplit_carry(pos%,RETURN lift%)
11060LOCAL xco%,l$,r$:xco%=!block%
11070IF LEN carry$(pos%)>1 THEN
11080 PROCwork_area_origin(handle%(game%),ox%,oy%)
11090 l$=LEFT$(carry$(pos%),1):r$=RIGHT$(carry$(pos%),1)
11100 IF xco%-ox%<FNdigx(pos%)+14 THEN carry$(pos%)=r$:lift%=VALl$ ELSE carry$(pos%)=l$:lift%=VALr$
11110ELSE
11120 lift%=VALcarry$(pos%)
11130 carry$(pos%)=""
11140ENDIF
11150ENDPROC
11160
11170
11180DEF PROCrub_out_carry(pos%)
11190LOCAL x%,h%,xco%,l%:xco%=!block%
11200IF carry$(pos%)="" THEN ENDPROC
11210PROCsplit_carry(pos%,l%)
11220PROCcarry_posx(pos%,x%,h%)
11230SYS"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+42,ycar%+h%
11240ENDPROC
11250
11260
11270DEF PROCgrid
11280LOCAL x%,y%
11290SYS"Wimp_SetColour",15
11300FOR x%=0 TO 1275 STEP 75
11310 MOVE ox%+x%,oy%-900:DRAW ox%+x%,oy%-150
11320NEXT
11330FOR y%=-900 TO -150 STEP 75
11340 MOVE ox%,oy%+y%:DRAW ox%+1275,oy%+y%
11350NEXT
11360MOVE ox%,oy%:DRAW ox%+1275,oy%
11370
11380SYS"OS_SpriteOp",&134,sarea%,"numbers",ox%+75,oy%-825,0,scale27%,trans%
11390IF operator%(NameNo%)=2 THEN SYS"OS_SpriteOp",&134,sarea%,"strike",ox%+900,oy%-825,0,scale27%,trans%
11400ENDPROC
11410
11420
11430DEF PROCsum_parts
11440LOCAL x%,d%,dig$,shift%,x1%,symbol%,limQ%,lim%,level%
11450anslim%=FNanswer_limit:limQ%=FNquest_limit
11460symbol%=FNdigx(limQ%)-75
11470
11480SYS"Wimp_SetColour",7
11490IF operator%(NameNo%)=1 THEN x%=FNdigx(anslim%) ELSE x%=FNdigx(limQ%)
11500RECTANGLE FILL ox%+x%,oy%+y3%+63,450-x%,8
11510RECTANGLE FILL ox%+x%,oy%+y3%-12,450-x%,8
11520
11530IF operator%(NameNo%)=1 THEN
11540 SYS"OS_SpriteOp",&134,sarea%,"plus",ox%+symbol%,oy%+y2%,0,scale%,trans%
11550ELSE
11560 SYS"OS_SpriteOp",&134,sarea%,"minus",ox%+symbol%,oy%+y2%,0,scale%,trans%
11570ENDIF
11580
11590IF colname%(NameNo%) THEN
11600 IF operator%(NameNo%)=1 THEN lim%=anslim% ELSE lim%=limQ%
11610 FOR d%=0 TO lim%
11620 x%=FNdigx(d%)+19+14*(d%=4 AND decimal%(NameNo%)=0)
11630 power%=d%+2*(decimal%(NameNo%)=1)
11640 SYS"OS_SpriteOp",&134,sarea%,"dig"+STR$power%,ox%+x%,oy%+y0%,0,scale%,trans%
11650 NEXT
11660ENDIF
11670
11680ENDPROC
11690
11700
11710DEF FNdigx(d%)=77+75*(4-d%)
11720
11730
11740DEF PROCsum_numbers
11750LOCAL d%,x%,y%
11760FOR d%=0 TO 4
11770 x%=FNdigx(d%)
11780 IF dig1$(d%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"n"+dig1$(d%),ox%+x%+2,oy%+y1%,0,scale27%,trans%
11790 IF dig2$(d%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"n"+dig2$(d%),ox%+x%+2,oy%+y2%,0,scale27%,trans%
11800 IF dig3$(d%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"move"+dig3$(d%),ox%+x%+19,oy%+y3%+12,8,scale27%,trans%
11810
11820 IF operator%(NameNo%)=1 THEN
11830 IF carry$(d%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"carry"+carry$(d%),ox%+x%+37,oy%+ycar%,0,scale%,trans%
11840 ELSE
11850 IF strike$(d%)="/" THEN SYS"OS_SpriteOp",&134,sarea%,"move30",ox%+x%+16,oy%+y1%+15,8,scale27%,trans%
11860 IF d%>0 THEN
11870 IF carry$(d%-1)<>"" THEN PROCprint_carry_dig(FNdigx(d%-1),d%-1)
11880 IF d%=4 AND carry$(d%)<>"" THEN PROCprint_carry_dig(FNdigx(d%),d%)
11890 ENDIF
11900 ENDIF
11910NEXT
11920
11930IF decimal%(NameNo%) THEN
11940 FOR y%=y1% TO y3% STEP -75
11950 SYS"OS_SpriteOp",&134,sarea%,"decpoint",ox%+FNdigx(2)+4,oy%+y%,8,scale%,trans%
11960 NEXT
11970ENDIF
11980ENDPROC
11990
12000
12010DEF PROCsum_numbers_est
12020LOCAL d%,x%
12030FOR d%=0 TO 4
12040 x%=FNprintdigx(902,d%)
12050 IF dig3$(d%)<>"" THEN SYS"OS_SpriteOp",&134,sarea%,"move"+dig3$(d%),ox%+x%+19,oy%-584,8,scale27%,trans%
12060NEXT
12070ENDPROC
12080
12090
12100DEF PROCprint_carry_dig(x%,d%)
12110LOCAL n$
12120IF LEN carry$(d%)=1 THEN
12130 SYS"OS_SpriteOp",&134,sarea%,"carry"+carry$(d%),ox%+x%-5,oy%+ycar%+4,8,scale%,trans%
12140ELSE
12150 n$=RIGHT$(carry$(d%),1)
12160 SYS"OS_SpriteOp",&134,sarea%,"carry1",ox%+x%-12,oy%+ycar%+4,8,scale%,trans%
12170 SYS"OS_SpriteOp",&134,sarea%,"carry"+n$,ox%+x%,oy%+ycar%+4,8,scale%,trans%
12180ENDIF
12190ENDPROC
12200
12210
12220DEF PROCmake_add(level%)
12230LOCAL f%,s%
12240CASE level% OF
12250 WHEN 1:REPEAT
12260 f%=RND(80)+10:s%=RND(10)-1
12270 UNTIL f%+s%<INT((f%+10)/10)*10
12280 WHEN 2:REPEAT
12290 f%=RND(80)+10:s%=RND(80)+10
12300 UNTIL ((INT((f%+10)/10)*10)+(INT(s%/10)*10)>(f%+s%)) AND (f%+s%)<100
12310 WHEN 3:f%=RND(80)+10:s%=RND(9)
12320 WHEN 4:REPEAT
12330 f%=RND(80)+10:s%=RND(80)+10
12340 UNTIL f%+s%<100
12350 WHEN 5:f%=RND(80)+10:s%=RND(80)+10
12360 WHEN 6:f%=RND(800)+100:s%=RND(800)+100
12370 WHEN 7:f%=RND(8000)+100:s%=RND(8000)+100
12380ENDCASE
12390IF s%=0 THEN
12400 s%=1
12410 IF f% MOD 10=9 THEN f% -=1
12420ENDIF
12430num1%=f%:num2%=s%:ans%=f%+s%
12440ENDPROC
12450
12460
12470DEF PROCresults_sum
12480LOCAL st$,op$,down%,num1$,num2$,ans$,fill$,fill2$
12490down%=1-(newR%=1):Rcnt% +=down%:notsavedR%=-1:newR%=0
12500IF decimal%(NameNo%) THEN
12510 num1$=FNinsert_point(STR$num1%)
12520 num2$=FNinsert_point(STR$num2%)
12530 ans$=FNinsert_point(STR$ans%)
12540ELSE
12550 num1$=STR$num1%:num2$=STR$num2%:ans$=STR$ans%
12560ENDIF
12570
12580fill$=STRING$(12-(LEN(num1$+num2$))," ")
12590fill2$=STRING$(6-LEN ans$," ")
12600IF game%=1 THEN op$=" + " ELSE op$=" - "
12610st$=" ("+STR$(quest%+1)+") "+num1$+op$+num2$+fill$+" = ("+ans$+")"+fill2$
12620Rptr%=FNadd_string(Rptr%,st$,down%)
12630ENDPROC
12640
12650
12660DEF FNinsert_point(num$)
12670LOCAL split%,left$,right$
12680IF LEN num$>2 THEN
12690 split%=LEN num$-2
12700 left$=LEFT$(num$,split%):right$=RIGHT$(num$,2)
12710ELSE
12720 left$="0":right$=STRING$(2-LENnum$,"0")+num$
12730ENDIF
12740=left$+"."+right$
12750
12760
12770DEF PROCmake_sub(level%)
12780LOCAL f%,s%,a%,x%,f$,s$
12790REPEAT
12800 CASE level% OF
12810 WHEN 1:REPEAT
12820 f%=RND(80)+10:s%=RND(10)-1
12830 UNTIL f%-s%>(INT(f%/10)*10)
12840 WHEN 2,3:f$="":s$=""
12850 FOR x%=1 TO level%
12860 REPEAT
12870 f%=RND(10)-1:s%=RND(10)-1
12880 UNTIL f%>s%
12890 f$=f$+STR$f%:s$=s$+STR$s%
12900 NEXT
12910 f%=VAL(f$):s%=VAL(s$)
12920 WHEN 4:PROCsubsub(3,1,0)
12930 WHEN 5:PROCsubsub(3,2,0)
12940 WHEN 6:PROCsubsub(4,3,0)
12950 WHEN 7:PROCsubsub(4,3,1)
12960 WHEN 8:PROCsubsub(4,3,2)
12970 WHEN 9:PROCsubsub(5,4,3)
12980 WHEN 10:f%=RND(80)+10:s%=RND(9)
12990 ENDCASE
13000UNTIL s%>0
13010num1%=f%:num2%=s%:ans%=f%-s%
13020ENDPROC
13030
13040
13050DEF PROCsubsub(len%,dec%,zeros%)
13060LOCAL x%
13070f$="":s$="":z%=0
13080FOR x%=1 TO len%
13090 f%=RND(10)-1:s%=RND(10)-1
13100 IF x%>dec% REPEAT:f%=RND(10)-1:s%=RND(10)-1:UNTIL f%>s%
13110 IF x%=dec%+1 REPEAT:f%=RND(10)-1:s%=RND(10)-1:UNTIL f%>s%+1
13120 IF x%<len% THEN IF RND(6)<zeros% f%=0
13130 IF f%=0 AND x%>1 THEN
13140 z% +=1
13150 IF z%>zeros% f%=RND(9)
13160 ENDIF
13170 f$=STR$f%+f$:s$=STR$s%+s$
13180NEXT
13190f%=VAL(f$):s%=VAL(s$)
13200ENDPROC
13210
13220
13230DEF PROCdigits(num%,dig$())
13240LOCAL d%
13250FOR d%=0 TO 4
13260 IF num%>0 THEN dig$(d%)=STR$(num% MOD 10) ELSE dig$(d%)=""
13270 num%=num% DIV 10
13280NEXT
13290IF decimal%(NameNo%)=1 AND dig$(2)="" THEN dig$(2)="0"
13300ENDPROC
13310
13320
13330DEF PROCfind_error
13340LOCAL x%
13350IF nexterr%>=nextdig% THEN ENDPROC
13360REPEAT
13370nexterr% +=1
13380UNTIL dig3$(nexterr%)<>answer$(nexterr%) OR nexterr%=nextdig%
13390
13400IF nexterr%<nextdig% THEN
13410 IF rubdig%>-1 THEN x%=FNdigx(rubdig%)+10
13420 SYS"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75
13430 rubdig%=nexterr%:x%=FNdigx(rubdig%)+10
13440 SYS"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75
13450ENDIF
13460ENDPROC
13470
13480
13490DEF PROCnull_event
13500IF drag% THEN PROCmove_number
13510IF TIME-sesstime%>timelim%(NameNo%)*6000 AND Notimer%(NameNo%)=0 AND game%>0 THEN
13520 message$(1)="Time's up":message$(2)="":VDU7:PROCfont_to_screen
13530 PROCpause(400):PROCgame_end
13540ENDIF
13550IF drawfont% THEN PROCfont_to_screen:PROCmessage_sprite_back:drawfont%=0
13560IF nextmess% THEN PROCpause(100*(nextmess%-1)):PROCmessage("pr"):nextmess%=0
13570IF printer%(NameNo%)=1 AND driver%=0 AND enprint%=-1 THEN
13580 driver%=FNensure_Pdriver
13590 IF driver% THEN PROCset_top_icon(7,-1):PROCshade_icon(SChandle%,11,0)
13600ENDIF
13610IF FNwindow_open(Lhandle%)=-1 AND create%=-2 THEN PROCloadbox_windows(-1):create%=-1
13620IF TIME-TLtime%>1000 THEN PROCclose_window(Thandle%):TLtime%=1E7
13630ENDPROC
13640
13650
13660DEF PROCmove_number
13670LOCAL x%,y%,x1%,x2%,y1%,y2%,w%,h%,flg%
13680SYS"Wimp_GetPointerInfo",,block%
13690
13700IF rubber% THEN
13710 w%=75:h%=75:x%=!block%-6:y%=block%!4-12
13720ELSE
13730 w%=36-6*(dragval%=30):h%=44:x%=!block%-w%/2:y%=block%!4-h%/2
13740ENDIF
13750
13760PROCwork_area_origin(handle%(game%),ox%,oy%)
13770x% -=ox%:y% -=oy%
13780
13790IF rubber%=-1 AND (y%>-266 OR dragy%>-266) THEN
13800 SYS"OS_SpriteOp",&13C,sarea%,"backtop1",1 TO r0%,r1%,r2%,r3%
13810 SYS"OS_SpriteOp",&134,sarea%,"top1",0,0,0,-1,-1
13820 SYS"OS_SpriteOp",&134,sarea%,"move10",x%-150,844+y%-694,8,-1,-1
13830 SYS"OS_SpriteOp",r0%,r1%,r2%,r3%:flg%=-1:VDU26
13840ENDIF
13850IF ABS(x%-dragx%)<4 AND ABS(y%-dragy%)<8 THEN ENDPROC
13860
13870IF x%>dragx% THEN x2%=x%+w%:x1%=dragx% ELSE x2%=dragx%+w%:x1%=x%
13880IF y%>dragy% THEN y2%=y%+h%:y1%=dragy% ELSE y2%=dragy%+h%:y1%=y%
13890dragx%=x%:dragy%=y%
13900IF ABS(initx%-dragx%)>12 OR ABS(inity%-dragy%)>12 THEN double%=0
13910
13920IF rubber% THEN
13930 cond%=-((x2%<170 OR x1%>285) AND y1%>-165)
13940 IF x%<0 OR x%>1276 OR y%<-844 OR y%>0 THEN cond%=1
13950 OSCLI "POINTER "+STR$ cond%
13960ENDIF
13970
13980IF y2%>-150 THEN
13990 IF y1%>-150 THEN y1%=-150
14000 IF y2%>-150 THEN y2%=-150
14010ENDIF
14020IF NOT(y1%=-150 AND y2%=-150) THEN SYS"Wimp_ForceRedraw",handle%(game%),x1%,y1%,x2%,y2%
14030
14040IF flg% THEN
14050 PROCwork_area_origin(handle%(game%),ox%,oy%)
14060 flg%=FNupdate_window(handle%(game%),152,-150,300,0)
14070 WHILE flg%
14080 SYS"OS_SpriteOp",&134,sarea%,"backtop1",ox%+150,oy%-146,0,scale%,trans%
14090 SYS"Wimp_GetRectangle",,block% TO flg%
14100 ENDWHILE
14110 IF y1%<-146 THEN SYS"Wimp_ForceRedraw",handle%(game%),x1%,y1%,x2%,-146
14120ENDIF
14130ENDPROC
14140
14150
14160DEF PROCplace_number(ICdrag%)
14170LOCAL x%,y%,Y3%,dig%,Mode%,flg%,valid%,range%,Dig%:valid%=-1
14180IF game%=1 THEN range%=anslim% ELSE range%=FNquest_limit
14190Mode%=(mode%(NameNo%)=1 AND SCformat%=2)
14200IF dragval%=30 THEN ENDPROC
14210check%=-1:double%=0
14220SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
14230IF message$(1)<>"" AND Helplev%<5 THEN PROCremove_message
14240PROCwork_area_origin(handle%(game%),ox%,oy%)
14250
14260IF SCformat%=2 THEN
14270 dig%=ICdrag%-18:Y3%=y3%
14280 x%=FNdigx(dig%):flg%=(ICdrag%>26)
14290ELSE
14300 dig%=ICdrag%-28:Y3%=-596
14310 x%=FNprintdigx(902,dig%):flg%=(ICdrag%<28)
14320ENDIF
14330IF flg% THEN ENDPROC
14340
14350IF Mode%=-1 AND SCformat%=2 THEN valid%=((dig%<=nextdig% OR game%=1 AND Helplev%=0 AND dig%<=range% OR game%=2 AND nextdig%=anslim%+1 AND dig%<=range%) AND (carry%=0 OR carry%=-1 AND (Helplev%<3 OR rubdig%>-1)))
14360IF valid%=0 THEN PROCmessage("pl"):ENDPROC
14370IF Mode%=0 AND SCformat%=2 AND dig%>range% THEN ENDPROC
14380
14390IF Mode%=-1 AND Helplev%=5 AND FNcheck_dig_val(dig%,"ans")=0 THEN
14400 IF rubdig%=-1 THEN Dig%=nextdig% ELSE Dig%=rubdig%
14410 IF dig%=Dig% THEN PROCmessage("ck") ELSE PROCmessage("pr")
14420 flg%=-1
14430ENDIF
14440IF flg% THEN ENDPROC
14450
14460IF Mode%=-1 AND Helplev%>0 AND FNcheck_sum_type(dig%)<>0 THEN PROCmessage("sum"):ENDPROC
14470
14480dragx%=0:dragy%=-825:drag%=0
14490
14500IF dig3$(dig%)<>"" THEN sum% -=VALdig3$(dig%)*10^dig%
14510dig3$(dig%)=STR$dragval%
14520sum% +=dragval%*10^dig%
14530
14540 SYS"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75:REM Current digit
14550 IF dig%<nextdig% AND rubdig%=-1 THEN ENDPROC
14560
14570IF Mode%=-1 THEN
14580 IF dig%=nextdig% THEN nextdig% -=(nextdig%<=anslim%)
14590 IF car_dig%(nextdig%)=(operator%(NameNo%)=2) AND nextdig%<=anslim% THEN Cdone%(nextdig%)=-1
14600 IF st_dig%(nextdig%)=0 AND operator%(NameNo%)=2 AND nextdig%<=anslim% THEN STdone%(nextdig%)=-1
14610 IF operator%(NameNo%)=1 AND Helplev%=0 THEN PROCskip_over
14620
14630 IF rubdig%=-1 THEN
14640 IF operator%(NameNo%)=2 THEN PROCcount_steps
14650 IF car_dig%(nextdig%+Bstep%)>1-operator%(NameNo%) AND carry$(nextdig%+Bstep%)="" THEN carry%=-1 ELSE carry%=0
14660 ENDIF
14670
14680 IF dig%=rubdig% THEN
14690 rubdig%=FNcheck_rubout
14700 ENDIF
14710 IF try%>0 AND rubdig%=-1 THEN PROCfind_error
14720
14730 PROCredraw_box_position(nextdig%,Helplev%)
14740ENDIF
14750nextmess%=-(Helplev%=5 AND (nextdig%<=anslim% OR rubdig%>-1) AND Mode%=-1)
14760IF (try%<tries%(NameNo%) OR force5%=-1) AND SCformat%=2 THEN PROCset_top_icon(0,-1)
14770ENDPROC
14780
14790
14800DEF PROCskip_over
14810REM Addition level 0
14820WHILE dig3$(nextdig%)<>"" AND nextdig%<=anslim%
14830nextdig% +=1
14840ENDWHILE
14850ENDPROC
14860
14870
14880DEF PROCredraw_box_position(pos%,help%)
14890IF operator%(NameNo%)=1 THEN
14900 PROCdig_carry_redraw(pos%)
14910ELSE
14920 IF carry%=-1 AND rubdig%=-1 AND help%>2 THEN
14930
14940 IF strike% THEN
14950 PROCstrike_redraw(pos%,Bstep%)
14960 ELSE
14970 PROCcarry_redraw(pos%,Bstep%)
14980 ENDIF
14990
15000 ELSE
15010 PROCdigit_redraw(pos%)
15020 ENDIF
15030ENDIF
15040ENDPROC
15050
15060
15070DEF PROCdig_carry_redraw(dig%)
15080REM Addition
15090IF rubdig%>-1 THEN x%=FNdigx(rubdig%)+10 ELSE x%=FNdigx(dig%)+10
15100SYS"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+75,ycar%+106:REM Next digit or carry
15110ENDPROC
15120
15130
15140DEF PROCdigit_redraw(dig%)
15150REM Subtraction
15160IF rubdig%>-1 THEN x%=FNdigx(rubdig%)+10 ELSE x%=FNdigx(dig%)+10
15170SYS"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75:REM Next digit
15180ENDPROC
15190
15200
15210DEF PROCcarry_redraw(dig%,shift%)
15220LOCAL x%,h%
15230PROCcarry_posx(dig%+shift%,x%,h%)
15240SYS"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+42,ycar%+h%+4:REM Next carry
15250ENDPROC
15260
15270
15280DEF PROCstrike_redraw(dig%,shift%)
15290x%=FNdigx(dig%+shift%)+10
15300SYS"Wimp_ForceRedraw",handle%(game%),x%,y1%,x%+75,y1%+75:REM Next strike
15310ENDPROC
15320
15330
15340DEF PROCcount_steps
15350LOCAL flg%
15360Bstep%=0
15370IF Helplev%=2 AND NOT(st_dig%(nextdig%+1)=1 AND strike$(nextdig%+1)="") THEN
15380 IF strike$(nextdig%)="" AND st_dig%(nextdig%)=1 THEN strike%=-1:carry%=-1:flg%=-1
15390 IF strike$(nextdig%)="/" AND carry$(nextdig%)="" THEN reduce%=-1:carry%=-1:flg%=-1
15400ENDIF
15410IF flg% THEN ENDPROC
15420
15430IF st_dig%(nextdig%+1)=1 AND strike$(nextdig%+1)="" THEN Bstep%=1 ELSE ENDPROC
15440strike%=-1:carry%=-1
15450WHILE dig1$(nextdig%+Bstep%)="0" AND strike$(nextdig%+Bstep%)=""
15460 Bstep% +=1
15470ENDWHILE
15480ENDPROC
15490
15500
15510DEF PROCplace_strike(dig%)
15520LOCAL x%,h%,diglim%,flg%
15530IF SCformat%=1 THEN ENDPROC
15540IF operator%(NameNo%)=2 THEN diglim%=FNquest_limit ELSE diglim%=anslim%
15550IF mode%(NameNo%)=1 AND st_dig%(dig%)=1 AND strike$(dig%)="" AND dig%>=nextdig% AND Helplev%<=2 THEN Bstep%=dig%-nextdig%:carry%=-1
15560IF mode%(NameNo%)=1 AND Helplev%>2 AND dig%<>nextdig%+Bstep% AND STdone%(dig%)=0 AND try%=0 OR Helplev%<=2 AND dig%>diglim% THEN PROCmessage("pl"):ENDPROC
15570IF mode%(NameNo%)=0 AND dig%>diglim% THEN ENDPROC
15580IF dragval%<30 THEN
15590 IF Helplev%=5 THEN PROCmessage("ck")
15600 flg%=-1
15610ENDIF
15620IF flg% THEN ENDPROC
15630IF message$(1)<>"" AND mode%(NameNo%)=1 AND NOT(Helplev%=5 AND STdone%(dig%)=-1) THEN PROCremove_message
15640SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
15650PROCwork_area_origin(handle%(game%),ox%,oy%)
15660strike$(dig%)="/":drag%=0:double%=0:dragval%=0
15670nextmess%=-(Helplev%=5 AND nextdig%<=anslim% AND mode%(NameNo%)=1 AND Helplev%=5 AND STdone%(dig%)=0)
15680PROCstrike_redraw(dig%,0)
15690IF st_dig%(dig%)=0 THEN ENDPROC
15700STdone%(dig%)=-1
15710
15720IF mode%(NameNo%)=1 AND dig%=nextdig%+Bstep% AND carry%=-1 THEN
15730 REM STdone%(dig%)=-1
15740 IF Bstep%>0 OR carry$(nextdig%+Bstep%)="" THEN
15750 reduce%=(carry$(nextdig%+Bstep%)=""):strike%=0
15760 IF reduce%=0 THEN Bstep% -=1
15770 IF Helplev%>2 THEN PROCcarry_redraw(nextdig%,Bstep%)
15780 ELSE
15790 IF Helplev%>2 THEN PROCdigit_redraw(nextdig%)
15800 strike%=0:carry%=0
15810 ENDIF
15820ENDIF
15830ENDPROC
15840
15850
15860DEF FNcheck_dig_val(dig%,source$)
15870LOCAL num%,d%,dig1%
15880d%=dig%
15890IF operator%(NameNo%)=1 THEN
15900 IF source$="ans" THEN num%=(VAL dig1$(d%)+VAL dig2$(d%)+car_dig%(d%)) MOD 10 ELSE num%=car_dig%(d%)
15910ELSE
15920 IF source$="ans" THEN
15930 IF car_dig%(d%)>0 THEN dig1%=car_dig%(d%) ELSE dig1%=VAL dig1$(d%)
15940 num%=dig1%-VAL dig2$(d%)
15950 ELSE
15960 units%=car_dig%(d%) MOD 10
15970 IF FNcarry_2dig(d%) THEN
15980 IF carry$(d%)="" THEN num%=units% ELSE num%=1
15990 ELSE
16000 IF car_dig%(d%)>9 THEN num%=1 ELSE num%=units%
16010 ENDIF
16020 ENDIF
16030ENDIF
16040=(num%=dragval%)
16050
16060
16070DEF FNcheck_sum_type(dig%)
16080LOCAL d1%,d2%
16090d1%=VALdig1$(dig%):d2%=VALdig2$(dig%)
16100IF operator%(NameNo%)=1 THEN =FNcheck_sum_typeA ELSE =FNcheck_sum_typeS(dig%)
16110
16120DEF FNcheck_sum_typeS(dig%)
16130IF dragval%=VALanswer$(dig%) THEN =0
16140IF d2%-d1%=dragval% AND d1%<>d2% THEN =1
16150IF (d1%+d2%) MOD 10=dragval% THEN =2
16160=0
16170
16180DEF FNcheck_sum_typeA
16190IF dragval%=VALanswer$(dig%) THEN =0
16200IF (d1%-d2%)=dragval% THEN =1
16210=0
16220
16230
16240DEF PROCplace_double_click
16250LOCAL pos%,step%
16260step%=-Bstep%*(Helplev%>2)
16270IF nextdig%>anslim% AND car_dig%(anslim%+1)=0 AND rubdig%=-1 OR mode%(NameNo%)=0 OR dragval%=30 AND strike%=0 THEN ENDPROC
16280
16290IF rubdig%>-1 THEN pos%=rubdig% ELSE pos%=nextdig%+step%
16300
16310IF carry%=0 OR rubdig%>-1 OR Helplev%<3 THEN
16320 PROCplace_number(pos%+18)
16330ELSE
16340 IF strike% THEN PROCplace_strike(pos%) ELSE PROCplace_carry(pos%)
16350ENDIF
16360ENDPROC
16370
16380
16390DEF PROCreplace_number(num%)
16400LOCAL r0%,r1%,r2%,r3%
16410IF initnum%<>num% THEN ENDPROC
16420drag%=0:double%=0:dragval%=0
16430IF num%=10 THEN
16440 SYS"OS_SpriteOp",&13C,sarea%,"backtop1",1 TO r0%,r1%,r2%,r3%
16450 SYS"OS_SpriteOp",&134,sarea%,"top1",0,0,0,-1,-1
16460 SYS"OS_SpriteOp",r0%,r1%,r2%,r3%:VDU26
16470ENDIF
16480SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
16490ENDPROC
16500
16510
16520DEF PROCgame_end
16530LOCAL r%
16540IF game%=0 THEN ENDPROC
16550PROCshade_item(menu%,2,0)
16560PROCclose_window(handle%(game%)):game%=0:drag%=0:startOwn%=0
16570PROCclose_window(CChandle%)
16580PROCclose_window(Ohandle%):Owin%=0
16590PROCclose_window(Phandle%):PROCclose_window(P2handle%)
16600IF marked%=-1 AND auto%(NameNo%)=1 AND ownsum%(NameNo%)=0 THEN PROCnew_auto_level(correct%)
16610IF saveR%(NameNo%)=1 AND quest%>0 THEN PROCend_levels
16620REM IF notsavedO% THEN PROCsave_file($savebuff%)
16630IF autosaveR%=-1 AND saveR%(NameNo%)=1 AND notsavedR%=-1 THEN
16640 PROCresults_text_file($savetextbuff%)
16650ENDIF
16660PROCshow_score("E")
16670ENDPROC
16680
16690
16700DEF PROCend_levels
16710LOCAL st$,perc$,Alev$,Slev$,auto$
16720Rcnt% +=2:Rcnt2% +=2
16730IF ownsum%(NameNo%)=0 THEN Alev$=STR$ Alevel%(NameNo%):Slev$=STR$ Slevel%(NameNo%) ELSE Alev$=" -":Slev$=" -"
16740IF quest% THEN perc$=STR$(INT(100*CorrectAns%/quest%+.5))+"%" ELSE perc$="0%"
16750IF autohelp%(NameNo%)=1 THEN auto$="Y" ELSE auto$="N"
16760st$=" End levels: add:"+Alev$+" sub:"+Slev$+", auto help:"+auto$+" "+perc$
16770Rptr%=FNadd_string(Rptr%,st$,2)
16780ENDPROC
16790
16800
16810DEF FNsum_filled
16820LOCAL n%,flg%:flg%=-1
16830FOR n%=0 TO anslim%
16840 IF dig3$(n%)="" AND NOT(n%=anslim% AND answer$(n%)="0") THEN flg%=0
16850NEXT
16860=flg%
16870
16880
16890DEF PROCcheck_to_results
16900IF newR%=1 AND try%=1 THEN PROCresults_next_name
16910IF try%=1 THEN PROCresults_sum
16920IF decimal%(NameNo%) THEN sum$=FNinsert_point(STR$sum%) ELSE sum$=STR$sum%
16930sum$=sum$+STRING$(6-LEN sum$," ")
16940IF newR%=0 THEN Rptr%=FNadd_string(Rptr%," "+sum$,0)
16950
16960IF estimate%(NameNo%)=1 AND correct%=-1 THEN
16970 IF decimal%(NameNo%) THEN sum$=FNinsert_point(STR$ EstVal%) ELSE sum$=STR$ EstVal%
16980 sum$="Est "+sum$
16990 IF newR%=0 THEN Rptr%=FNadd_string(Rptr%," "+sum$,0)
17000ENDIF
17010ENDPROC
17020
17030
17040DEF PROCcheck_sum
17050LOCAL n%,Correct%
17060correct%=(sum%=ans% AND FNsum_filled=-1):nextcheck%=-1:Correct%=correct%
17070CorrectAns% -=(correct%=-1 AND force5%=0):try% -=(force5%=0)
17080IF saveR%(NameNo%)=1 AND force5%=0 THEN PROCcheck_to_results
17090IF message$(1)<>"" AND mode%(NameNo%)=1 THEN PROCremove_message:message$(1)=""
17100
17110PROCwork_area_origin(handle%(game%),ox%,oy%)
17120flg%=FNupdate_window(handle%(game%),mkx%,y3%,mkx%+75,y3%+75)
17130WHILE flg%
17140 PROCmark
17150 SYS"Wimp_GetRectangle",,block% TO flg%
17160ENDWHILE
17170
17180IF (force%(NameNo%)=1 OR force5%=-1) AND try%>=tries%(NameNo%) AND (correct%=0 OR force5%=-1) THEN PROCforce_right_ans:IF force5%=-1 THEN ENDPROC
17190
17200IF estimate%(NameNo%)=1 AND correct%=-1 AND force5%=0 THEN PROCestimate_message
17210
17220IF correct%=-1 OR try%>=tries%(NameNo%) THEN
17230 REM Next question
17240 IF next%(NameNo%) THEN PROCset_top_icon(5,-1)
17250 IF printer%(NameNo%)=1 AND driver%=-1 AND (correct%=0 OR force5%=1) AND Psave%=0 THEN PROCsave_sum("S")
17260 FOR n%=0 TO 2:PROCset_top_icon(n%,0):NEXT
17270
17280 quest% +=1
17290 IF next%(NameNo%)=0 THEN
17300 PROCpause(200):force5%=0
17310 IF auto%(NameNo%)=1 AND ownsum%(NameNo%)=0 THEN PROCnew_auto_level(correct%)
17320 IF quest%<no_quest%(NameNo%) THEN
17330 IF ownsum%(NameNo%)=0 THEN PROCset_sum ELSE PROCset_up_sum_window
17340 ELSE
17350 PROCgame_end
17360 ENDIF
17370 ELSE
17380 IF correct%=0 AND try%>=tries%(NameNo%) AND force5%=0 THEN message$(1)="No more tries.":message$(2)="":PROCfont_to_screen:PROCmessage_sprite_back
17390 marked%=(next%(NameNo%)=1 OR ownsum%(NameNo%)=1)
17400 ENDIF
17410ELSE
17420 IF next%(NameNo%)=1 AND try%=1 THEN PROCshade_icon(handle%(game%),5,0)
17430 IF nextdig%=anslim%+1 THEN nexterr%=-1:PROCfind_error
17440 IF tries%(NameNo%)>1 THEN
17450 IF try%<tries%(NameNo%)-1 THEN message$(1)="Try again." ELSE message$(1)="One more try."
17460 message$(2)=""
17470 PROCfont_to_screen
17480 PROCmessage_sprite_back
17490 ENDIF
17500 PROCpause(200)
17510 SYS"Wimp_ForceRedraw",handle%(game%),mkx%,y3%,mkx%+75,y3%+75
17520ENDIF
17530IF autohelp%(NameNo%)=1 AND force5%=0 THEN PROCchange_help_level(Correct%)
17540nextmess%=-3*(Helplev%=5 AND mode%(NameNo%)=1 AND force5%=0 AND try%<tries%(NameNo%))
17550ENDPROC
17560
17570
17580DEF PROCforce_right_ans
17590IF force5%=0 THEN
17600 PROCpause(300)
17610 IF autohelp%(NameNo%)=1 THEN PROCchange_help_level(0)
17620 Helplev%=5:force5%=-1
17630 PROCset_sum
17640ELSE
17650 Helplev%=Hlevel%(NameNo%):force5%=1
17660ENDIF
17670ENDPROC
17680
17690
17700DEF PROCestimate_message
17710LOCAL est:est=EstVal%
17720IF decimal%(NameNo%) THEN est=est/100
17730message$(1)="You estimated "+STR$ est:message$(2)=""
17740
17750PROCfont_to_screen
17760PROCmessage_sprite_back
17770ENDPROC
17780
17790
17800DEF PROCnew_auto_level(correct%)
17810LOCAL level%,Lrange%,Hrange%:notsavedO%=-1
17820IF operator%(NameNo%)=1 THEN
17830 level%=Alevel%(NameNo%):Hrange%=7:numRW%=AnumRW%
17840ELSE
17850 level%=Slevel%(NameNo%):Hrange%=9:numRW%=SnumRW%
17860ENDIF
17870IF decimal%(NameNo%) THEN Lrange%=6 ELSE Lrange%=1
17880
17890IF correct% THEN
17900 IF numRW%>=0 THEN numRW% +=1
17910 IF numRW%<0 THEN numRW%=1
17920 IF newlevR%(NameNo%)<=numRW% THEN level% -=(level%<Hrange%):numRW%=0
17930ELSE
17940 IF numRW%<=0 THEN numRW% -=1
17950 IF numRW%>0 THEN numRW%=-1
17960 IF newlevW%(NameNo%)>=numRW% THEN level% +=(level%>Lrange%):numRW%=0
17970ENDIF
17980
17990IF operator%(NameNo%)=1 THEN
18000 Alevel%(NameNo%)=level%:$level_buffA%=STR$ Alevel%(NameNo%)
18010 AnumRW%=numRW%
18020 PROCreset_icon(Chandle%,5)
18030ELSE
18040 Slevel%(NameNo%)=level%:$level_buffS%=STR$ Slevel%(NameNo%)
18050 SnumRW%=numRW%
18060 PROCreset_icon(Chandle%,8)
18070ENDIF
18080
18090ENDPROC
18100
18110
18120DEF PROCchange_help_level(correct%)
18130IF correct% THEN
18140 Hlevel%(NameNo%) +=(Hlevel%(NameNo%)>MHlevel%(NameNo%))
18150ELSE
18160 Hlevel%(NameNo%) -=(Hlevel%(NameNo%)<5)
18170 IF try%<tries%(NameNo%) AND game%>0 THEN PROCchange_help_display(Hlevel%(NameNo%))
18180ENDIF
18190Helplev%=Hlevel%(NameNo%)
18200$Hbuff%=STR$ Hlevel%(NameNo%)
18210PROCreset_icon(Chandle%,31)
18220ENDPROC
18230
18240
18250DEF PROCchange_help_display(help%)
18260IF help%<3 AND Helplev%>=3 OR help%>=3 AND Helplev%<3 THEN
18270 PROCredraw_box_position(nextdig%,help%)
18280 PROCredraw_box_position(nextdig%,Helplev%)
18290ENDIF
18300IF FNwindow_open(Chandle%)=0 THEN nextmess%=-(Helplev%=5)
18310IF help%=5 AND Helplev%<5 THEN message$()="":SYS"Wimp_ForceRedraw",handle%(game%),600,y3%-24,1280,y3%+145
18320ENDPROC
18330
18340
18350DEF PROCshow_score(when$)
18360LOCAL off%,to_go%:off%=-(when$="E")
18370start%=off%
18380
18390PROCdelete_icon(SChandle%,9,off%)
18400PROCdelete_icon(SChandle%,10,1-off%)
18410PROCdelete_icon(SChandle%,11,1-off%)
18420PROCdelete_icon(SChandle%,12,1-off%)
18430PROCshade_icon(SChandle%,11,(printer%(NameNo%)=0 OR driver%=0 OR enprint%=0))
18440
18450$SCRbuff%=STR$ CorrectAns%
18460$SCQbuff%=STR$ quest%
18470$SCWbuff%=STR$ (quest%-CorrectAns%)
18480$Snamebuff%="Name : "+name$(NameNo%)
18490
18500IF when$="E" THEN
18510 $SCtbuff%="Time limit : "+STR$ timelim%(NameNo%)+" minute"
18520 IF timelim%(NameNo%)<>1 THEN $SCtbuff%=$SCtbuff%+"s"
18530ELSE
18540 to_go%=(6000*timelim%(NameNo%)-TIME+sesstime%+3000)/6000
18550 $SCtbuff%="You have "+STR$ to_go%+" minute"
18560 IF timelim%(NameNo%)<>1 THEN $SCtbuff%=$SCtbuff%+"s"
18570 $SCtbuff%=$SCtbuff%+" to go."
18580ENDIF
18590IF Notimer%(NameNo%) THEN $SCtbuff%="Time limit : None"
18600
18610SChandle%=FNcentre_window(SChandle%,"Y")
18620ENDPROC
18630
18640
18650DEF PROCmark
18660LOCAL sp$
18670IF correct%=-1 THEN sp$="tick" ELSE sp$="cross"
18680SYS"OS_SpriteOp",&134,sarea%,sp$,ox%+mkx%,oy%+y3%,8,scale%,trans%
18690ENDPROC
18700
18710
18720DEF PROCinput_box(dig%)
18730LOCAL x%,h%
18740PROCwork_area_origin(handle%(game%),ox%,oy%)
18750SYS"Wimp_SetColour",11
18760IF carry%=0 OR rubdig%>-1 OR Helplev%<=2 THEN
18770 IF rubdig%>-1 THEN dig%=rubdig%
18780 IF dig%<=anslim% THEN
18790 x%=FNdigx(dig%)+10
18800 RECTANGLE ox%+x%,oy%+y3%+4,52,52
18810 ENDIF
18820ELSE
18830 IF strike%=0 THEN
18840 PROCcarry_posx(dig%+Bstep%,x%,h%)
18850 RECTANGLE ox%+x%,oy%+ycar%,35,h%
18860 ELSE
18870 x%=FNdigx(dig%+Bstep%)+10
18880 RECTANGLE ox%+x%,oy%+y1%+4,52,52
18890 ENDIF
18900ENDIF
18910ENDPROC
18920
18930
18940DEF PROCcarry_positions
18950LOCAL dig%,flg%():DIM flg%(4)
18960st_dig%()=0
18970IF operator%(NameNo%)=1 THEN
18980 FOR dig%=0 TO 3
18990 IF VAL dig1$(dig%)+VAL dig2$(dig%)+car_dig%(dig%)>9 THEN car_dig%(dig%+1)=1
19000 NEXT
19010ELSE
19020 FOR dig%=0 TO 4:car_dig%(dig%)=VAL dig1$(dig%):NEXT
19030
19040 FOR dig%=0 TO 4
19050 IF car_dig%(dig%)-VAL dig2$(dig%)<0 THEN
19060 car_dig%(dig%) +=10:car_dig%(dig%+1) -=1
19070 st_dig%(dig%+1)=1:flg%(dig%)=-1:flg%(dig%+1)=-1
19080 ENDIF
19090 NEXT
19100
19110 FOR dig%=0 TO 4
19120 IF flg%(dig%)=0 THEN car_dig%(dig%)=-1
19130 NEXT
19140 IF mode%(NameNo%) THEN
19150 carry%=(car_dig%(0)>0):strike%=(st_dig%(1)>0)
19160 IF strike% THEN PROCcount_steps ELSE Bstep%=0
19170 IF car_dig%(0)=-1 THEN Cdone%(0)=-1
19180 ENDIF
19190ENDIF
19200ENDPROC
19210
19220
19230DEF FNanswer_limit
19240LOCAL ans$,len%
19250ans$=STR$ ans%:len%=LENans$-1
19260IF decimal%(NameNo%)=1 AND len%=1 THEN len%=2
19270=len%
19280
19290
19300DEF FNquest_limit
19310LOCAL n1$,n2$
19320n1%=LEN STR$ num1%-1:n2%=LEN STR$ num2%-1
19330IF n1%>n2% THEN =n1% ELSE =n2%
19340
19350
19360DEF FNmessage_plus(dig%)
19370LOCAL mess$,valid%
19380valid%=(VALcarry$(dig%)=1 AND car_dig%(dig%)=1 OR carry$(dig%)="" AND car_dig%(dig%)=0)
19390IF valid%=0 THEN mess$="You need to add " ELSE mess$="Add "
19400IF dig1$(dig%)="" AND dig2$(dig%)="" THEN =mess$+"1."
19410IF dig2$(dig%)<>"" THEN mess$=mess$+dig2$(dig%) ELSE mess$=mess$+"0"
19420IF dig1$(dig%)<>"" THEN mess$=mess$+" and "+dig1$(dig%) ELSE mess$=mess$+" and "+"0"
19430IF car_dig%(dig%)>0 THEN mess$=mess$+" + 1"
19440=mess$+"."
19450
19460
19470DEF FNmessage_minus(dig%)
19480LOCAL mess$,dig$,units%,valid%,d2$
19490units%=car_dig%(dig%) MOD 10
19500IF car_dig%(dig%)>-1 THEN dig$=STR$ car_dig%(dig%) ELSE dig$=dig1$(dig%)
19510IF dig2$(dig%)="" THEN d2$="0" ELSE d2$=dig2$(dig%)
19520valid%=(units%=VALdig1$(dig%) AND carry$(dig%)="1" OR units%<>VALdig1$(dig%) AND VALcarry$(dig%)=car_dig%(dig%) OR car_dig%(dig%)=-1 AND carry$(dig%)="")
19530IF valid%=0 THEN mess$="You need to subtract " ELSE mess$="Subtract "
19540mess$=mess$+d2$+" from "+dig$
19550=mess$+"."
19560
19570
19580DEF PROCmessage(source$)
19590LOCAL dig%,st%,c%,r%
19600IF rubdig%>-1 THEN dig%=rubdig%:st%=0:c%=0:r%=0 ELSE dig%=nextdig%:st%=strike%:c%=carry%:r%=reduce%
19610IF source$="sum" THEN dig%=ICdrag%-18
19620IF dig%>anslim% AND source$<>"sum" OR Helplev%=5 AND source$="?" OR correct%=-1 THEN ENDPROC
19630IF Helplev%=5 AND source$="pl" THEN source$="pr"
19640message$()=""
19650PROCwork_area_origin(handle%(game%),ox%,oy%)
19660
19670CASE source$ OF
19680 WHEN "?":IF Helplev%>0 THEN PROCmess_column(dig%,st%,c%,r%)
19690 IF Helplev%>1 THEN
19700 IF Helplev%=4 AND c%=0 THEN PROCmess_sum(message$(2),dig%) ELSE PROCmess_DecomCarry(message$(2),dig%,st%,c%,r%)
19710 ENDIF
19720 WHEN "pl":IF Helplev%>0 THEN PROCmess_column(dig%,st%,c%,r%)
19730 WHEN "ck":PROCwrong_number(dig%,st%,c%,r%)
19740 WHEN "pr":PROCmess_column(dig%,st%,c%,r%)
19750 IF c%=0 THEN PROCmess_sum(message$(2),dig%) ELSE PROCmess_DecomCarry(message$(2),dig%,st%,c%,r%)
19760 WHEN "sum":PROCwrong_calc_message(dig%)
19770ENDCASE
19780IF message$(1)="" THEN message$(1)=message$(2):message$(2)=""
19790
19800PROCfont_to_screen
19810PROCmessage_sprite_back
19820ENDPROC
19830
19840
19850DEF PROCwrong_calc_message(dig%)
19860LOCAL val%:val%=FNcheck_sum_type(dig%)
19870IF operator%(NameNo%)=2 THEN
19880 IF val%=1 THEN message$(1)="You're taking top from bottom." ELSE message$(1)="You are adding !"
19890 message$(2)="Take bottom from top."
19900ELSE
19910 IF val% THEN message$(1)="You are subtracting."
19920ENDIF
19930ENDPROC
19940
19950
19960DEF PROCwrong_number(dig%,st%,c%,r%)
19970IF Helplev%=5 THEN
19980 IF FNcheck_sum_type(dig%)=-1 AND st%=0 THEN PROCwrong_calc_message(dig%) ELSE message$(1)="No; that's not it."
19990 IF c%=0 THEN PROCmess_sum(message$(2),dig%) ELSE PROCmess_DecomCarry(message$(2),dig%,st%,c%,r%)
20000ENDIF
20010ENDPROC
20020
20030
20040DEF PROCmess_column(dig%,st%,c%,r%)
20050LOCAL var$
20060IF c%=0 OR Helplev%=1 THEN
20070 PROCcolumn_name
20080 IF dig%=0 THEN var$=" first." ELSE var$=" next."
20090 message$(1)="Do the "+dig_name$(dig%)+var$
20100ELSE
20110 IF source$="pl" THEN
20120 IF operator%(NameNo%)=1 THEN message$(1)="You need to carry." ELSE message$(1)="You need to decompose."
20130 ENDIF
20140ENDIF
20150ENDPROC
20160
20170
20180DEF PROCcolumn_name
20190IF decimal%(NameNo%) THEN
20200 dig_name$()="hundredths","tenths","units","tens","hundreds"
20210ELSE
20220 dig_name$()="units","tens","hundreds","thousands","ten thousands"
20230ENDIF
20240ENDPROC
20250
20260
20270DEF PROCmess_sum(RETURN mess$,dig%)
20280IF operator%(NameNo%)=1 THEN mess$=FNmessage_plus(dig%) ELSE mess$=FNmessage_minus(dig%)
20290ENDPROC
20300
20310
20320DEF PROCmess_DecomCarry(RETURN mess$,dig%,st%,c%,r%)
20330LOCAL units%,mess2$
20340IF c%=0 THEN ENDPROC
20350IF Helplev%=2 AND operator%(NameNo%)=2 THEN mess$="Do the decomposition.":ENDPROC
20360
20370IF operator%(NameNo%)=1 THEN
20380 mess$="You need to carry"
20390 IF Helplev%>2 THEN mess$=mess$+" "+STR$ car_dig%(dig%)+"." ELSE mess$=mess$+"."
20400ELSE
20410 IF st% THEN
20420 mess$="Strike through the "+dig1$(dig%+Bstep%)+"."
20430 ELSE
20440 mess$="You need to add "
20450 mess2$="Replace the "+dig1$(dig%+Bstep%)+" with "
20460 IF r% THEN
20470 units%=car_dig%(dig%+Bstep%) MOD 10
20480 IF carry$(dig%+Bstep%)="" THEN mess2$=mess2$+STR$units% ELSE mess$=mess$+"10."
20490 ELSE
20500 units%=car_dig%(dig%+Bstep%) MOD 10
20510 IF car_dig%(dig%+Bstep%)>9 THEN mess$=mess$+"10." ELSE mess2$=mess2$+STR$ units%
20520 ENDIF
20530 IF LEN mess2$=20 THEN mess$=mess2$+"."
20540 ENDIF
20550ENDIF
20560ENDPROC
20570
20580
20590DEF PROCremove_message
20600message$()=""
20610SYS"Wimp_ForceRedraw",handle%(game%),600,y3%-24,1280,y3%+145
20620ENDPROC
20630
20640
20650DEF PROCfont_to_screen
20660SYS"Wimp_SetFontColours",,0,11
20670SYS"Font_FindFont",,"Jarman",290,320 TO Fmess%
20680SYS"Font_SetFont",Fmess%
20690PROCwork_area_origin(handle%(game%),ox%,oy%)
20700
20710SYS"OS_SpriteOp",&13C,sarea%,"message",1 TO r0%,r1%,r2%,r3%
20720PROCmess_sprite_lines
20730SYS"OS_SpriteOp",r0%,r1%,r2%,r3%
20740
20750flg%=FNupdate_window(handle%(game%),600,y3%-24,1280,y3%+145)
20760WHILE flg%
20770 SYS"OS_SpriteOp",&134,sarea%,"message",ox%+600,oy%+y3%-25,0,-1,-1
20780 IF message$(2)="" THEN
20790 SYS"Font_Paint",,message$(1),16,ox%+600,oy%+y3%
20800 ELSE
20810 SYS"Font_Paint",,message$(1),16,ox%+600,oy%+y3%+75
20820 SYS"Font_Paint",,message$(2),16,ox%+600,oy%+y3%
20830 ENDIF
20840 SYS"Wimp_GetRectangle",,block% TO flg%
20850ENDWHILE
20860ENDPROC
20870
20880
20890DEF PROCmessage_sprite_back
20900LOCAL r0%,r1%,r2%,r3%
20910SYS"Font_SetFont",Fmess%
20920SYS"OS_SpriteOp",&13C,sarea%,"message",1 TO r0%,r1%,r2%,r3%
20930PROCmess_sprite_lines
20940
20950SYS"Wimp_SetFontColours",,0,11
20960IF message$(2)="" THEN
20970 SYS"Font_Paint",,message$(1),16,0,24
20980ELSE
20990 SYS"Font_Paint",,message$(1),16,0,103
21000 SYS"Font_Paint",,message$(2),16,0,24
21010ENDIF
21020SYS"OS_SpriteOp",r0%,r1%,r2%,r3%
21030SYS"Font_LoseFont",Fmess%
21040ENDPROC
21050
21060
21070DEF PROCmess_sprite_lines
21080SYS"Wimp_SetColour",0:RECTANGLE FILL 0,0,680,168
21090SYS"Wimp_SetColour",15
21100FOR x%=0 TO 675 STEP 75:MOVE x%,0:DRAW x%,168:NEXT
21110FOR y%=25 TO 175 STEP 75:MOVE 0,y%-1.5:DRAW 680,y%-1.5:NEXT
21120ENDPROC
21130
21140
21150DEF PROCmessage_mode_independance
21160LOCAL wOS%,hOS%,wP%,hP%,r0%,r1%,r2%,r3%:wOS%=680:hOS%=168
21170PROCos_to_pixels(wOS%,hOS%,wP%,hP%)
21180SYS"OS_SpriteOp",&10F,sarea%,"message",1,wP%,hP%,MODE
21190ENDPROC
21200
21210
21220DEF PROCsave_sum(source$)
21230LOCAL d%,resp%
21240Pcount% +=1:Psave%=-1:Pop%(Pcount%)=operator%(NameNo%):Pdec%(Pcount%)=decimal%(NameNo%)
21250PlimQ%(Pcount%)=FNquest_limit
21260PlimA%(Pcount%)=FNanswer_limit
21270
21280FOR d%=0 TO 4
21290 Pdig1$(Pcount%,d%)=dig1$(d%):Pdig2$(Pcount%,d%)=dig2$(d%)
21300NEXT
21310
21320IF Pcount%=9 THEN
21330 IF source$="S" THEN P2handle%=FNrelative_window(handle%(game%),P2handle%,900,406)
21340 IF source$="P" THEN PROCsum_printout
21350ENDIF
21360ENDPROC
21370
21380
21390DEF PROCprint_out_sums
21400LOCAL start%:start%=Pcount%
21410car_dig%()=0
21420IF Pcount%=9 THEN PROCsum_printout:ENDPROC
21430REPEAT
21440 IF BothOp%(NameNo%)=-1 THEN operator%(NameNo%)=2+(Pcount%-start%<=(8-start%)/2)
21450 IF operator%(NameNo%)=1 THEN PROCmake_add(Alevel%(NameNo%)) ELSE PROCmake_sub(Slevel%(NameNo%))
21460
21470 PROCdigits(num1%,dig1$())
21480 PROCdigits(num2%,dig2$())
21490 PROCsave_sum("P")
21500UNTIL Pcount%=9
21510ENDPROC
21520
21530
21540DEF PROCset_up_printout(RETURN ch%,height%)
21550LOCAL left%,top%
21560SYS"Hourglass_On"
21570ch%=OPENOUT("printer:")
21580SYS"PDriver_SelectJob",ch%,"print_job"
21590SYS"PDriver_PageSize" TO ,,,left%,,,top%
21600!Prect%=0:Prect%!4=height%:Prect%!8=1280:Prect%!12=0
21610!Ptrans%=1<<16:Ptrans%!4=0:Ptrans%!8=0:Ptrans%!12=1<<16
21620!Pplot%=left%+36000:Pplot%!4=top%+height%*400
21630SYS"PDriver_GiveRectangle",0,Prect%,Ptrans%,Pplot%,&FFFFFF00
21640ENDPROC
21650
21660
21670DEF PROCend_printout(ch%)
21680SYS"PDriver_EndJob",ch%
21690SYS"Hourglass_Off"
21700CLOSE#ch%
21710ENDPROC
21720
21730
21740DEF PROCsum_printout
21750LOCAL flg%,ch%
21760LOCAL ERROR
21770ON ERROR LOCAL:RESTORE ERROR:SYS"PDriver_AbortJob",ch%:CLOSE#ch%:SYS"Hourglass_Off":PROCerror("Maths_task"):ENDPROC
21780
21790PROCset_up_printout(ch%,FNheight(Pcount%))
21800
21810SYS"PDriver_DrawPage",1,block%,0,0 TO flg%
21820WHILE flg%
21830 PROCprintout_sum
21840 SYS"PDriver_GetRectangle",,block% TO flg%
21850ENDWHILE
21860PROCend_printout(ch%)
21870RESTORE ERROR
21880ENDPROC
21890
21900
21910DEF FNprintdigx(x%,d%)=x%+75*(4-d%)
21920
21930DEF FNsumY(pos%)
21940IF pos%>4 THEN pos% -=5
21950=y2%-300*pos%
21960
21970DEF FNsumX(pos%)=77-675*(pos%>4)
21980
21990DEF FNheight(no%)
22000IF no%>4 THEN no%=4
22010=-600-300*no%
22020
22030
22040DEF PROCprintout_sum
22050LOCAL x%,d%,symb%,symb$,colx%,limQ%,Y2%,Y%,Y0%,sum%
22060SYS"ColourTrans_SetGCOL",&33333300
22070REM Grid
22080FOR x%=0 TO 1200 STEP 75
22090 MOVE x%,150*(x%>0 AND x%<1200):DRAW x%,-1725
22100NEXT
22110FOR y%=0 TO -1725 STEP -75
22120 RECTANGLE FILL 0,y%-1,1200,1
22130NEXT
22140
22150SYS"ColourTrans_SetGCOL",0
22160SYS"ColourTrans_SetFontColours",,&FFFFFF00,0,6
22170SYS"Font_SetFont",Fhead%
22180
22190SYS"Font_Paint",," "+name$(NameNo%),16,0,-75
22200SYS"Font_Paint",," "+$loadbuff%,16,0,-150
22210SYS"Font_Paint",,FNdate,16,870,-75
22220
22230FOR sum%=0 TO Pcount%
22240 IF Pop%(sum%)=1 THEN symb$="+" ELSE symb$="-"
22250 Y1%=FNsumY(sum%):Y2%=Y1%-75:Y3%=Y1%-150:Y0%=Y1%+92
22260 X1%=FNsumX(sum%)
22270 anslim%=PlimA%(sum%):limQ%=PlimQ%(sum%):symb%=FNprintdigx(X1%,limQ%)
22280
22290 IF Pdig1$(sum%,limQ%)<>"" OR Pdig2$(sum%,limQ%)<>"" THEN symb% -=75
22300 IF Pdig1$(sum%,limQ%)="" AND Pdig2$(sum%,limQ%)="" THEN limQ% -=1
22310
22320 SYS"Font_SetFont",Fsum%
22330 SYS"Font_Paint",,symb$,16,symb%+18,Y2%+4:REM Plus/minus symbol
22340
22350 REM Equals lines
22360 IF Pop%(sum%)=1 THEN x%=FNprintdigx(X1%,anslim%) ELSE x%=FNprintdigx(X1%,limQ%)
22370 IF x%>450 THEN EQw%=1125-x% ELSE EQw%=450-x%
22380 RECTANGLE FILL x%,Y3%+63,EQw%,8
22390 RECTANGLE FILL x%,Y3%-12,EQw%,8
22400
22410 FOR d%=0 TO 4
22420 x%=FNprintdigx(X1%,d%)+18
22430 SYS"Font_Paint",,Pdig1$(sum%,d%),16,x%,Y1%
22440 SYS"Font_Paint",,Pdig2$(sum%,d%),16,x%,Y2%
22450 NEXT
22460
22470 IF Pdec%(sum%) THEN
22480 x%=FNprintdigx(X1%,1)-4
22490 SYS"Font_Paint",,".",16,x%,Y1%+28
22500 SYS"Font_Paint",,".",16,x%,Y2%+28
22510 ENDIF
22520
22530 IF (sum%=0 OR sum%=5 OR Pdec%(sum%)<>Pdec%(sum%+(sum%>0))) AND colname%(NameNo%)=1 THEN
22540 REM Column names
22550 IF Pdec%(sum%)=0 THEN colname$()="u","t","h","th","t th" ELSE colname$()="/100","/10","u","t","h"
22560 FOR d%=0 TO 4
22570 IF colname$(d%)="/100" OR colname$(d%)="/10" THEN SYS"Font_SetFont",Fcol2% ELSE SYS"Font_SetFont",Fcol1%
22580 colx%=FNprintdigx(X1%,d%)+(75-18*LEN colname$(d%))/2-2
22590 IF colname%(NameNo%)=1 THEN SYS"Font_Paint",,colname$(d%),16,colx%,Y0%
22600 NEXT
22610 ENDIF
22620
22630NEXT
22640ENDPROC
22650
22660
22670DEF PROCset_fonts
22680LOCAL resp%:LOCAL ERROR
22690ON ERROR LOCAL:RESTORE ERROR:resp%=FNerror_message("Fonts not seen, click on directory !Fonts","MathsBook",1):PROCend(0):END
22700SYS"Font_FindFont",,"Primary.Bold",330,300 TO Fhead%
22710SYS"Font_FindFont",,"Primary.Bold",450,450 TO Fsum%
22720SYS"Font_FindFont",,"Primary.Bold",258,245 TO Fcol1%
22730SYS"Font_FindFont",,"Primary.Bold",200,240 TO Fcol2%
22731RESTORE ERROR
22740ENDPROC
22750
22760
22770DEF PROClose_fonts
22780SYS"Font_LoseFont",Fhead%
22790SYS"Font_LoseFont",Fsum%
22800SYS"Font_LoseFont",Fcol1%
22810SYS"Font_LoseFont",Fcol2%
22820PROClose_icon_fonts(font%)
22830ENDPROC
22840
22850
22860DEF PROCsave_file(file$)
22870LOCAL ch%,resp%:LOCAL ERROR:notsavedO%=0
22880ON ERROR LOCAL:RESTORE ERROR:resp%=FNerror_message(REPORT$,"Maths_task",0):CLOSE#ch%:ENDPROC
22890$savebuff%=file$:PROCreset_icon(SVhandle%,1)
22900$loadbuff%=FNgetleaf(file$,0)
22910ch%=OPENOUT file$
22920PRINT#ch%,"groupAS",autosaveR%,enprint%,screen%
22930
22940FOR n%=0 TO Ncount%
22950 PRINT#ch%,name$(n%)
22960 BPUT#ch%,Alevel%(n%):BPUT#ch%,Slevel%(n%):BPUT#ch%,MHlevel%(n%):BPUT#ch%,decimal%(n%)
22970 BPUT#ch%,auto%(n%):BPUT#ch%,autohelp%(n%):BPUT#ch%,force%(n%):BPUT#ch%,mode%(n%):BPUT#ch%,tries%(n%)
22980
22990 IF BothOp%(n%) THEN operator%(n%)=3
23000 BPUT#ch%,operator%(n%):BPUT#ch%,no_quest%(n%):BPUT#ch%,Notimer%(n%):BPUT#ch%,timelim%(n%):BPUT#ch%,calc%(n%):BPUT#ch%,printer%(n%):BPUT#ch%,score%(n%):BPUT#ch%,next%(n%):BPUT#ch%,stop%(n%):BPUT#ch%,colname%(n%):BPUT#ch%,estimate%(n%):BPUT#ch%,saveR%(n%):BPUT#ch%,speech%(n%)
23010 BPUT#ch%,newlevR%(n%):BPUT#ch%,-newlevW%(n%):BPUT#ch%,ownsum%(n%)
23020 IF BothOp%(n%) THEN operator%(n%)=1
23030NEXT
23040CLOSE#ch%
23041RESTORE ERROR
23050ENDPROC
23060
23070
23080DEF PROCselect_savebox
23090CASE block%!16 OF
23100 WHEN 0:IF block%!8=64 THEN PROCdrag_icon(SVhandle%,0,5)
23110 WHEN 2:PROCsave_file($savebuff%):PROCclose_window(SVhandle%)
23120 PROCopen_window(Smhandle%)
23130ENDCASE
23140ENDPROC
23150
23160
23170DEF PROCselect_save_text
23180CASE block%!16 OF
23190 WHEN 0:IF block%!8=64 THEN PROCdrag_icon(SVhandle2%,0,5)
23200 WHEN 2:PROCresults_text_file($savetextbuff%):PROCclose_window(SVhandle2%)
23210 PROCopen_window(Smhandle%)
23220ENDCASE
23230ENDPROC
23240
23250
23260DEF PROCset_option_variables
23270LOCAL n%,error%
23280screen%=0:start%=-1
23290NameNo%=0:Ncount%=0:caretx%=0:create%=-2:name$()=""
23300notsavedO%=0:screen%=0:autosaveR%=0
23310$savebuff%="default"
23320PROCload_part("<Obey$Dir>.default",error%)
23330PROCsingle_tick(menu%,7,0):PROCset_windows
23340PROCset_config_title(0)
23350PROCset_preferences(0)
23360PROCclear_windows
23370ENDPROC
23380
23390
23400DEF PROCload_part(file$,RETURN error%)
23410LOCAL ch%:LOCAL ERROR:error%=0
23420ON ERROR:RESTORE ERROR:CLOSE#ch%:$Ricbuff%="Wrong file.":PROCopen_window(Rhandle%):error%=-1:ENDPROC
23430ch%=OPENIN file$
23440INPUT#ch%,header$,autosaveR%,enprint%,screen%
23450IF header$<>"groupAS" THEN CLOSE#ch%:$Ricbuff%="Wrong file.":PROCopen_window(Rhandle%):error%=-1:ENDPROC
23460
23470Ncount%=-1
23480REPEAT
23490 Ncount% +=1
23500 INPUT#ch%,name$(Ncount%)
23510 Alevel%(Ncount%)=BGET#ch%:Slevel%(Ncount%)=BGET#ch%:MHlevel%(Ncount%)=BGET#ch%:Hlevel%(Ncount%)=MHlevel%(Ncount%):decimal%(Ncount%)=BGET#ch%
23520 auto%(Ncount%)=BGET#ch%:autohelp%(Ncount%)=BGET#ch%:force%(Ncount%)=BGET#ch%:mode%(Ncount%)=BGET#ch%:tries%(Ncount%)=BGET#ch%
23530
23540operator%(Ncount%)=BGET#ch%:no_quest%(Ncount%)=BGET#ch%:Notimer%(Ncount%)=BGET#ch%:timelim%(Ncount%)=BGET#ch%:calc%(Ncount%)=BGET#ch%:printer%(Ncount%)=BGET#ch%:score%(Ncount%)=BGET#ch%:next%(Ncount%)=BGET#ch%:stop%(Ncount%)=BGET#ch%:colname%(Ncount%)=BGET#ch%
23550estimate%(Ncount%)=BGET#ch%:saveR%(Ncount%)=BGET#ch%:speech%(Ncount%)=BGET#ch%
23560newlevR%(Ncount%)=BGET#ch%:newlevW%(Ncount%)=-BGET#ch%:ownsum%(Ncount%)=BGET#ch%
23570IF operator%(Ncount%)=3 THEN operator%(Ncount%)=1:BothOp%(Ncount%)=-1
23580UNTIL EOF#ch%=-1
23590CLOSE#ch%
23591RESTORE ERROR
23600ENDPROC
23610
23620
23630DEF PROCload_file(file$)
23640LOCAL ch%,header$,i$,error%,default%:NameNo%=0:notsavedO%=0
23650default%=(FNgetleaf(file$,0)="default" AND $loadbuff%<>"")
23660start%=(default%=0)
23670name$()="":nextfile$=""
23680PROCreset_icon(SVhandle%,1)
23690
23700PROCload_part(file$,error%)
23710IF error% THEN PROCshade_item(rmenu%,3,-1):PROCshade_item(menu%,4,-1):ENDPROC
23720
23730create%=(default%=-1)
23740PROCsingle_tick(rmenu%,4,autosaveR%)
23750PROCsingle_tick(menu%,6,enprint%)
23760PROCsingle_tick(menu%,7,screen%)
23770PROCshade_item(menu%,2,0):PROCshade_item(menu%,4,0)
23780PROCshade_item(menu%,1,-(default%=0))
23790PROCreset_results
23800PROCset_windows
23810PROCclear_windows
23820
23830$icbuff%=FNgetleaf(file$,0)+" is loaded"
23840IF default%=0 THEN PROCopen_window(Ichandle%)
23850ENDPROC
23860
23870
23880DEF PROCreset_results
23890Rcnt%=2:Rcnt2%=2:Rptr%=0:notsavedR%=0:newR%=1
23900FOR n%=0 TO 999 STEP 4:results%!n%=0:NEXT
23910file$=FNgetleaf($savebuff%,0)
23920date$=FNdate
23930st$=" Group file name: "+file$+" Date: "+date$
23940Rptr%=FNadd_string(Rptr%,st$,0)
23950
23960FOR n%=0 TO 3:PROCshade_item(rmenu%,n%,1):NEXT
23970PROCsingle_tick(rmenu%,4,autosaveR%)
23980ENDPROC
23990
24000DEF FNdate=MID$(TIME$,5,11)
24010
24020DEF FNadd_string(ptr%,st$,down%)
24030LOCAL len%
24040IF down% THEN ?(results%+ptr%)=10
24050IF down%=2 THEN ?(results%+ptr%+1)=10
24060$(results%+ptr%+down%)=st$:len%=LEN st$
24070ptr% +=len%+down%:?(results%+ptr%)=32
24080=ptr%
24090
24100
24110DEF PROCclear_windows
24120IF game%>0 THEN PROCclose_window(handle%(game%))
24130game%=0
24140PROCclose_window(NGhandle%)
24150PROCclose_window(SChandle%)
24160PROCclose_window(Rhandle%)
24170ENDPROC
24180
24190
24200DEF PROCset_preferences(no%)
24210LOCAL n%
24220PROCset_diff_levels(no%)
24230PROCshade_op_levels(no%)
24240$Hbuff%=STR$Hlevel%(no%):PROCreset_icon(Chandle%,31)
24250$MHbuff%=STR$MHlevel%(no%):PROCreset_icon(Chandle%,37)
24260IF force5%=0 THEN Helplev%=Hlevel%(no%)
24270PROCselect_icon(Chandle%,50,autohelp%(no%))
24280PROCset_autohelp(no%)
24290PROCselect_icon(Chandle%,29,(mode%(no%)=1))
24300PROCselect_icon(Chandle%,28,(mode%(no%)=0))
24310PROCadjust_for_mode(no%)
24320PROCselect_icon(Chandle%,34,force%(no%))
24330PROCselect_icon(Chandle%,49,auto%(no%))
24340PROCset_auto(no%)
24350
24360PROCselect_icon(Chandle%,2,(operator%(no%)=1 OR BothOp%(no%)=-1))
24370PROCselect_icon(Chandle%,3,(operator%(no%)=2 OR BothOp%(no%)=-1))
24380PROCset_carry_variableY
24390
24400$Qbuff%=STR$ no_quest%(no%):PROCreset_icon(Chandle%,16)
24410$Tbuff%=STR$ tries%(no%):PROCreset_icon(Chandle%,19)
24420
24430$Tmbuff%=STR$ timelim%(no%):PROCreset_icon(Chandle%,22)
24440PROCselect_icon(Chandle%,25,Notimer%(no%))
24450PROCshade_3icons(Chandle%,22,Notimer%(no%))
24460
24470PROCselect_icon(Chandle%,42,calc%(no%)):PROCset_delete_icon(no%)
24480PROCselect_icon(Chandle%,43,printer%(no%)):PROCset_top_icon(7,(printer%(no%)=1 AND driver%=-1 AND enprint%=-1))
24490PROCselect_icon(Chandle%,44,score%(no%)):PROCset_top_icon(4,-score%(no%))
24500PROCselect_icon(Chandle%,46,next%(no%))
24510PROCselect_icon(Chandle%,47,stop%(no%)):PROCset_top_icon(6,-stop%(no%))
24520PROCselect_icon(Chandle%,48,colname%(no%))
24530PROCselect_icon(Chandle%,45,estimate%(no%))
24540PROCselect_icon(Chandle%,61,saveR%(no%))
24550PROCselect_icon(Chandle%,62,decimal%(no%))
24560IF decimal%(no%) THEN PROCset_dec_levels(no%)
24570
24580$levRbuff%=STR$ newlevR%(no%):PROCreset_icon(Chandle%,53)
24590$levWbuff%=STR$ -newlevW%(no%):PROCreset_icon(Chandle%,59)
24600
24610PROCset_own_sum(no%)
24620PROCselect_icon(Chandle%,67,speech%(no%))
24630PROCshade_icon(Chandle%,64,(game%>0))
24640ENDPROC
24650
24660
24670DEF PROCset_own_sum(no%)
24680PROCselect_icon(Chandle%,63,ownsum%(no%))
24690PROCshade_3icons(Chandle%,5,(ownsum%(no%)=1 OR operator%(no%)=2 AND BothOp%(no%)=0))
24700PROCshade_3icons(Chandle%,8,(ownsum%(no%)=1 OR operator%(no%)=1 AND BothOp%(no%)=0))
24710PROCshade_3icons(Chandle%,53,(ownsum%(no%)=1 OR auto%(no%)=0))
24720PROCshade_3icons(Chandle%,57,(ownsum%(no%)=1 OR auto%(no%)=0))
24730PROCshade_icon(Chandle%,49,ownsum%(no%))
24740
24750IF ownsum%(no%)=0 AND game%=0 THEN start%=-1
24760IF ownsum%(no%)=0 AND game%>0 THEN IF FNwindow_open(handle%(game%))=0 THEN PROCopen_window(handle%(game%))
24770ENDPROC
24780
24790
24800DEF PROCallow_print_results
24810IF driver%=0 THEN IF FNensure_Pdriver THEN driver%=-1
24820FOR n%=1 TO 2:PROCshade_item(rmenu%,n%,NOT(driver%=-1 AND Rcnt%>=4)):NEXT
24830ENDPROC
24840
24850
24860DEF PROCset_diff_levels(no%)
24870$level_buffA%=STR$ Alevel%(no%):PROCreset_icon(Chandle%,5)
24880$level_buffS%=STR$ Slevel%(no%):PROCreset_icon(Chandle%,8)
24890ENDPROC
24900
24910
24920DEF PROCshade_op_levels(no%)
24930PROCshade_3icons(Chandle%,5,(operator%(no%)=2 AND BothOp%(no%)=0))
24940PROCshade_3icons(Chandle%,8,(operator%(no%)=1 AND BothOp%(no%)=0))
24950ENDPROC
24960
24970
24980DEF PROCset_dec_levels(no%)
24990IF Alevel%(no%)<6 THEN Alevel%(no%)=6
25000IF Slevel%(no%)<6 THEN Slevel%(no%)=6
25010PROCset_diff_levels(no%)
25020ENDPROC
25030
25040
25050DEF PROCset_top_icon(icon%,var%)
25060LOCAL n%
25070FOR n%=1 TO 2
25080 PROCshade_icon(handle%(n%),icon%,NOTvar%)
25090NEXT
25100ENDPROC
25110
25120
25130DEF PROCselect_score
25140LOCAL icon%,r%:icon%=block%!16
25150IF icon%=9 OR icon%=10 OR icon%=12 THEN PROCclose_window(SChandle%)
25160IF icon%=10 THEN PROCbuild_name_windowG
25170IF icon%=11 THEN PROCprint_out_sums
25180ENDPROC
25190
25200
25210DEF PROCcalcalator(icon%)
25220LOCAL flg%
25230IF CCprev%=-1 AND icon%>10 AND icon%<16 THEN CCop%=icon%:flg%=(icon%>11)
25240IF flg% THEN ENDPROC
25250IF icon%<=10 THEN
25260 IF CCop%=0 THEN CCsum=0:CCstart%=0
25270 IF icon%<10 AND LEN CCnum$<8 THEN CCnum$=CCnum$+STR$icon%
25280 IF icon%=10 THEN CCnum$=CCnum$+"."
25290 CCnum=VAL CCnum$:CCprev%=0
25300 PROCcalc_display(CCnum$,"1")
25310ELSE
25320 CCnum$="":CCprev%=(icon%<>11)
25330 IF icon%=16 THEN CCop%=16
25340 IF CCstart%=0 THEN
25350 IF CCop%=16 THEN
25360 CCsum=0:CCop%=0:PROCcalc_display(STR$ CCsum,"2")
25370 ELSE
25380 CCop%=icon%:CCstart%=-1:CCsum=CCnum
25390 ENDIF
25400 ELSE
25410 CASE CCop% OF
25420 WHEN 12:CCsum +=CCnum
25430 WHEN 13:CCsum -=CCnum
25440 WHEN 14:CCsum=CCsum*CCnum
25450 WHEN 15:IF CCnum<>0 THEN CCsum=CCsum/CCnum ELSE CCsum=1E9
25460 WHEN 16:CCsum=0
25470 ENDCASE
25471 IF CCop%=12 OR CCop%=13 THEN CCsum +=2E-8*SGN CCsum
25480 PROCcalc_display(STR$ CCsum,"2")
25490 IF icon%>11 AND icon%<16 THEN CCop%=icon% ELSE CCop%=0
25500 ENDIF
25510ENDIF
25520ENDPROC
25530
25540
25550DEF PROCcalc_display(var$,source$)
25560IF ABS VALvar$<1E9 THEN
25570 IF ABS VALvar$<1E-8 AND ABS VALvar$>0 THEN var$="0"
25580 IF INSTR(var$,"E") THEN var$=FNremove_exp(var$)
25590 var$=LEFT$(var$,8)
25600 IF RIGHT$(var$,1)="0" AND INSTR(var$,".")>0 AND source$="2" THEN var$=FNremove_zeros(var$)
25610 $CCbuff%=var$
25620ELSE
25630 IF VAL var$>0 THEN $CCbuff%="Too big" ELSE $CCbuff%="Too small"
25640 CCsum=0:icon%=16
25650ENDIF
25660PROCreset_icon(CChandle%,17)
25670ENDPROC
25680
25690
25700DEF FNremove_exp(var$)
25710LOCAL p%,sgn%
25720p%=VAL RIGHT$(var$,1):sgn%=SGN VALvar$
25730var$=LEFT$(var$,LENvar$-3)
25740IF sgn%<0 THEN var$=RIGHT$(var$,LENvar$-1)
25750IF MID$(var$,2,1)="." THEN var$=LEFT$(var$,1)+RIGHT$(var$,LENvar$-2)
25760var$="."+STRING$(p%-1,"0")+var$
25770IF sgn%<0 THEN var$="-"+var$
25780=var$
25790
25800DEF FNremove_zeros(var$)
25810WHILE RIGHT$(var$,1)="0"
25820 var$=LEFT$(var$,LENvar$-1)
25830ENDWHILE
25840=var$
25850
25860
25870DEF PROCkeys_calc
25880LOCAL icon%:icon%=-1
25890char%=block%!24
25900IF char%>=48 AND char%<=57 THEN icon%=char%-48
25910IF !block%=CChandle% THEN
25920 CASE char% OF
25930 WHEN 43:icon%=12
25940 WHEN 45:icon%=13
25950 WHEN 42:icon%=14
25960 WHEN 47:icon%=15
25970 WHEN 35,67,99,127,&1B:icon%=16
25980 WHEN 46:icon%=10
25990 WHEN 13,61:icon%=11
26000 ENDCASE
26010ENDIF
26020IF icon%>-1 THEN PROCcalcalator(icon%) ELSE SYS"Wimp_ProcessKey",char%
26030ENDPROC
26040
26050
26060DEF PROCbuild_name_windowG
26070LOCAL icon%,y%
26080PROCdelete_icon(NGhandle%,49,(create%<0)):REM message
26090PROCdelete_icon(NGhandle%,50,(create%=0)):REM message
26100PROCdelete_icon(NGhandle%,51,(create%=0))
26110PROCdelete_icon(NGhandle%,52,(create%=0))
26120PROCdelete_icon(NGhandle%,46,(create%=0))
26130PROCdelete_icon(NGhandle%,47,(create%=0))
26140PROCdelete_icon(NGhandle%,54,(create%<0))
26150PROCshade_item(menu%,1,1)
26160IF Ncount% THEN PROCclear_spaces
26170NameNo%=-(Ncount%=0)
26180PROCset_new_name_levels(Ncount%+1,0)
26190FOR icon%=1 TO 42
26200 PROCselect_icon(NGhandle%,icon%,0)
26210 PROCdelete_icon(NGhandle%,icon%,(icon%>Ncount%-(Ncount%<42)))
26220NEXT
26230IF Ncount%<42 THEN IF Ncount%=0 THEN PROCselect_icon(NGhandle%,Ncount%+1,1)
26240IF create% THEN $Ntitlebuff%=$loadbuff%+" editing screen" ELSE $Ntitlebuff%=$loadbuff%+" name input"
26250NGhandle%=FNcentre_window(NGhandle%,"")
26260PROCclose_window(Chandle%)
26270PROCloadbox_windows(0)
26280IF Ncount%=0 THEN PROCplace_name_caret(Ncount%+1,0)
26290ENDPROC
26300
26310
26320DEF PROCclear_spaces
26330LOCAL newpos%,oldpos%
26340newpos%=0:oldpos%=0
26350REPEAT
26360 newpos% +=1:oldpos% +=1
26370 WHILE name$(oldpos%)="" AND oldpos%<Ncount%
26380 oldpos% +=1
26390 ENDWHILE
26400 IF name$(oldpos%)<>"" THEN
26410 name$(newpos%)=name$(oldpos%)
26420 Alevel%(newpos%)=Alevel%(oldpos%):Slevel%(newpos%)=Slevel%(oldpos%)
26430 MHlevel%(newpos%)=MHlevel%(oldpos%):Hlevel%(newpos%)=Hlevel%(oldpos%)
26440 tries%(newpos%)=tries%(oldpos%):mode%(newpos%)=mode%(oldpos%)
26450 force%(newpos%)=force%(oldpos%):auto%(newpos%)=auto%(oldpos%)
26460 autohelp%(newpos%)=autohelp%(oldpos%):operator%(newpos%)=operator%(oldpos%)
26470 no_quest%(newpos%)=no_quest%(oldpos%):timelim%(newpos%)=timelim%(oldpos%)
26480 Notimer%(newpos%)=Notimer%(oldpos%):calc%(newpos%)=calc%(oldpos%)
26490 score%(newpos%)=score%(oldpos%):next%(newpos%)=next%(oldpos%)
26500 stop%(newpos%)=stop%(oldpos%):colname%(newpos%)=colname%(oldpos%)
26510 estimate%(newpos%)=estimate%(oldpos%):BothOp%(newpos%)=BothOp%(oldpos%)
26520 newlevR%(newpos%)=newlevR%(oldpos%):newlevW%(newpos%)=newlevW%(oldpos%)
26530 saveR%(newpos%)=saveR%(oldpos%):decimal%(newpos%)=decimal%(oldpos%)
26540 ownsum%(newpos%)=ownsum%(oldpos%):speech%(newpos%)=speech%(oldpos%)
26550 ELSE
26560 newpos% -=1
26570 ENDIF
26580UNTIL oldpos%=Ncount%
26590Ncount%=newpos%:name$(Ncount%+1)=""
26600ENDPROC
26610
26620
26630DEF PROCplace_name_caret(pos%,redraw%)
26640caretx%=FNcaretx(pos%):y%=FNnameposy(pos%)-28
26650SYS"Wimp_SetCaretPosition",NGhandle%,-1,caretx%,y%,32
26660IF redraw% THEN PROCredraw_name(pos%)
26670ENDPROC
26680
26690
26700DEF PROCplace_char_caret(pos%)
26710x%=FNnameposx(pos%)-6:y%=FNnameposy(pos%)-28
26720caretx%=FNcaretx(pos%)
26730SYS"Wimp_SetCaretPosition",NGhandle%,-1,caretx%,y%,32
26740SYS"Wimp_ForceRedraw",NGhandle%,x%,y%,x%+298,y%+32
26750ENDPROC
26760
26770
26780DEF PROCredraw_name(pos%)
26790x%=FNnameposx(pos%)-6:y%=FNnameposy(pos%)-32
26800SYS"Wimp_ForceRedraw",NGhandle%,x%,y%,x%+306,y%+44
26810ENDPROC
26820
26830
26840DEF PROCname_input_area(pos%)
26850x%=FNnameposx(pos%)-6:y%=FNnameposy(pos%)-32
26860SYS"Wimp_SetColour",0:RECTANGLE FILL ox%+x%,oy%+y%,304,40
26870SYS"Wimp_SetColour",7:RECTANGLE ox%+x%,oy%+y%,304,40
26880ENDPROC
26890
26900
26910DEF FNnameposx(n%)=110-384*(n%>14)-384*(n%>28)
26920DEF FNcaretx(n%)=FNnameposx(n%)+16*LENname$(n%)
26930DEF FNnameposy(n%)=-196-48*n%-672*(n%>14)-672*(n%>28)
26940
26950
26960DEF PROCredraw_class_list
26970LOCAL x%,y%,n%
26980IF (create%<0 OR NameNo%=Ncount%+1) AND FNicon_selected(NGhandle%,NameNo%)=-1 THEN PROCname_input_area(NameNo%)
26990
27000FOR n%=1 TO Ncount%+1
27010 IF n%<=42 THEN
27020 x%=FNnameposx(n%):y%=FNnameposy(n%)
27030 MOVE ox%+x%,oy%+y%:PRINTname$(n%)
27040 ENDIF
27050NEXT
27060
27070IF Ncount%<42 THEN
27080 IF name$(Ncount%+1)="" AND FNicon_selected(NGhandle%,Ncount%+1)=0 THEN
27090 x%=FNnameposx(Ncount%+1):y%=FNnameposy(Ncount%+1)
27100 SYS"Wimp_SetColour",11
27110 MOVE ox%+x%,oy%+y%:PRINT "I'm new"
27120 ENDIF
27130ENDIF
27140ENDPROC
27150
27160
27170DEF PROCkeys_name(pos%)
27180LOCAL ch%,valid%,len%,x%,y%,flg%:ch%=block%!24
27190valid%=((ch%>=65 AND ch%<=90 OR ch%>=97 AND ch%<=122 OR ch%=32) AND LENname$(pos%)<18 OR (ch%=127 OR ch%=13 OR ch%=8 OR ch%=&18C) AND name$(pos%)<>"" AND NameNo%>0)
27200IF ch%=13 THEN flg%=FNcheck_name
27210IF flg%=-1 THEN ENDPROC
27220IF valid%=0 THEN SYS"Wimp_ProcessKey",ch%:ENDPROC
27230
27240IF ch%=13 AND Ncount%<42 THEN
27250 IF create% THEN
27260 IF pos%<Ncount%+1 THEN
27270 PROCselect_icon(NGhandle%,pos%,0)
27280 PROCselect_icon(NGhandle%,pos%+1,1)
27290 block%!16=pos%+1:PROCedit_nameG
27300 ELSE
27310 IF pos%=Ncount%+1 AND name$(Ncount%+1)<>"" THEN
27320 REM PROCnew_name(-1)
27330 PROCredraw_name(Ncount%)
27340 ENDIF
27350 ENDIF
27360 ELSE
27370 block%!16=50:PROCselect_nameG
27380 ENDIF
27390ENDIF
27400IF ch%=13 THEN ENDPROC
27410
27420IF pos%=Ncount%+1 THEN $DemIc%="can track up to 42 children.":Demhandle%=FNcentre_window(Demhandle%,"Y"):ENDPROC
27430
27440IF (ch%<>127 AND ch%<>8 AND ch%<>&18C) THEN
27450 name$(pos%)=name$(pos%)+CHR$ch%
27460ELSE
27470 len%=LEN name$(pos%)-1
27480 name$(pos%)=LEFT$(name$(pos%),len%)
27490ENDIF
27500
27510PROCplace_char_caret(pos%)
27520ENDPROC
27530
27540
27550DEF PROCset_new_name_levels(no%,no2%)
27560Alevel%(no%)=Alevel%(no2%):Slevel%(no%)=Slevel%(no2%)
27570MHlevel%(no%)=MHlevel%(no2%):Hlevel%(no%)=Hlevel%(no2%)
27580tries%(no%)=tries%(no2%)
27590mode%(no%)=mode%(no2%):force%(no%)=force%(no2%):auto%(no%)=auto%(no2%):autohelp%(no%)=autohelp%(no2%)
27600operator%(no%)=operator%(no2%):no_quest%(no%)=no_quest%(no2%):timelim%(no%)=timelim%(no2%):Notimer%(no%)=Notimer%(no2%):calc%(no%)=calc%(no2%):score%(no%)=score%(no2%)
27610next%(no%)=next%(no2%):stop%(no%)=stop%(no2%):colname%(no%)=colname%(no2%):printer%(no%)=printer%(no2%)
27620estimate%(no%)=estimate%(no2%):newlevR%(no%)=newlevR%(no2%):newlevW%(no%)=newlevW%(no2%):BothOp%(no%)=BothOp%(no2%):saveR%(no%)=saveR%(no2%):decimal%(no%)=decimal%(no2%):ownsum%(no%)=ownsum%(no2%):speech%(no%)=speech%(no2%)
27630PROCset_preferences(no%)
27640ENDPROC
27650
27660
27670DEF PROCstore_name_levels
27680Alevel%(43)=Alevel%(0):Slevel%(43)=Slevel%(0)
27690MHlevel%(43)=MHlevel%(0):Hlevel%(43)=Hlevel%(0)
27700tries%(43)=tries%(0)
27710mode%(43)=mode%(0):force%(43)=force%(0):auto%(43)=auto%(0):autohelp%(43)=autohelp%(0)
27720operator%(43)=operator%(0):no_quest%(43)=no_quest%(0):timelim%(43)=timelim%(0):Notimer%(43)=Notimer%(0):calc%(43)=calc%(0):score%(43)=score%(0)
27730next%(43)=next%(0):stop%(43)=stop%(0):colname%(43)=colname%(0):printer%(43)=printer%(0)
27740estimate%(43)=estimate%(0):newlevR%(43)=newlevR%(0):newlevW%(43)=newlevW%(0):BothOp%(43)=BothOp%(0):saveR%(43)=saveR%(0):decimal%(43)=decimal%(0):ownsum%(43)=ownsum%(0):speech%(43)=speech%(0)
27750ENDPROC
27760
27770
27780DEF PROCdefault_options
27790PROCselect_icon(NGhandle%,NameNo%,0)
27800SYS"Wimp_SetCaretPosition",NGhandle%
27810IF NameNo% THEN SYS"Wimp_ForceRedraw",NGhandle%,0,-976,1180,-170
27820NameNo%=0
27830PROCset_config_title(0)
27840PROCset_preferences(0)
27850PROCopen_window(Chandle%)
27860ENDPROC
27870
27880
27890DEF PROCnew_name(redraw%)
27900IF Ncount%<41 THEN PROCselect_icon(NGhandle%,NameNo%,0)
27910Ncount% -=(Ncount%<42):NameNo%=Ncount%-(Ncount%<42)
27920IF Ncount%=42 THEN ENDPROC
27930PROCdelete_icon(NGhandle%,Ncount%+1,0)
27940PROCselect_icon(NGhandle%,Ncount%+1,1)
27950PROCset_new_name_levels(Ncount%+1,0)
27960IF redraw% THEN PROCplace_name_caret(Ncount%+1,redraw%)
27970PROCset_config_title(Ncount%+1)
27980ENDPROC
27990
28000
28010DEF PROCset_config_title(no%)
28020IF no%=0 THEN
28030 $titlebuffC%="Group '"+FNgetleaf($savebuff%,0)+"' defaults"
28040ELSE
28050 $titlebuffC%="Options "+name$(no%)
28060ENDIF
28070PROCdelete_icon(Chandle%,64,(no%>0))
28080PROCdelete_icon(Chandle%,66,(no%>0))
28090PROCdelete_icon(Chandle%,68,(no%>0))
28100PROCdelete_icon(Chandle%,65,(no%=0))
28110PROCdelete_icon(Chandle%,51,(no%=0))
28120PROCshade_icon(Chandle%,65,(game%>0))
28130IF no%=0 THEN PROCstore_name_levels:alter%=0
28140IF FNwindow_open(Chandle%) THEN
28150 PROCclose_window(Chandle%)
28160 PROCopen_window(Chandle%)
28170ENDIF
28180ENDPROC
28190
28200
28210DEF PROCedit_nameG
28220LOCAL invalid%,icon%,flg%
28230icon%=block%!16:notsavedO%=-1
28240IF icon%>=1 AND icon%<=42 OR icon%>=50 THEN flg%=FNcheck_name
28250IF flg%=-1 AND icon%>=50 THEN ENDPROC
28260IF icon%=Ncount%+1 THEN $DemIc%="can track up to 42 children.":Demhandle%=FNcentre_window(Demhandle%,"Y")
28270
28280IF icon%>=1 AND icon%<=42 THEN
28290 IF NameNo%=Ncount%+1 AND name$(NameNo%)<>"" AND Ncount%<41 THEN
28300 REM Ncount% +=1
28310 REM PROCdelete_icon(NGhandle%,Ncount%+1,0)
28320 REM PROCset_new_name_levels(Ncount%+1,0)
28330 REM PROCredraw_name(Ncount%+1)
28340 ENDIF
28350
28360 IF NameNo% THEN PROCredraw_name(NameNo%)
28370 NameNo%=icon%:PROCplace_name_caret(NameNo%,-1)
28380 PROCset_config_title(NameNo%)
28390 IF NameNo%=Ncount%+1 THEN PROCset_new_name_levels(NameNo%,0) ELSE PROCset_preferences(NameNo%)
28400ENDIF
28410
28420CASE icon% OF
28430 WHEN -1:IF NameNo% THEN PROCplace_name_caret(NameNo%,-1)
28440 WHEN 50:IF Ncount%<42 THEN IF name$(Ncount%+1)<>"" THEN PROCnew_name(-1)
28450 REM PROCsave_file($savebuff%)
28460 PROCclose_window(NGhandle%):PROCclose_window(Chandle%)
28470 create%=0:NameNo%=0:PROCclose_window(Edhandle%)
28480 WHEN 51:PROCdefault_options
28490 WHEN 52:IF NameNo% THEN
28500 PROCset_config_title(NameNo%):PROCset_preferences(NameNo%)
28510 PROCopen_window(Chandle%)
28520 ENDIF
28530ENDCASE
28540PROCshade_item(menu%,1,-(NameNo%=0))
28550ENDPROC
28560
28570
28580DEF FNcheck_name
28590LOCAL n%,flg%:n%=0:flg%=0
28600REPEAT
28610 n% +=1
28620 IF name$(n%)=name$(NameNo%) AND n%<>NameNo% AND name$(NameNo%)<>"" THEN flg%=-1
28630UNTIL flg%=-1 OR n%=Ncount%+1
28640IF flg% THEN
28650 name$(NameNo%)="":Edhandle%=FNcentre_window(Edhandle%,"Y")
28660 PROCplace_name_caret(NameNo%,-1)
28670ELSE
28680 PROCclose_window(Edhandle%)
28690ENDIF
28700=flg%
28710
28720
28730DEF PROCresults_next_name
28740LOCAL n%,lev$,Alev$,Slev$,help$,st$:Rcnt% +=2:Rcnt2% +=2
28750
28760IF mode%(NameNo%) THEN lev$=STR$Helplev% ELSE lev$="None"
28770IF ownsum%(NameNo%)=0 THEN Alev$=STR$ Alevel%(NameNo%):Slev$=STR$ Slevel%(NameNo%) ELSE Alev$=" -":Slev$=" -"
28780IF autohelp%(NameNo%) THEN help$=" Min help:" ELSE help$=" Help level:"
28790
28800st$=" Name: "+name$(NameNo%)+" Start levels: add:"+Alev$+" sub:"+Slev$+help$+lev$
28810Rptr%=FNadd_string(Rptr%,st$,2)
28820PROCshade_item(rmenu%,0,0)
28830PROCshade_item(rmenu%,3,0)
28840ENDPROC
28850
28860
28870DEF PROCselect_nameG
28880LOCAL invalid%,icon%,flg%,flg2%:icon%=block%!16
28890flg2%=FNcheck_name
28900IF flg2%=-1 AND icon%=54 THEN ENDPROC
28910IF icon%>=1 AND icon%<=42 THEN
28920 IF NameNo%=Ncount%+1 THEN PROCredraw_name(NameNo%)
28930 IF icon%=Ncount%+1 THEN $DemIc%="can track up to 42 children.":Demhandle%=FNcentre_window(Demhandle%,"Y")
28940 NameNo%=icon%:flg%=-1
28950 PROCset_config_title(NameNo%)
28960 PROCset_preferences(NameNo%)
28970 IF icon%=Ncount%+1 THEN
28980 PROCplace_name_caret(NameNo%,-1)
28990 ELSE
29000 SYS"Wimp_SetCaretPosition",NGhandle%
29010 ENDIF
29020 IF Rptr%+90+42*no_quest%(NameNo%)>44000 AND saveR%(NameNo%)=1 THEN resp%=FNerror_message("The results file is now full, please tell your teacher","MathsBook",17)
29030 PROCshade_item(menu%,1,-(NameNo%=0))
29040ENDIF
29050IF flg% THEN ENDPROC
29060
29070IF Ncount%<42 THEN IF icon%=-1 AND FNicon_selected(NGhandle%,Ncount%+1)=-1 THEN PROCplace_name_caret(NameNo%,-1):ENDPROC
29080IF Ncount%<42 THEN IF icon%=54 AND (NameNo%=Ncount%+1 OR NameNo%=0) AND name$(Ncount%+1)="" THEN ENDPROC
29090IF icon%=54 THEN
29100 PROCclose_window(NGhandle%)
29110 REM IF NameNo%=Ncount%+1 AND name$(NameNo%)<>"" THEN PROCnew_name(0):NameNo%=Ncount%:notsavedO%=-1
29120 $titlebuff1%="Addition "+name$(NameNo%)
29130 $titlebuff2%="Subtraction "+name$(NameNo%)
29140 $titlebuffC%="Options "+name$(NameNo%)
29150 start%=0
29160 IF ownsum%(NameNo%)=0 THEN game%=operator%(NameNo%)
29170 IF saveR%(NameNo%) THEN
29180 IF Rptr%+90+42*no_quest%(NameNo%)>44000 THEN PROCreset_results
29190 ENDIF
29200 PROCclose_window(Edhandle%)
29210 IF ownsum%(NameNo%)=0 THEN PROCopen_window(handle%(game%))
29220 PROCreset_game:newR%=saveR%(NameNo%)
29230ENDIF
29240ENDPROC
29250
29260
29270DEF PROCprintout_results(all%)
29280LOCAL flg%,height%,ch%
29290IF all% THEN height%=Rcnt% ELSE height%=Rcnt2%
29300height%=-32*height%
29310LOCAL ERROR
29320ON ERROR LOCAL:RESTORE ERROR:SYS"PDriver_AbortJob",ch%:CLOSE#ch%:SYS"Hourglass_Off":PROCerror("Maths_Task"):ENDPROC
29330
29340PROCset_up_printout(ch%,height%)
29350
29360SYS"ColourTrans_SetGCOL",0
29370SYS"PDriver_DrawPage",1,block%,0,0 TO flg%
29380WHILE flg%
29390 PROCset_results_window(0,0,all%)
29400 SYS"PDriver_GetRectangle",,block% TO flg%
29410ENDWHILE
29420
29430PROCend_printout(ch%)
29440RESTORE ERROR
29450ENDPROC
29460
29470
29480DEF PROCresults_text_file(file$)
29490LOCAL ch%:notsavedR%=0
29500ch%=OPENOUT file$
29510FOR n%=0 TO Rptr%
29520 BPUT#ch%,?(results%+n%)
29530NEXT
29540CLOSE#ch%
29550OSCLI "SetType "+file$+" FFF"
29560$savetextbuff%=file$:PROCreset_icon(SVhandle2%,1)
29570ENDPROC
29580
29590
29600DEF PROCset_results_window(ox%,oy%,all%)
29610LOCAL x%,y%,ptr%,ch%,ch$,X%
29620y%=-32:ptr%=-1:X%=-1
29630REPEAT
29640 ptr% +=1
29650 ch%=?(results%+ptr%):ch$=CHR$ch%
29660
29670 IF ch$="(" AND all%=0 THEN
29680 WHILE ch%<>10 AND ptr%<Rptr%
29690 ptr% +=1:ch%=?(results%+ptr%)
29700 ENDWHILE
29710 IF ?(results%+ptr%+1)=10 THEN ptr% +=1:X%=-1
29720 ELSE
29730 IF ch%<>10 THEN
29740 IF y%+oy%>=block%!32 AND y%+oy%<=block%!40+32 OR ox%=0 AND oy%=0 THEN X% +=1:MOVE ox%,oy%+y%:PRINTTAB(X%);ch$
29750 ELSE
29760 y% -=32:X%=-1
29770 ENDIF
29780 ENDIF
29790UNTIL ptr%=Rptr%
29800ENDPROC
29810
29820
29830DEF PROCset_windows
29840LOCAL n%,x1%,x2%,y1%,y2%
29850IF screen% THEN
29860 FOR n%=1 TO 2
29870 handle%(n%)=FNwhole_screen_window(handle%(n%))
29880 NEXT
29890 NGhandle%=FNwhole_screen_window(NGhandle%)
29900 SChandle%=FNwhole_screen_window(SChandle%)
29910ELSE
29920 FOR n%=1 TO 2
29930 handle%(n%)=FNordinary_window(handle%(n%),1276,844,"",&EF000002)
29940 NEXT
29950 NGhandle%=FNordinary_window(NGhandle%,1192,916,"",&BF001002)
29960 SChandle%=FNordinary_window(SChandle%,748,856,"Y",&87000012)
29970ENDIF
29980ENDPROC
29990
30000
30010DEF PROCset_up_sum_window
30020PROCset_own_sum_operators(NameNo%):startOwn%=0
30030IF decimal%(NameNo%) THEN $Osum1buff%="0.00":$Osum2buff%="0.00" ELSE $Osum1buff%="0":$Osum2buff%="0"
30040PROCreset_icon(Ohandle%,3):PROCreset_icon(Ohandle%,4)
30050IF BothOp%(NameNo%) THEN PrevOp%=operator%(NameNo%)
30060IF ownOp%=1 THEN $Osgnbuff%="+" ELSE $Osgnbuff%="-"
30070Ohandle%=FNcentre_window(Ohandle%,"Y"):Owin%=-1
30080IF game%>0 THEN drag%=0:SYS"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
30090SYS"Wimp_SetCaretPosition",Ohandle%,3,88,-232,-1,-1
30100ENDPROC
30110
30120
30130DEF PROCselect_sum_window
30140LOCAL icon%:icon%=block%!16
30150CASE icon% OF
30160 WHEN -1:SYS"Wimp_SetCaretPosition",Ohandle%,3,88,-232,-1,-1
30170 WHEN 6:PROCset_up_own_sum
30180 WHEN 8,9:ownOp%=icon%-7
30190 IF ownOp%=1 THEN $Osgnbuff%="+" ELSE $Osgnbuff%="-"
30200 PROCreset_icon(Ohandle%,5)
30210 WHEN 7:PROCmake_one_for_me
30220ENDCASE
30230ENDPROC
30240
30250
30260DEF PROCmake_one_for_me
30270LOCAL num1,num2
30280IF ownOp%=1 THEN PROCmake_add(Alevel%(NameNo%)) ELSE PROCmake_sub(Slevel%(NameNo%))
30290IF decimal%(NameNo%)=0 THEN
30300 $Osum1buff%=STR$num1%:$Osum2buff%=STR$num2%
30310ELSE
30320 $Osum1buff%=FNset_dec(STR$(num1%/100)):$Osum2buff%=FNset_dec(STR$(num2%/100))
30330ENDIF
30340PROCreset_icon(Ohandle%,3):PROCreset_icon(Ohandle%,4)
30350ENDPROC
30360
30370
30380DEF PROCown_sum_keys
30390CASE block%!24 OF
30400 WHEN &18F:SYS"Wimp_SetCaretPosition",Ohandle%,3,88,-232,-1,-1
30410 WHEN &18E:SYS"Wimp_SetCaretPosition",Ohandle%,4,88,-304,-1,-1
30420OTHERWISE
30430 SYS"Wimp_ProcessKey",block%!24
30440ENDCASE
30450ENDPROC
30460
30470
30480DEF PROCset_up_own_sum
30490LOCAL buff$,flg%,osum$:flg%=0:correct%=0
30500buff$=FNset_dec($Osum1buff%)
30510IF buff$<>$Osum1buff% THEN $Osum1buff%=buff$:PROCreset_icon(Ohandle%,3):flg%=-1
30520buff$=FNset_dec($Osum2buff%)
30530IF buff$<>$Osum2buff% THEN $Osum2buff%=buff$:PROCreset_icon(Ohandle%,4):flg%=-1
30540IF decimal%(NameNo%) AND (VAL $Osum1buff%<1 OR VAL $Osum2buff%<1) THEN flg%=-1
30550IF flg%=-1 THEN ENDPROC
30560
30570IF decimal%(NameNo%) THEN num1%=FNdec_val($Osum1buff%):num2%=FNdec_val($Osum2buff%) ELSE num1%=VAL $Osum1buff%:num2%=VAL $Osum2buff%
30580
30590IF num1%=0 OR num2%=0 OR ownOp%=2 AND num2%>=num1% THEN ENDPROC
30600
30610IF ownOp%=1 THEN ans%=num1%+num2% ELSE ans%=num1%-num2%
30620
30630PROCclose_window(Ohandle%)
30640PrevOp%=operator%(NameNo%):operator%(NameNo%)=ownOp%
30650game%=operator%(NameNo%):Owin%=0
30660PROCopen_window(handle%(game%)):PROCset_sum
30670ENDPROC
30680
30690
30700DEF FNdec_val(var$)=VAL(LEFT$(var$,LEN var$-3)+RIGHT$(var$,2))
30710
30720
30730DEF FNset_dec(st$)
30740LOCAL pt%,len%,cut%,maxlen%
30750pt%=INSTR(st$,"."):len%=LEN st$:cut%=len%-pt%-2
30760maxlen%=6+(ownOp%=1)+(decimal%(NameNo%)=0)
30770IF decimal%(NameNo%) THEN
30780 IF pt% THEN
30790 IF cut%>0 THEN st$=LEFT$(st$,len%-cut%)
30800 IF cut%=-1 THEN st$=st$+"0"
30810 IF cut%=-2 THEN st$=st$+"00"
30820 ELSE
30830 st$=st$+".00"
30840 ENDIF
30850ELSE
30860 IF pt% THEN st$=LEFT$(st$,pt%-1)
30870ENDIF
30880len%=LEN st$
30890IF len%>maxlen% THEN st$=RIGHT$(st$,maxlen%)
30900=st$
30910
30920
30930REM *******************************
30940REM ***WIMP AND DESKTOP ROUTINES***
30950REM *******************************
30960
30970REM Icons
30980
30990DEF FNicon(whandle%,x%,y%,w%,h%,flg%,name$,ptr1%,ptr2%,ptr3%)
31000REM General purpose icon creation procedure.
31010LOCAL handle%
31020!block%=whandle%
31030block%!4=x%:block%!8=y%:block%!12=w%+x%:block%!16=h%+y%
31040block%!20=flg%
31050
31060IF ptr1%=0 THEN
31070 $(block%+24)=name$
31080ELSE
31090 REM Indirected.
31100 $ptr1%=name$
31110 block%!24=ptr1%:block%!28=ptr2%:block%!32=ptr3%
31120ENDIF
31130
31140SYS"Wimp_CreateIcon",,block% TO handle%
31150=handle%
31160
31170
31180DEF FNicon_bar_icon(sprite$)
31190=FNicon(-1,0,0,68,68,&3002,sprite$,0,0,0)
31200
31210
31220REM Address of buffer of an indirected icon in window definition.
31230DEF FNicon_buffer(num%)=block%!(108+32*num%)
31240
31250
31260DEF FNincrement_buffer(whandle%,ihandle%,var%,ptr%,inc%,range%)
31270REM Increments an icon
31280IF var%=range% THEN =var%
31290var%=VAL $ptr%:var% +=inc%
31300$ptr%=STR$var%
31310PROCreset_icon(whandle%,ihandle%)
31320=var%
31330
31340
31350DEF FNinc_buffer(whandle%,ihandle%,var%,ptr%,inc%,lowR%,highR%,up%)
31360IF up% THEN up%=(block%!8=4) ELSE up%=(block%!8=1)
31370IF up% THEN
31380 var%=FNincrement_buffer(whandle%,ihandle%,var%,ptr%,inc%,highR%)
31390ELSE
31400 var%=FNincrement_buffer(whandle%,ihandle%,var%,ptr%,-inc%,lowR%)
31410ENDIF
31420=var%
31430
31440
31450
31460DEF PROCreset_icon(whandle%,ihandle%)
31470REM For auto_redraw windows. Resets icon where a buffer is altered.
31480!block%=whandle%:block%!4=ihandle%
31490block%!8=0:block%!12=0
31500SYS"Wimp_SetIconState",,block%
31510ENDPROC
31520
31530
31540DEF FNicon_selected(whandle%,ihandle%)
31550REM Tests if radio icon is in selected state
31560!block%=whandle%:block%!4=ihandle%
31570SYS"Wimp_GetIconState",,block%
31580=((block%?26 AND 32)=32)
31590
31600
31610DEF PROCset_icon_flag(whandle%,ihandle%,bit%,set%)
31620REM Alters an icon flag. If set% is set then sets flag else unsets it.
31630!block%=whandle%:block%!4=ihandle%
31640IF set% THEN block%!8=1<<bit%:block%!12=1<<bit% ELSE block%!8=0:block%!12=1<<bit%
31650SYS"Wimp_SetIconState",,block%
31660ENDPROC
31670
31680
31690DEF PROCalter_button_type(whandle%,ihandle%,type%)
31700REM Alters button type of an icon
31710LOCAL N%,P%
31720FOR N%=0 TO 3
31730 P%=(type% AND (2^N%))
31740 PROCset_icon_flag(whandle%,ihandle%,12+N%,P%)
31750NEXT
31760ENDPROC
31770
31780
31790DEF PROCselect_icon(whandle%,ihandle%,set%)
31800PROCset_icon_flag(whandle%,ihandle%,21,set%)
31810ENDPROC
31820
31830
31840DEF PROCshade_icon(whandle%,ihandle%,set%)
31850PROCset_icon_flag(whandle%,ihandle%,22,set%)
31860ENDPROC
31870
31880
31890DEF PROCdelete_icon(whandle%,ihandle%,set%)
31900PROCset_icon_flag(whandle%,ihandle%,23,set%)
31910ENDPROC
31920
31930**************************************************************************
31940
31950REM Windows
31960
31970DEF FNtemp_window(buff%,len%,name%,name$,font%)
31980REM Loads window from template file
31990LOCAL handle%:$name%=name$
32000SYS"Wimp_LoadTemplate",,block%,buff%,buff%+len%,font%,name%,0
32010block%!64=sarea%
32020SYS"Wimp_CreateWindow",,block% TO handle%
32030=handle%
32040
32050
32060DEF FNwhole_screen_window(handle%)
32070LOCAL w%,h%,xshift%,yshift%,open%,prev%:prev%=handle%
32080IF FNwindow_open(handle%) THEN open%=-1
32090!block%=handle%:SYS"Wimp_GetWindowInfo",,block%
32100PROCmode_dimensions(w%,h%)
32110block%!4=0:block%!8=0:block%!12=w%:block%!16=h%
32120xshift%=(w%-(block%!52-block%!44))/2
32130yshift%=(h%-(block%!56-block%!48))/2
32140block%!20 -=xshift%:block%!24 +=yshift%
32150block%!44 -=xshift%:block%!52 +=xshift%
32160block%!56 +=yshift%:block%!48 -=yshift%
32170block%!32=(block%!32 AND &80FFFFFF)
32180SYS"Wimp_CreateWindow",,block%+4 TO handle%
32190IF open% THEN PROCopen_window(handle%)
32200!block%=prev%:SYS"Wimp_DeleteWindow",,block%
32210=handle%
32220
32230
32240DEF FNordinary_window(handle%,w%,h%,cy$,flgs%)
32250LOCAL open%,prev%,Vbar%,Hbar%:prev%=handle%
32260IF (flgs% AND &10000000) THEN Vbar%=44
32270IF (flgs% AND &40000000) THEN Hbar%=44
32280PROCmode_dimensions(SCw%,SCh%)
32290IF FNwindow_open(handle%) THEN open%=-1
32300!block%=handle%:SYS"Wimp_GetWindowInfo",,block%
32310block%!4=(SCw%-w%-Vbar%)/2
32320IF cy$="Y" THEN block%!8=(SCh%-h%-Hbar%)/2 ELSE block%!8=0
32330block%!12=block%!4+w%:block%!16=block%!8+h%
32340block%!20=0:block%!24=0
32350block%!44=0:block%!48=-h%:block%!52=w%:block%!56=0
32360block%!32=flgs%
32370SYS"Wimp_CreateWindow",,block%+4 TO handle%
32380IF open% THEN PROCopen_window(handle%)
32390!block%=prev%:SYS"Wimp_DeleteWindow",,block%
32400=handle%
32410
32420
32430DEF FNplace_window(handle%,x%,y%)
32440LOCAL w%,h%,prev%
32450prev%=handle%
32460!block%=handle%:SYS"Wimp_GetWindowInfo",,block%
32470w%=block%!12-block%!4:h%=block%!16-block%!8
32480block%!4=x%:block%!8=y%:block%!12=x%+w%:block%!16=y%+h%
32490SYS"Wimp_CreateWindow",,block%+4 TO handle%
32500PROCopen_window(handle%)
32510!block%=prev%:SYS"Wimp_DeleteWindow",,block%
32520=handle%
32530
32540
32550DEF FNrelative_window(Mhandle%,Thandle%,x%,y%)
32560LOCAL Mx%,My%
32570!block%=Mhandle%:SYS"Wimp_GetWindowInfo",,block%
32580Mx%=block%!4:My%=block%!8
32590=FNplace_window(Thandle%,Mx%+x%,My%+y%)
32600
32610
32620DEF FNcentre_window(handle%,cy$)
32630LOCAL SCw%,SCh%,w%,h%,prev%,flgs%,Hbar%,Vbar%
32640prev%=handle%
32650PROCmode_dimensions(SCw%,SCh%)
32660!block%=handle%:SYS"Wimp_GetWindowInfo",,block%
32670flgs%=block%!32
32680IF (flgs% AND &10000000) THEN Vbar%=44
32690IF (flgs% AND &40000000) THEN Hbar%=44
32700w%=block%!12-block%!4:h%=block%!16-block%!8
32710IF cy$="Y" THEN block%!8=(SCh%-h%-Hbar%)/2 ELSE block%!8=0
32720block%!4=(SCw%-w%-Vbar%)/2
32730block%!12=block%!4+w%:block%!16=block%!8+h%
32740SYS"Wimp_CreateWindow",,block%+4 TO handle%
32750PROCopen_window(handle%)
32760!block%=prev%:SYS"Wimp_DeleteWindow",,block%
32770=handle%
32780
32790
32800DEF PROCmode_dimensions(RETURN w%,RETURN h%)
32810LOCAL rx%,ry%,ex%,ey%
32820SYS"OS_ReadModeVariable",-1,11 TO ,,rx%
32830SYS"OS_ReadModeVariable",-1,4 TO ,,ex%
32840SYS"OS_ReadModeVariable",-1,12 TO ,,ry%
32850 SYS"OS_ReadModeVariable",-1,5 TO ,,ey%
32860w%=(rx%+1)*2^ex%:h%=(ry%+1)*2^ey%
32870ENDPROC
32880
32890
32900DEF PROCopen_window(whandle%)
32910REM Opens window given handle.
32920!block%=whandle%
32930SYS"Wimp_GetWindowState",,block%
32940block%!28=-1
32950SYS"Wimp_OpenWindow",,block%
32960ENDPROC
32970
32980
32990DEF PROCclose_window(whandle%)
33000REM Closes window given handle.
33010!block%=whandle%
33020SYS"Wimp_GetWindowState",,block%
33030SYS"Wimp_CloseWindow",,block%
33040ENDPROC
33050
33060
33070DEF FNtop_window(whandle%)=FNwindow_flags(whandle%,2)
33080DEF FNwindow_open(whandle%)=FNwindow_flags(whandle%,1)
33090DEF FNwindow_full_size(whandle%)=FNwindow_flags(whandle%,4)
33100
33110DEF FNwindow_flags(whandle%,bit%)
33120!block%=whandle%
33130SYS"Wimp_GetWindowState",,block%
33140=((block%?34 AND bit%)=bit%)
33150
33160
33170DEF FNupdate_window(whandle%,x1%,y1%,x2%,y2%)
33180LOCAL flag%
33190!block%=whandle%
33200block%!4=x1%:block%!8=y1%:block%!12=x2%:block%!16=y2%
33210SYS"Wimp_UpdateWindow",,block% TO flag%
33220=flag%
33230
33240
33250DEF PROCwork_area_origin(whandle%,RETURN ox%,RETURN oy%)
33260!block%=whandle%
33270SYS"Wimp_GetWindowState",,block%
33280ox%=block%!4-block%!20
33290oy%=block%!16-block%!24
33300ENDPROC
33310
33320
33330**************************************************************************
33340
33350REM Menus
33360
33370DEF PROCset_up_menu(title$,address%,num%,item$(),data%())
33380REM Sets up menu block.Item data is read from data list.
33390REM Data subscripts - 0 menu flags,1 subpointer,2 shade,3 buffer,4 buffer length
33400
33410LOCAL ptr%,item%
33420$address%=title$:width%=LEN title$ -3
33430address%!12=&70207:address%!20=44:address%!24=0
33440ptr%=address%+28
33450
33460FOR item%=0 TO num%
33470 ptr%!0=data%(item%,0):ptr%!4=data%(item%,1):ptr%!8=&7000021
33480 IF data%(item%,2) THEN ptr%!8=(ptr%!8 OR &400000)
33490
33500 IF data%(item%,3) THEN
33510 REM Indirected (length>12)
33520 ptr%!8=(ptr%!8 OR &100)
33530 $(data%(item%,3))=item$(item%)
33540 ptr%!12=data%(item%,3):ptr%!16=-1:ptr%!20=data%(item%,4)
33550 ELSE
33560 $(ptr%+12)=item$(item%)
33570 ENDIF
33580
33590ptr%=ptr%+24
33600IF LEN item$(item%)>width% THEN width%=LEN item$(item%):REM Width set from longest item.
33610NEXT
33620
33630address%!16=(width%+1)*16
33640ENDPROC
33650
33660
33670DEF PROCshow_menu(mblock%,x%,num%)
33680REM For showing a standard menu from the icon bar.
33690LOCAL y%
33700x% -=64:y%=140+44*num%
33710SYS"Wimp_CreateMenu",,mblock%,x%,y%
33720ENDPROC
33730
33740
33750DEF PROCalter_tick(menu%,item%,num%)
33760REM Sets tick bit for item position item% unsets it for others.
33770LOCAL add%,n%
33780FOR n%=0 TO num%
33790 add%=menu%+28+24*n%
33800 IF n%=item% THEN ?add%=(?add% OR 1) ELSE ?add%=(?add% AND 254)
33810NEXT
33820ENDPROC
33830
33840
33850DEF PROCsingle_tick(menu%,item%,set%)
33860LOCAL add%
33870add%=menu%+28+24*item%
33880IF set% THEN ?add%=(?add% OR 1) ELSE ?add%=(?add% AND 254)
33890ENDPROC
33900
33910
33920DEF PROCshade_item(menu%,item%,set%)
33930LOCAL ptr%
33940ptr%=menu%+28+24*item%
33950IF set% THEN ptr%!8=(ptr%!8 OR &400000) ELSE ptr%!8=(ptr%!8 AND &FFBFFFFF)
33960ENDPROC
33970
33980**************************************************************************
33990
34000REM Mode independence
34010
34020DEF PROCpalette_block(sprite$,sarea%,pal%)
34030REM Takes sprite palette and puts it into a block for making the transcolour table.
34040LOCAL ptr%,c%,address%
34050SYS"OS_SpriteOp",&118,sarea%,sprite$ TO ,,address%
34060ptr%=address%+44
34070FOR c%=0 TO 15
34080 pal%!(c%*4)=!ptr%
34090 ptr%=ptr%+8
34100NEXT
34110ENDPROC
34120
34130
34140DEF PROCsource_mode_factors(mode%,scale%)
34150REM Calcalate the scale factors for the sprites source mode
34160SYS"OS_ReadModeVariable",mode%,4 TO ,,xeig%
34170SYS"OS_ReadModeVariable",mode%,5 TO ,,yeig%
34180scale%!0=1<<xeig%:scale%!4=1<<yeig%
34190ENDPROC
34200
34210
34220DEF PROCcurrent_mode_factors(scale%)
34230REM Produce the scale factors for the current mode
34240SYS"OS_ReadModeVariable",-1,4 TO ,,xeig%
34250SYS"OS_ReadModeVariable",-1,5 TO ,,yeig%
34260scale%!8=1<<xeig%:scale%!12=1<<yeig%
34270ENDPROC
34280
34290
34300DEF PROCos_to_pixels(wOS%,hOS%,RETURN wP%,RETURN hP%)
34310REM Converts os units to pixels for mode
34320SYS"OS_ReadModeVariable",-1,4 TO ,,xeig%
34330SYS"OS_ReadModeVariable",-1,5 TO ,,yeig%
34340wP%=wOS%/2^xeig%:hP%=hOS%/2^yeig%
34350ENDPROC
34360
34370
34380DEF PROCtranstable(mode%,Spal%,Dpal%,transtable%)
34390REM Produce colour translation table for the current mode
34400SYS"ColourTrans_SelectTable",mode%,Spal%,-1,Dpal%,transtable%
34410ENDPROC
34420
34430
34440DEF PROCset_GCOL(col%,pal%)
34450LOCAL back%
34460IF col%>=128 THEN col% -=128:back%=128 ELSE back%=0
34470SYS"ColourTrans_SetGCOL",pal%!(4*col%),back%,0
34480ENDPROC
34490
34500
34510DEF PROCpalfile_to_block(file$,pal%)
34520LOCAL x%,col%,N%
34530x%=OPENIN file$
34540FOR col%=0 TO 15
34550 FOR N%=0 TO 2
34560 PTR#x%=6*col%+3+N%
34570 pal%?(4*col%+N%+1)=BGET#x%
34580 NEXT
34590NEXT
34600CLOSE#x%
34610ENDPROC
34620
34630
34640DEFFNnumber_of_colours
34650REM Gives number of colours in a mode.
34660LOCAL numcol%
34670SYS"OS_ReadModeVariable",-1,3 TO ,,numcol%
34680=numcol%+1
34690
34700
34710DEFPROCscale_text(sx%,sy%,scale%)
34720REM Keeps text mode independent.
34730LOCAL xsc,ysc
34740xsc=scale%!0/scale%!8:sx%=sx%*xsc
34750ysc=scale%!4/scale%!12:sy%=sy%*ysc
34760VDU23,17,7,6,sx%;sy%;0;
34770ENDPROC
34780
34790
34800**************************************************************************
34810
34820REM Error routines
34830
34840DEFPROCerror(task$)
34850REM Displays error message from operating system.
34860!block%=255
34870a$=REPORT$+" "+STR$ERL
34880$(block%+4)=a$+CHR$0
34890SYS"Wimp_ReportError",block%,1,task$
34900ENDPROC
34910
34920
34930DEF FNerror_message(message$,task$,flags%)
34940REM Displays personal error message
34950!block%=255:$(block%+4)=message$+CHR$0
34960SYS"Wimp_ReportError",block%,flags%,task$ TO ,response%
34970=response%
34980
34990
35000DEFPROCtest(var$)
35010REM Displays value of string variable.Debugging aid.
35020!block%=255
35030$(block%+4)=var$+CHR$0
35040SYS"Wimp_ReportError",block%,1,"print_text"
35050ENDPROC
35060
35070
35080DEF FNensure_Pdriver
35090REM Checks that printer driver is loaded
35100LOCAL P%,printer%:printer%=0
35110LOCAL ERROR
35120ON ERROR LOCAL:RESTORE ERROR:CLOSE#P%:=printer%
35130P%=OPENOUT("printer:")
35140SYS"PDriver_SelectJob",P%,"print_job"
35150SYS"PDriver_AbortJob",P%
35160printer%=-1
35170CLOSE#P%
35171RESTORE ERROR
35180=printer%
35190
35200**************************************************************************
35210
35220Drag operations
35230
35240DEF PROCdrag_box(type%,x%,y%,width%,height%)
35250block%!4=type%
35260block%!8=x%:block%!12=y%:block%!16=x%+width%:block%!20=y%+height%
35270block%!24=0:block%!28=0:block%!32=1280:block%!36=1024
35280SYS"Wimp_DragBox",,block%
35290ENDPROC
35300
35310**************************************************************************
35320
35330REM Fonts
35340
35350DEF PROClose_icon_fonts(f%)
35360LOCAL n%,m%
35370FOR n%=1 TO 255
35380 IF ?(f%+n%)>0 THEN
35390 num%=?(f%+n%)
35400 FOR m%=1 TO num%
35410 SYS"Font_LoseFont",n%
35420 NEXT
35430 ENDIF
35440NEXT
35450ENDPROC
35460
35470**************************************************************************
35480
35490REM Loading and saving
35500
35510DEF PROCdrag_icon(whandle%,ihandle%,type%)
35520LOCAL w%,h%,ox%,oy%
35530PROCwork_area_origin(whandle%,ox%,oy%)
35540!block%=whandle%:block%!4=ihandle%
35550SYS"Wimp_GetIconState",,block%
35560block%!8=ox%+block%!8:block%!12=oy%+block%!12
35570block%!16=ox%+block%!16:block%!20=oy%+block%!20
35580w%=block%!16-block%!8:h%=block%!20-block%!12
35590PROCdrag_box(type%,block%!8,block%!12,w%,h%)
35600ENDPROC
35610
35620
35630DEF PROCsave_request(type%,namebuff%,size%)
35640SYS"Wimp_GetPointerInfo",,block%
35650block%!20=block%!12:block%!24=block%!16
35660block%!28=!block%:block%!32=block%!16
35670block%!36=size%:!block%=64:block%!12=0
35680block%!16=1:block%!40=type%
35690$(block%+44)=FNgetleaf($namebuff%,-1)
35700SYS"Wimp_SendMessage",18,block%,block%!20,block%!24
35710ENDPROC
35720
35730
35740DEF FNgetleaf(a$,zero%)
35750WHILE INSTR(a$,".")
35760a$=MID$(a$,INSTR(a$,".")+1)
35770ENDWHILE
35780IF zero% THEN a$=a$+CHR$0
35790=a$
35800
35810
35820DEF FNstring(ptr%)
35830LOCAL name%:name%=ptr%
35840WHILE ?ptr%<>0
35850 ptr% +=1
35860ENDWHILE
35870?ptr%=13
35880=$name%
35890
35900**************************************************************************
35910
35920REM Miscelaneous
35930
35940DEF PROCpause(time%)
35950time% +=TIME
35960WHILE time%>TIME
35970ENDWHILE
35980ENDPROC
� > !Runimage
� Addition and subtraction.
� Version 0.30, 9th Sept 96
('� � �error("Maths_task"):�end(-1):�
2
<�initialise
F�wimp_poll
P�end(-1)
Z�
d
n
x� �initialise
�� n%
�+� block% 3000,block2% 60,results% 44000
�4� Prect% 16,Ptrans% 16,Pplot% 8,lev% 48,Hlev% 48
��� dig1$(5),dig2$(4),dig3$(5),answer$(5),carry$(5),car_dig%(5),dig_limQ%(9),dig_limA%(7),handle%(3),dig_name$(4),colname$(4),strike$(6),st_dig%(6),Pdig1$(9,4),Pdig2$(9,4),Pop%(9),Pdec%(9),PlimQ%(9),PlimA%(9),Cdone%(4),STdone%(4),name$(43),message$(2)
��� Alevel%(43),Slevel%(43),Hlevel%(43),MHlevel%(43),auto%(43),autohelp%(43),force%(43),tries%(43),mode%(43),decimal%(43),MenuBuff%(14)
��� operator%(43),no_quest%(43),timelim%(43),Notimer%(43),calc%(43),printer%(43),score%(43),next%(43),stop%(43),colname%(43),estimate%(43),newlevR%(43),newlevW%(43),BothOp%(43),saveR%(43),ownsum%(43),speech%(43)
�Nend%=0:drag%=0:double%=0:initx%=0:inity%=0:initnum%=0:dragval%=0:PrevOp%=0
Ȋquest%=0:try%=0:sesstime%=0:game%=0:start%=-1:drawfont%=0:SCformat%=1:EstVal%=0:marked%=0:Owin%=0:dragx%=0:dragy%=0:ownOp%=0:rubber%=0
�{carry%=0:strike%=0:reduce%=0:Bstep%=0:force5%=0:nextcheck%=0:path$="":Rcnt%=0:Rcnt2%=0:dirpath$="":alter%=0:startOwn%=0
�Jnextdig%=0:rubdig%=-1:stopped%=0:anslim%=0:sum%=0:notsavedR%=0:newR%=0
�6CorrectAns%=0:correct%=0:message$()="":nextmess%=0
�+Pcount%=-1:Psave%=0:Pprint%=0:driver%=0
�:CCsum=0:CCnum=0:CCnum$="":CCstart%=0:CCop%=0:CCprev%=0
-y1%=-296:y2%=y1%-75:y3%=y2%-75:y0%=y1%+92
mkx%=�digx(0)+110
"
,2ș"Wimp_Initialise",200,&4B534154,"Maths_task"
6*IBhandle%=�icon_bar_icon("!mbookDemo")
@�set_fonts
A�load_sprites
J�create_windows
T�icon_menu
^)Thandle%=�centre_window(Thandle%,"Y")
h
TLtime%=�
|�set_option_variables
��set_mode_independance
��
�
�
�� �icon_menu
�� Sets up menu
�%� menu% 244,rmenu% 172,mbuff% 115
�� item$(8),data%(8,4)
րitem$()="Info","See options","See/edit group","Load/new group","Save group","Results","Enable printer","Whole screen","Quit"
�data%()=2,Ihandle%,0,0,0,0,-1,1,0,0,0,-1,1,mbuff%,15,0,-1,0,mbuff%+84,15,0,-1,1,0,0,2,rmenu%,0,0,0,0,-1,0,mbuff%+100,15,0,-1,0,0,0,&80,-1,0,0,0
�5�set_up_menu("MathsBook",menu%,8,item$(),data%())
�
�kitem$()="See results","Print results","Print summary","Save results","Auto save results","Wipe results"
rdata%()=0,-1,1,0,0,0,-1,0,mbuff%+35,14,0,-1,0,mbuff%+50,14,0,SVhandle2%,1,0,0,0,-1,0,mbuff%+65,18,&80,-1,0,0,0
4�set_up_menu("Results",rmenu%,5,item$(),data%())
�
&
0
:� �create_windows
D� Load template files
N�� Abuff% 500,Sbuff% 500,Ibuff% 150,Cbuff% 800,SCbuff% 250,N2buff% 900,calcbuff% 200,SVbuff% 300,SV2buff% 300,Fbuff% 200,Pbuff% 100,STbuff% 100,Icbuff% 100,Obuff% 200,Smbuff% 100,Lbuff% 400,Drbuff% 100,Ebuff% 100,Rbuff% 100,Edbuff% 100,Dembuff% 150
X&� Mbuff% 500,P2buff% 100,font% 255
b$� n%=0 � 255 � 4:!(font%+n%)=0:�
l� name% 11
v
�3ș"Wimp_OpenTemplate",,"<Maths$Dir>.Templates2"
�;handle%(1)=�temp_window(Abuff%,500,name%,"addition",-1)
�titlebuff1%=block%!72
�>handle%(2)=�temp_window(Sbuff%,500,name%,"subtraction",-1)
�titlebuff2%=block%!72
�5Ihandle%=�temp_window(Ibuff%,150,name%,"info",-1)
�7Chandle%=�temp_window(Cbuff%,800,name%,"config",-1)
� level_buffA%=�icon_buffer(5)
� level_buffS%=�icon_buffer(8)
�Qbuff%=�icon_buffer(16)
�Tbuff%=�icon_buffer(19)
�Tmbuff%=�icon_buffer(22)
Hbuff%=�icon_buffer(31)
MHbuff%=�icon_buffer(37)
levRbuff%=�icon_buffer(53)
levWbuff%=�icon_buffer(57)
*titlebuffC%=block%!72
4
>;SChandle%=�temp_window(SCbuff%,250,name%,"score",font%)
HSnamebuff%=�icon_buffer(1)
RSCtbuff%=�icon_buffer(2)
\SCQbuff%=�icon_buffer(4)
fSCRbuff%=�icon_buffer(6)
pSCWbuff%=�icon_buffer(8)
z
�8NGhandle%=�temp_window(N2buff%,900,name%,"name2",-1)
�Ntitlebuff%=block%!72
�
�9CChandle%=�temp_window(calcbuff%,200,name%,"calc",-1)
�CCbuff%=�icon_buffer(17)
�
�;Lhandle%=�temp_window(Lbuff%,400,name%,"Loadbox",font%)
�loadbuff%=�icon_buffer(2)
�8Mhandle%=�temp_window(Mbuff%,500,name%,"DirMenu",-1)
�0� n%=0 � 14:MenuBuff%(n%)=�icon_buffer(n%):�
�
�:SVhandle%=�temp_window(SVbuff%,300,name%,"savebox",-1)
�savebuff%=�icon_buffer(1)
:Drhandle%=�temp_window(Drbuff%,100,name%,"dirmess",-1)
:Phandle%=�temp_window(Pbuff%,100,name%,"printmess",-1)
$=P2handle%=�temp_window(P2buff%,100,name%,"printmess2",-1)
.;SThandle%=�temp_window(STbuff%,100,name%,"stopmess",-1)
8;Ichandle%=�temp_window(Icbuff%,100,name%,"iconmess",-1)
Bicbuff%=�icon_buffer(0)
L;Smhandle%=�temp_window(Smbuff%,100,name%,"savemess",-1)
V8Ehandle%=�temp_window(Ebuff%,100,name%,"endsave",-1)
`Eicbuff%=�icon_buffer(1)
j;Rhandle%=�temp_window(Rbuff%,100,name%,"rejectmess",-1)
tRicbuff%=�icon_buffer(0)
~;Edhandle%=�temp_window(Edbuff%,100,name%,"namemess",-1)
�
�3Dhandle%=�temp_window(-1,-1,name%,"dribble",-1)
�=SVhandle2%=�temp_window(SV2buff%,300,name%,"savebox2",-1)
�!savetextbuff%=�icon_buffer(1)
�
�:Ohandle%=�temp_window(Obuff%,200,name%,"ownsum",font%)
�Osum1buff%=�icon_buffer(3)
�Osum2buff%=�icon_buffer(4)
�Osgnbuff%=�icon_buffer(5)
�
�1Thandle%=�temp_window(-1,-1,name%,"title",-1)
�
9Demhandle%=�temp_window(Dembuff%,150,name%,"demo",-1)
DemIc%=�icon_buffer(1)
ș"Wimp_CloseTemplate"
(�
2
<
F� �load_sprites
P
� mem%
Zmem%=258000:� 143124+114796
d� sarea% mem%
n!sarea%=mem%:sarea%!8=16
xș"OS_SpriteOp",&109,sarea%
�5ș"OS_SpriteOp",&10A,sarea%,"<Maths$Dir>.sprites"
��
�
�
�� �set_mode_independance
�.� scale% 16,trans% 255,pal% 64,scale27% 16
�#�source_mode_factors(12,scale%)
�!�current_mode_factors(scale%)
�$�palette_block("n0",sarea%,pal%)
�"�transtable(12,pal%,-1,trans%)
��message_mode_independance
�
�%�source_mode_factors(27,scale27%)
#�current_mode_factors(scale27%)
�
"
,� �wimp_poll
6�
@$ș"Wimp_Poll",0,block% � reason%
JȎ reason% �
T � 0:�null_event
^ � 1:�redraw
h � 2:�open_windows
r � 3:�close_windows
| � 6:�button_clicks
�P � 7:� �window_open(SVhandle%) � �save_request(&FFD,savebuff%,72+20*Ncount%)
�R � �window_open(SVhandle2%) � �save_request(&FFF,savetextbuff%,Rptr%+1)
� � 8:�keys
� � 9:�select_menu
� � 17,18:�messages
��
�
� end%=-1
��
�
�
�� �keys
�Ȏ !block% �
� � CChandle%:�keys_calc
� Ohandle%:�own_sum_keys
� NGhandle%:� create%<0 �
( �keys_name(NameNo%)
& �
0@ � NameNo%=Ncount%+1 � �keys_name(Ncount%+1)
:E � NameNo%>0 � block%!24=13 � �keys_name(NameNo%)
D �
N
X" ș"Wimp_ProcessKey",block%!24
b�
l�
v
�
�� �messages
�Ȏ block%!16 �
� � 0:end%=-1
�I � 2:� IF FNwindow_open(SVhandle%) PROCsave_file(FNstring(block%+44))
�U � IF FNwindow_open(SVhandle2%) PROCresults_text_file(FNstring(block%+44))
�$ �close_window(Smhandle%)
�- � 3:� block%!40=&FFD � �dragload_message
� � &400C1:�mode_change
�/ � 5:� block%!40=&1000 � �broadcast_message
��
��
�
� �set_up_loadbox
� item%,file$,n%:item%=0
1�loadbox_windows(-1):�close_window(Drhandle%)
*+� n%=0 � 14:$(MenuBuff%(n%))="":�:n%=-1
4
>H$(block%+12)=path$:ș"OS_GBPB",9,block%+12,block%,1,0,11 � ,,,,item%
Hȕ item%>-1 � n%<14
R file$=�string(block%)
\6 � file$<>"results" � n%+=1:$(MenuBuff%(n%))=file$
f: ș"OS_GBPB",9,block%+12,block%,1,item%,11 � ,,,,item%
p�
z
�path$=path$+"."
��
�
�
�� �broadcast_message
�6� ¤string(block%+44),9)="Mfiles_+-" � create%<0 �
�, path$=�string(block%+44):dirpath$=path$
�* $loadbuff%="":�reset_icon(Lhandle%,3)
� �shade_icon(Lhandle%,1,0)
� �set_up_loadbox
��
��
�
� �dragload_message
� file$,leaf$,whandle%
$whandle%=block%!20
.file$=�string(block%+44)
8S� IF (notsavedO% OR notsavedR%)=-1 THEN nextfile$=file$:PROCend_save(3):ENDPROC
B�file_vars(file$)
L�load_file(file$)
V
`� whandle%=Lhandle% �
j �reset_icon(Lhandle%,2)
t�
~( � whandle%=-2 � �loadbox_windows(0)
��
��
�
�
�� �file_vars(file$)
�1$savebuff%=file$:$loadbuff%=�getleaf(file$,0)
�&path$=�file$,� file$-� $loadbuff%)
�l� �file$,"Mfiles_+-") � $savetextbuff%=path$+"results."+$loadbuff% � $savetextbuff%=path$+"R"+$loadbuff%
��
�
�
�� �mode_change
"�transtable(12,pal%,-1,trans%)
!�current_mode_factors(scale%)
#�current_mode_factors(scale27%)
�message_mode_independance
(%drawfont%=(game%>0 � SCformat%=2)
2�set_windows
<D� �window_open(Ohandle%) � Ohandle%=�centre_window(Ohandle%,"Y")
F3� �window_open(Lhandle%) � �loadbox_windows(-1)
PG� �window_open(CChandle%) � CChandle%=�centre_window(CChandle%,"Y")
ZC� �window_open(Dhandle%) � Dhandle%=�centre_window(Dhandle%,"")
d�
n
x
�� �select_menu
�� no%,scx%,scy%
�Ȏ !block% �
� � 1:no%=NameNo%
�" �set_config_title(no%)
�! �set_preferences(no%)
�0 Chandle%=�centre_window(Chandle%,"")
�' � 2:create%=-1:�build_name_windowG
�8 � 3:create%=-2:�open_window(Drhandle%):nextfile$=""
�; � game% � �close_window(handle%(game%)):game%=0
�C � IF (notsavedO% OR notsavedR%)=-1 THEN PROCend_save(3)
�? � 4:� PROCsave_file($savebuff%):PROCopen_window(Smhandle%)
�2 $DemIc%="saves the children's levels."
5 Demhandle%=�centre_window(Demhandle%,"Y")
� 5:�select_menu_results
� 6:� enprint%=NOT enprint%
"/ � PROCsingle_tick(menu%,6,enprint%)
,6 � IF NameNo% THEN PROCset_printer(NameNo%)
6S $DemIc%="can print out sums.":Demhandle%=�centre_window(Demhandle%,"Y")
@ � 7:screen%=� screen%
J) �single_tick(menu%,7,screen%)
T �set_windows
^o � 8:� IF (notsavedO% OR notsavedR%)=-1 AND path$<>"" THEN nextfile$="":PROCend_save(3):end%=1 ELSE end%=-1
h end%=-1
r�
| �menu_adjust(menu%,block%,9)
��
�
�
�� �end_save(file%)
�L� notsavedO%=-1 � (file%=1 � file%=3) � $Eicbuff%="current group file ?"
�F� notsavedR%=-1 � (file%=2 � file%=3) � $Eicbuff%="results file ?"
�S� (notsavedO% � notsavedR%)=-1 � file%=3 � $Eicbuff%="group and results file ?"
��open_window(Ehandle%)
�savend%=file%
��
�
�
�� �select_end_save
� block%!16=2 �
K � IF notsavedO%-1 AND (savend% AND 1)=1 THEN PROCsave_file($savebuff%)
K � notsavedR%=-1 � (savend% � 2)=2 � �results_text_file($savetextbuff%)
&! � savend%=2 � �reset_results
0�
:�close_window(Ehandle%)
D+end%=(end%=1):notsavedO%=0:notsavedR%=0
NJ� nextfile$<>"" � end%=0 � �file_vars(nextfile$):�load_file(nextfile$)
X�
b
l
v%� �menu_adjust(menu%,block%,num%)
�#ș"Wimp_GetPointerInfo",,block%
�0� block%!8=1 � �show_menu(menu%,block%,num%)
��
�
�
�� �select_menu_results
�� response%
�Ȏ block%!4 �
�- � 0:Dhandle%=�centre_window(Dhandle%,"")
� � 1:�printout_results(-1)
� � 2:�printout_results(0)
�C � 3:�results_text_file($savetextbuff%):�open_window(Smhandle%)
� � 4:autosaveR%=� autosaveR%
- �single_tick(rmenu%,4,autosaveR%)
1 � 5:� notsavedR% � nextfile$="":�end_save(2)
�
�
*
4
>� �end(f%)
H� f% � �lose_fonts
R*POINTER
\*SET Maths1$Running <>
fș"Wimp_CloseDown"
p�
z
�
�� �open_windows
�ș"Wimp_OpenWindow",,block%
�� !block%=handle%(game%) �
�( � Owin%=-1 � �open_window(Ohandle%)
�6 � �window_open(Chandle%) � �open_window(Chandle%)
��
�K� !block%=Lhandle% � Mhandle%=�relative_window(Lhandle%,Mhandle%,358,0)
��
�
�
�� �close_windows
�� handle%:handle%=!block%
Ȏ handle% �
R � handle%(game%):SThandle%=�relative_window(handle%(game%),SThandle%,450,556)
; � NGhandle%:create%=0:NameNo%=0:�shade_item(menu%,1,1)
$2 � Lhandle%:�close_window(Mhandle%):create%=-2
.�
86� handle%<>handle%(game%) � �close_window(handle%)
B� end%=1 � end%=0
L�
V
`
j
� �redraw
t"� flg%,Handle%:Handle%=!block%
~&�work_area_origin(!block%,ox%,oy%)
�(ș"Wimp_RedrawWindow",,block% � flg%
�ȕ flg%
� Ȏ Handle% �
�# � handle%(game%):�redraw_game
�$ � NGhandle%:�redraw_class_list
�0 � Dhandle%:�set_results_window(ox%,oy%,-1)
� �
�) ș"Wimp_GetRectangle",,block% � flg%
��
��
�
�
� �redraw_game
� sc%
�grid
(*� SCformat%=2 � estimate%(NameNo%)=0 �
2 �sum_parts:�sum_numbers
<, � mode%(NameNo%) � �input_box(nextdig%)
F � marked% � �mark
Pg � message$(1)<>"" � drawfont%=0 � ș"OS_SpriteOp",&134,sarea%,"message",ox%+600,oy%+y3%-25,0,-1,-1
Z�
dL ș"OS_SpriteOp",&134,sarea%,"estimate",ox%+14,oy%-462,8,scale27%,trans%
n �place_estimate
x �sum_numbers_est
��
�
�Tș"OS_SpriteOp",&134,sarea%,"backtop1",ox%+150,oy%-146,0,scale%,trans%:� rub out
�=� drag%=-1 � (dragval%<>10 � dragval%=10 � dragy%<-150) �
�. � dragval%=10 � sc%=scale% � sc%=scale27%
�T ș"OS_SpriteOp",&134,sarea%,"move"+�dragval%,ox%+dragx%,oy%+dragy%,8,sc%,trans%
��
��
�
�
�� �button_clicks
� � no%
�$� block%!8=2 � block%!12<>-2 � �
�Ȏ block%!12 �
�0 � -2:� block%!16=IBhandle% � �select_IBicon
4 � handle%(game%):� block%!8=4 � �icon_selection
0 � Chandle%:no%=NameNo%:�select_options(no%)
� SChandle%:�select_score
"' � CChandle%:�calcalator(block%!16)
,: � NGhandle%:� create%=0 � �select_nameG � �edit_nameG
6 � SVhandle%:�select_savebox
@# � SVhandle2%:�select_save_text
J* � SThandle%:� block%!16=2 � �game_end
T, �close_window(SThandle%)
^" � Ohandle%:�select_sum_window
h � Lhandle%:�select_loadfile
r, � Mhandle%:�select_file_menu(block%!16)
| � Ehandle%:�select_end_save
�. � P2handle%:� block%!16=2 � �sum_printout
� Pcount%=-1
�d � Phandle%,Ichandle%,Smhandle%,Drhandle%,Rhandle%,Edhandle%,Demhandle%:�close_window(block%!12)
��
��
�
�
�� �select_loadfile
�� file%,error%
�6ș"Wimp_SetCaretPosition",Lhandle%,2,46,-210,-1,-1
�&� block%!16<>3 � $loadbuff%="" � �
��close_window(Thandle%)
�
$savebuff%=path$+$loadbuff%
f� �path$,"Mfiles_+-") � $savetextbuff%=path$+"results."+$loadbuff% � $savetextbuff%="R"+$savebuff%
&� create% �
0 � �check_file �
: �load_file($savebuff%)
D �build_name_windowG
N �
X+ � PROCload_file("<Obey$Dir>.default")
b! � PROCsave_file($savebuff%)
l+ $DemIc%="allows files to be created."
v/ Demhandle%=�centre_window(Demhandle%,"Y")
� �
��
��loadbox_windows(0)
��
�
�
�� �select_file_menu(icon%)
�� $MenuBuff%(icon%)="" � �
�!create%=-1:path$=dirpath$+"."
��close_window(Ichandle%)
� $loadbuff%=$MenuBuff%(icon%)
��reset_icon(Lhandle%,2)
��
� �check_file
� n%,flg%
*�
4* � $loadbuff%=$MenuBuff%(n%) � flg%=-1
> n% +=1
H� n%=15 � flg%=-1
R =flg%
\
f
p� �loadbox_windows(open%)
z
� open% �
�* Lhandle%=�centre_window(Lhandle%,"Y")
�7 Mhandle%=�relative_window(Lhandle%,Mhandle%,358,0)
�7 ș"Wimp_SetCaretPosition",Lhandle%,2,46,-210,-1,-1
��
� �close_window(Lhandle%)
� �close_window(Mhandle%)
� �close_window(Ichandle%)
��
��
�
�
�� �select_IBicon
�� block%!8=2 �
�allow_print_results
�show_menu(menu%,!block%,9)
�
$ � start% �
. � create% �
8 �open_window(Drhandle%)
B �
L �build_name_windowG
V �loadbox_windows(0)
` �
j �
t�
~�close_window(Ichandle%)
��close_window(Smhandle%)
��close_window(Ehandle%)
��close_window(Rhandle%)
��close_window(Thandle%)
��
�
�
�� �switch_window(h%)
�� n%
�;!block2%=handle%(3-h%):ș"Wimp_GetWindowState",,block2%
�6!block%=handle%(h%):ș"Wimp_GetWindowInfo",,block%
�*� n%=4 � 24 � 4:block%!n%=block2%!n%:�
7!block2%=handle%(h%):ș"Wimp_DeleteWindow",,block2%
1ș"Wimp_CreateWindow",,block%+4 � handle%(h%)
�open_window(handle%(h%))
�
(
2
<� �select_options(no%)
F:� icon%,help%,reset%,svR%,n%:reset%=0:svR%=saveR%(no%)
P=help%=Hlevel%(no%):notsavedO%=(path$<>""):icon%=block%!16
Z+� alter%=0 � alter%=(icon%<>68 � no%=0)
dȎ icon% �
n: � 2,3:�select_operators(icon%-1,no%):reset%=(Owin%=0)
xX � 6:Alevel%(no%)=�inc_buffer(Chandle%,5,Alevel%(no%),level_buffA%,1,1,7,0):reset%=1
�D � decimal%(no%)=1 � Alevel%(no%)=5 � �set_dec_levels(no%)
�Y � 7:Alevel%(no%)=�inc_buffer(Chandle%,5,Alevel%(no%),level_buffA%,1,1,7,-1):reset%=1
�X � 9:Slevel%(no%)=�inc_buffer(Chandle%,8,Slevel%(no%),level_buffS%,1,1,9,0):reset%=1
�E � decimal%(no%)=1 � Slevel%(no%)=5 � �set_dec_levels(no%)
�Z � 10:Slevel%(no%)=�inc_buffer(Chandle%,8,Slevel%(no%),level_buffS%,1,1,9,-1):reset%=1
�P � 17:no_quest%(no%)=�inc_buffer(Chandle%,16,no_quest%(no%),Qbuff%,1,1,99,0)
�Q � 18:no_quest%(no%)=�inc_buffer(Chandle%,16,no_quest%(no%),Qbuff%,1,1,99,-1)
�I � 20:tries%(no%)=�inc_buffer(Chandle%,19,tries%(no%),Tbuff%,1,1,3,0)
�J � 21:tries%(no%)=�inc_buffer(Chandle%,19,tries%(no%),Tbuff%,1,1,3,-1)
�O � 23:timelim%(no%)=�inc_buffer(Chandle%,22,timelim%(no%),Tmbuff%,1,1,30,0)
�P � 24:timelim%(no%)=�inc_buffer(Chandle%,22,timelim%(no%),Tmbuff%,1,1,30,-1)
�4 � 25:Notimer%(no%)=-�icon_selected(Chandle%,25)
�5 �shade_3icons(Chandle%,22,Notimer%(no%))
K � 32:Hlevel%(no%)=�inc_buffer(Chandle%,31,Hlevel%(no%),Hbuff%,1,0,5,0)
# �reset_help_level(no%)
0 � force5%=0 � Helplev%=Hlevel%(no%)
"2 � Hlevel%(no%)=0 � �set_top_icon(2,0)
,L � 33:Hlevel%(no%)=�inc_buffer(Chandle%,31,Hlevel%(no%),Hbuff%,1,0,5,-1)
6# �reset_help_level(no%)
@0 � force5%=0 � Helplev%=Hlevel%(no%)
J3 � Hlevel%(no%)=1 � �set_top_icon(2,-1)
T2 � 34:force%(no%)=-�icon_selected(Chandle%,34)
^N � 38:MHlevel%(no%)=�inc_buffer(Chandle%,37,MHlevel%(no%),MHbuff%,1,0,5,0)
h# �reset_help_level(no%)
rS � 39:MHlevel%(NameNo%)=�inc_buffer(Chandle%,37,MHlevel%(no%),MHbuff%,1,0,5,-1)
|# �reset_help_level(no%)
�? � 28,29:mode%(no%)=icon%-28:�adjust_for_mode(no%):reset%=1
�1 � 42:calc%(no%)=-�icon_selected(Chandle%,42)
�" �set_delete_icon(no%)
�6 � calc%(no%)=0 � �close_window(CChandle%)
� � 43:� PROCset_printer(no%)
�( �select_icon(Chandle%,43,0)
�* $DemIc%="can print out sums."
�6 Demhandle%=�centre_window(Demhandle%,"Y")
�9 � 44:score%(no%)=-�select_display(44,-score%(no%),4)
� � 46:�set_next(no%)
�7 � 47:stop%(no%)=-�select_display(47,-stop%(no%),6)
�4 � 48:colname%(no%)=-�icon_selected(Chandle%,48)
� � 45:�set_estimate(no%)
� 61:�set_keep_results(no%)
� 49:�set_auto(no%)
5 � 50:autohelp%(no%)=-�icon_selected(Chandle%,50)
& �set_autohelp(no%)
0! � 51:�close_window(Chandle%)
:? startOwn%=(startOwn%=1 � game%>0):reset%=startOwn%
;- nextmess%=(Helplev%=5 � game%>0)
DQ � 54:newlevR%(no%)=�inc_buffer(Chandle%,53,newlevR%(no%),levRbuff%,1,1,10,0)
NR � 55:newlevR%(no%)=�inc_buffer(Chandle%,53,newlevR%(no%),levRbuff%,1,1,10,-1)
XS � 58:newlevW%(no%)=-�inc_buffer(Chandle%,57,-newlevW%(no%),levWbuff%,1,1,10,0)
bT � 59:newlevW%(no%)=-�inc_buffer(Chandle%,57,-newlevW%(no%),levWbuff%,1,1,10,-1)
l' � 62:�set_decimal:reset%=(Owin%=0)
v3 � 63:ownsum%(no%)=-�icon_selected(Chandle%,63)
�D �set_own_sum(no%):startOwn%=-(ownsum%(no%)=1 � game%>0)
�? � ownsum%(no%)=0 � �close_window(Ohandle%):Owin%=0
�7 � 64:� n%=1 � Ncount%:�set_new_name_levels(n%,0):�
�$ �close_window(Chandle%)
�% � 65:�set_new_name_levels(no%,0)
�" �set_preferences(no%)
�! � 66:�close_window(Chandle%)
�% � 67:�select_icon(Chandle%,67,0)
�' $DemIc%="includes speech."
�6 Demhandle%=�centre_window(Demhandle%,"Y")
�/ � 68:� alter% � �set_new_name_levels(0,43)
�$ �close_window(Chandle%)
��
5� game%>0 � icon%<>51 � icon%<63 � startOwn%=-1 �
� reset% �
: � ownsum%(NameNo%)=0 � �set_sum � �set_up_sum_window
�
*
4- � (icon%=32 � icon%=33) � mode%(no%)=1 �
>! �change_help_display(help%)
H! � game%>0 � �remove_message
R �
\
f] � (icon%=45 � icon%=48) � Owin%=0 � ș"Wimp_ForceRedraw",handle%(game%),0,-844,1280,-150
p�
z�
�
�
�� �set_delete_icon(no%)
�� n%
�;� n%=1 � 2:�delete_icon(handle%(n%),3,(calc%(no%)=0)):�
�@� game% � ș"Wimp_ForceRedraw",handle%(game%),450,-150,600,0
��
�
�
�� �set_next(no%)
�+next%(no%)=-�icon_selected(Chandle%,46)
�,�set_top_icon(5,(next%(no%)=1 � try%>0))
�!� marked%=-1 � next%(no%)=0 �
correct%=0
3 � quest%<no_quest%(no%) � �set_sum � �game_end
�
$�
.
8
B� �set_keep_results(no%)
L,saveR%(no%)=-�icon_selected(Chandle%,61)
V� svR%=saveR%(no%) � �
`+� saveR%(no%)=0 � newR%=0 � �end_levels
jnewR%=saveR%(no%)
t�
~
�
�� �set_estimate(no%)
�/estimate%(no%)=-�icon_selected(Chandle%,45)
�B� estimate%(no%)=0 � SCformat%=1 � sum%=0:Estval%=0:dig3$()=""
�D� sum%=0 � force5%=0 � SCformat%=2-estimate%(no%):message$(1)=""
�;� game%>0 � �shade_icon(handle%(game%),2,(SCformat%=1))
��
�
�
�� �set_decimal
�.decimal%(no%)=-�icon_selected(Chandle%,62)
�*� decimal%(no%) � �set_dec_levels(no%)
� �window_open(Ohandle%) �
H $Osum1buff%=�set_dec($Osum1buff%):$Osum2buff%=�set_dec($Osum2buff%)
4 �reset_icon(Ohandle%,3):�reset_icon(Ohandle%,4)
�
(�
2
<
F� �set_printer(no%)
P7printer%(no%)=-�select_display(43,-printer%(no%),7)
ZH�shade_icon(SChandle%,11,(printer%(no%)=0 � driver%=0 � enprint%=0))
dA�set_top_icon(7,(printer%(no%)=1 � driver%=-1 � enprint%=-1))
n�
x
�
�*� �shade_3icons(whandle%,ihandle%,sh%)
�� n%
�� n%=ihandle% � ihandle%+2
�! �shade_icon(whandle%,n%,sh%)
��
��
�
�
�� �set_auto(no%)
�� n%
�+auto%(no%)=-�icon_selected(Chandle%,49)
�-�shade_3icons(Chandle%,53,(auto%(no%)=0))
-�shade_3icons(Chandle%,57,(auto%(no%)=0))
�
"
,� �set_autohelp(no%)
6� n%
@@�shade_3icons(Chandle%,37,(mode%(no%)=0 � autohelp%(no%)=0))
J�reset_help_level(no%)
T�
^
h
r� �reset_help_level(no%)
|� autohelp%(no%) �
�# � Hlevel%(no%)<MHlevel%(no%) �
�7 Hlevel%(no%)=MHlevel%(no%):$Hbuff%=�MHlevel%(no%)
� Helplev%=Hlevel%(no%)
� �reset_icon(Chandle%,31)
� �
��
�6 MHlevel%(no%)=Hlevel%(no%):$MHbuff%=�Hlevel%(no%)
��
��
�
�
�*� �select_display(icon%,var%,topicon%)
�'var%=�icon_selected(Chandle%,icon%)
�set_top_icon(topicon%,var%)
=var%
&
0"� �select_operators(icon%,no%)
:$� PrevOp%:PrevOp%=operator%(no%)
DKoperator%(no%)=-�icon_selected(Chandle%,2)-2*�icon_selected(Chandle%,3)
N3� operator%(no%)=0 � �select_icon(Chandle%,2,1)
X#BothOp%(no%)=(operator%(no%)=3)
b
l*� BothOp%(no%)=-1 � operator%(no%)=0 �
vA � ownsum%(no%)=0 � operator%(no%)=1 � operator%(no%)=PrevOp%
��
�J� ownsum%(no%)=0 � �shade_op_levels(no%) � �set_own_sum_operators(no%)
��set_carry_variableY
�
�� �window_open(Ohandle%) �
�- � operator%(no%)=1 � sgn$="+" � sgn$="-"
�, $Osgnbuff%=sgn$:�reset_icon(Ohandle%,5)
��
�
�� game%>0 �
�" �close_window(handle%(game%))
�% � game%>0 � game%=operator%(no%)
�F � Owin%=0 � PrevOp%=operator%(no%) � �open_window(handle%(game%))
6 � �window_open(Ohandle%) � �open_window(Ohandle%)
6 � �window_open(Chandle%) � �open_window(Chandle%)
�
�
*
4
>!� �set_own_sum_operators(no%)
H,�shade_icon(Ohandle%,7+operator%(no%),0)
R<�shade_icon(Ohandle%,10-operator%(no%),(BothOp%(no%)=0))
\.�select_icon(Ohandle%,10-operator%(no%),0)
f.�select_icon(Ohandle%,7+operator%(no%),-1)
pownOp%=operator%(no%)
z�
�
�
�� �adjust_for_mode(no%)
�� n%
�-�shade_3icons(Chandle%,31,(mode%(no%)=0))
�@�shade_3icons(Chandle%,37,(mode%(no%)=0 � autohelp%(no%)=0))
�+�shade_icon(Chandle%,50,(mode%(no%)=0))
�+�shade_icon(Chandle%,34,(mode%(no%)=0))
�� mode%(no%)=0 �
�1 autohelp%(no%)=0:�select_icon(Chandle%,50,0)
�. force%(no%)=0:�select_icon(Chandle%,34,0)
� message$()=""
��
�
$� �reset_game
.� n%,m%
8aquest%=0:try%=0:CorrectAns%=0:sesstime%=�:stopped%=0:Pcount%=-1:AnumRW%=0:SnumRW%=0:force5%=0
B� ownsum%(NameNo%)=0 �
L
�set_sum
V�
`j � decimal%(NameNo%)=0 � $Osum1buff%="1000":$Osum2buff%="100" � $Osum1buff%="10.00":$Osum2buff%="1.00"
j �set_up_sum_window
t�
~�
�
�
�� �set_sum
��dig1$()="":dig2$()="":dig3$()="":carry$()="":car_dig%()=(operator%(NameNo%)=2):strike$()="":nextdig%=0:rubdig%=-1:message$()="":initx%=0:inity%=0:initnum%=0:nexterr%=anslim%:Cdone%()=0:STdone%()=0:correct%=0
�Fsum%=0:drag%=0:rubber%=0:marked%=0:double%=0:Psave%=0:nextcheck%=0
�Hcarry%=0:strike%=0:reduce%=0:Bstep%=0:SCformat%=2-estimate%(NameNo%)
�'� force5%=-1 � SCformat%=2 � try%=0
�<nextmess%=-(Helplev%=5 � mode%(NameNo%)=1 � SCformat%=2)
��set_top_icon(0,0)
��set_top_icon(1,-1)
��shade_item(menu%,2,1)
�
� force5%<>-1 �
� BothOp%(NameNo%) �
� ownsum%(NameNo%)=0 �
! PrevOp%=operator%(NameNo%)
(? operator%(NameNo%)=2+(quest%+1<=no_quest%(NameNo%)/2+.5)
2 �
<8 game%=operator%(NameNo%):Helplev%=Hlevel%(NameNo%)
F �set_carry_variableY
P � PrevOp%<>game% �
Z& �close_window(handle%(PrevOp%))
d �switch_window(game%)
n8 � �window_open(Chandle%) � �open_window(Chandle%)
x �
� �
� � ownsum%(NameNo%)=0 �
�K � game%=1 � �make_add(Alevel%(NameNo%)) � �make_sub(Slevel%(NameNo%))
� �
��
�
��digits(num1%,dig1$())
��digits(num2%,dig2$())
��digits(ans%,answer$())
��carry_positions:PrevOp%=0
��set_top_icon(5,0)
�B�set_top_icon(2,(SCformat%=2 � mode%(NameNo%)=1 � Helplev%>0))
��close_window(P2handle%)
8ș"Wimp_ForceRedraw",handle%(game%),0,-675,1280,-150
�
"
,� �set_carry_variableY
68� operator%(NameNo%)=1 � ycar%=y3%-44 � ycar%=y1%+48
@�
J
T
^� �place_estimate
h5� sumx1%,sumx2%,st2%,x%,y%,symbol$,power%:y%=-596
r=� operator%(NameNo%)=1 � symbol$="plus" � symbol$="minus"
|'st2%=825-75*� � num2%:symb%=st2%-75
�sumx1%=symb%-373:sumx2%=452
�ș"Wimp_SetColour",7
�� pos%=0 � 4
� x1%=�printdigx(sumx1%,pos%)
� x2%=�printdigx(sumx2%,pos%)
�e � dig1$(pos%)<>"" � ș"OS_SpriteOp",&134,sarea%,"n"+dig1$(pos%),ox%+x1%,oy%+y%,0,scale27%,trans%
�e � dig2$(pos%)<>"" � ș"OS_SpriteOp",&134,sarea%,"n"+dig2$(pos%),ox%+x2%,oy%+y%,0,scale27%,trans%
�
� � colname%(NameNo%) �
�B x%=�printdigx(902,pos%)+19+14*(pos%=4 � decimal%(NameNo%)=0)
�) power%=pos%+2*(decimal%(NameNo%)=1)
�P ș"OS_SpriteOp",&134,sarea%,"dig"+�power%,ox%+x%,oy%+y%+88,0,scale%,trans%
� �
�
� decimal%(NameNo%) �
[ ș"OS_SpriteOp",&134,sarea%,"decpoint",ox%+�printdigx(sumx1%,2),oy%+y%,8,scale%,trans%
&[ ș"OS_SpriteOp",&134,sarea%,"decpoint",ox%+�printdigx(sumx2%,2),oy%+y%,8,scale%,trans%
0X ș"OS_SpriteOp",&134,sarea%,"decpoint",ox%+�printdigx(902,2),oy%+y%,8,scale%,trans%
:�
DJș"OS_SpriteOp",&134,sarea%,symbol$,ox%+symb%+2,oy%+y%,0,scale%,trans%
NGș"OS_SpriteOp",&134,sarea%,"equals",ox%+827,oy%+y%,0,scale%,trans%
XMș"OS_SpriteOp",&134,sarea%,"equals2",ox%+1052,oy%+y%+150,0,scale%,trans%
b!ȓ Ȑ ox%+900,oy%+y%-12,375,8
l�
v
�
�� �set_format2
�.EstVal%=sum%:sum%=0:dig3$()="":SCformat%=2
�#�shade_icon(handle%(game%),2,0)
�� Helplev%=5 � nextmess%=-1
�8ș"Wimp_ForceRedraw",handle%(game%),0,-675,1280,-150
��
�
�
�� �icon_selection
�� icon%:icon%=block%!16
�� Owin%=-1 � icon%<>6 � �
�Ȏ icon% �
!P � 0:� SCformat%=1 � �set_format2 � � correct%=0 � nextcheck%=0 � �check_sum
!Q � 1:� rubber%=0 � �set_up_rub_out � �replace_number(10):rubber%=0:*POINTER 1
! � 2:�message("?")
! n � 3:� �window_open(Chandle%)=0 � $CCbuff%="0":CCsum=0:CCnum=0:CCop%=0:CCprev%=0:�reset_icon(CChandle%,17)
!*3 CChandle%=�centre_window(CChandle%,"Y")
!4; ș"Wimp_SetCaretPosition",CChandle%,-1,0,0,0,-1
!> � 4:�show_score("")
!HT � 5:� printer%(NameNo%)=1 � driver%=-1 � correct%=0 � Psave%=0 � �save_sum("S")
!R force5%=0
!\$ � marked%=0 � quest% +=1
!f) � quest%<no_quest%(NameNo%) �
!pP � auto%(NameNo%)=1 � ownsum%(NameNo%)=0 � �new_auto_level(correct%)
!zA � ownsum%(NameNo%)=0 � �set_sum � �set_up_sum_window
!�
�
!� �game_end
!�
�
!�E � 6:SThandle%=�relative_window(handle%(game%),SThandle%,450,556)
!�u � 7:� printer%(NameNo%)=1 � Psave%=0 � �save_sum("S"):Phandle%=�relative_window(handle%(game%),Phandle%,900,406)
!�4 � 8,9,10,11,12,13,14,15,16,17,38:� double%=-1 �
!�D � mode%(NameNo%)=1 � �place_double_click
!� �
!�j � drag% � initnum%=icon%-8 � �replace_number(icon%-8) � �select_digit(icon%-8)
!� �
!�. � 18,19,20,21,22,28,29,30,31,32:� drag% �
!�N � rubber%=0 � �place_number(icon%) � �rub_out(icon%)
!� �
". �remove_digit(icon%)
" �
"\ � 23,24,25,26:� operator%(NameNo%)=1 � �carry_pos(icon%-22) � �strike_through(icon%-22)
"$C � 33,34,35,36,37:� operator%(NameNo%)=2 � �carry_pos(icon%-33)
".& � 27:� SCformat%=1 � �set_format2
"8�
"B�
"L
"V
"`� �carry_pos(icon%)
"j#� dragval%=30 � SCformat%=1 � �
"t
� drag% �
"~> � rubber%=0 � �place_carry(icon%) � �rub_out_carry(icon%)
"��
"� �remove_carry(icon%)
"��
"��
"�
"�
"�� �strike_through(icon%)
"�
� drag% �
"�l � double%=0 � strike$(icon%)="" � rubber%=0 � �place_strike(icon%) � � rubber% � �rub_out_strike(icon%)
"��
"� �remove_strike(icon%)
"��
# �
#
#
#� �select_digit(num%)
#(� x%,y%
#2"� rubber% � rubber%=0:*POINTER
#<!� mode%(NameNo%) � double%=-1
#FS� drag% � ș"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
#Pdragval%=num%:nextcheck%=0
#Z�pick_up_number
#d�
#n
#x
#�� �remove_digit(icon%)
#�&� x%,Y3%,Mode%,flg%,dig%:rubber%=0
#�+Mode%=-(mode%(NameNo%)=1 � SCformat%=2)
#�
#�� SCformat%=2 �
#� dig%=icon%-18:Y3%=y3%
#�# x%=�digx(dig%):flg%=(icon%>26)
#��
#�+ dig%=icon%-28:Y3%=-596:flg%=(icon%<28)
#� x%=�printdigx(902,dig%)
#��
#�� flg% � �
#�
$� dig3$(dig%)="" � �
$)dragval%=� dig3$(dig%):dig3$(dig%)=""
$sum% -=dragval%*10^dig%
$";ș"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75
$,9� Mode%=1 � dig%<nextdig% � �delete_current_box(dig%)
$6�pick_up_number
$@'� message$(0)<>"" � �remove_message
$J%nextmess%=-(Helplev%=5 � Mode%=1)
$T!� sum%=0 � �set_top_icon(0,0)
$^�
$h
$r
$|� �delete_current_box(dig%)
$�� x%,Y3%,h%,olddig%
$�"� Clears box in next position.
$�T� rubdig%>-1 � dig%<rubdig% � olddig%=rubdig% � � rubdig%=-1 � olddig%=nextdig%
$�� olddig%=0 � �
$�
$�H� operator%(NameNo%)=2 � carry%=-1 � olddig%<>rubdig% � Helplev%>2 �
$� � strike%=0 �
$�# �carry_redraw(olddig%,Bstep%)
$� �
$�$ �strike_redraw(olddig%,Bstep%)
$� �
$��
$�Q � operator%(NameNo%)=1 � �dig_carry_redraw(olddig%) � �digit_redraw(olddig%)
%�
%rubdig%=dig%
%�
%&
%0
%:� �pick_up_number
%D� w%,h%
%N:� rubber%=0 � w%=18-3*(dragval%=30):h%=22 � w%=6:h%=12
%X x%=!block%-w%:y%=block%!4-h%
%b-�work_area_origin(handle%(game%),ox%,oy%)
%l,dragx%=x%+4-ox%:dragy%=y%+8-oy%:drag%=-1
%v1initx%=dragx%:inity%=dragy%:initnum%=dragval%
%��move_number
%��
%�
%�
%�� �rub_out_strike(dig%)
%�� x%,y%
%�� strike$(dig%)="" � �
%�strike$(dig%)=""
%��strike_redraw(dig%,0)
%��
%�
%�
%�� �remove_strike(dig%)
&� strike$(dig%)="" � �
&�rub_out_strike(dig%)
&dragval%=30
& �pick_up_number
&*�
&4
&>
&H� �set_up_rub_out
&RS� drag% � ș"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
&\dragval%=10:rubber%=-1
&f*POINTER 0
&p�pick_up_number
&z�
&�
&�
&�� �rub_out(icon%)
&�� x%,Y3%,Mode%,flg%,dig%
&�+Mode%=-(mode%(NameNo%)=1 � SCformat%=2)
&�
&�� SCformat%=2 �
&�" dig%=icon%-18:flg%=(icon%>26)
&� Y3%=y3%:x%=�digx(dig%)
&��
&�" dig%=icon%-28:flg%=(icon%<28)
&�% Y3%=-596:x%=�printdigx(902,dig%)
&��
'� flg% � �
'� dig3$(dig%)="" � �
'
'$sum% -=�dig3$(dig%)*10^dig%
'.5dig3$(dig%)="":nextmess%=-(Helplev%=5 � Mode%=-1)
'8;ș"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75
'B9� Mode%=1 � dig%<nextdig% � �delete_current_box(dig%)
'L!� sum%=0 � �set_top_icon(0,0)
'V'� message$(0)<>"" � �remove_message
'`%nextmess%=-(Helplev%=5 � Mode%=1)
'j�
't
'~
'�� �check_rubout
'�� n%:n%=rubdig%
'��
'� n% +=1
'�-� dig3$(n%)="" � n%=nextdig% � n%=anslim%
'�,� dig3$(n%)="" � n%<nextdig% � =n% � =-1
'�
'�
'�� �place_carry(pos%)
'�4� x%,x2%,h%,valid%,digcase%:double%=0:digcase%=0
'�
'�rvalid%=(pos%=nextdig%+Bstep% � carry%=-1 � strike%=0 � Cdone%(pos%)=-1 � Helplev%<=2 � pos%<=anslim% � try%>0)
( 4� mode%(NameNo%)=1 � valid%=0 � �message("pl"):�
(
S� mode%(NameNo%)=1 � Helplev%=5 � �check_dig_val(pos%,"c")=0 � �message("ck"):�
(m� mode%(NameNo%)=0 � (pos%>anslim% � operator%(NameNo%)=1 � pos%>�quest_limit � operator%(NameNo%)=2) � �
(
((\� message$(1)<>"" � mode%(NameNo%)=1 � �(Helplev%=5 � Cdone%(pos%)=-1) � �remove_message
(2~nextmess%=-(Helplev%=5 � nextdig%<=anslim% � mode%(NameNo%)=1 � (Cdone%(pos%)=0 � Cdone%(pos%)=-1 � �carry_2dig(pos%)=-1))
(<
(FIș"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
(P
(ZS� operator%(NameNo%)=2 � � carry$(pos%)=1 � dragval%=1 � �carry_2dig(pos%)=-1 �
(d" carry$(pos%)="1"+carry$(pos%)
(n> � Cdone%(pos%)=-1 � pos%=nextdig%+Bstep% � Cdone%(pos%)=0
(x�
(� carry$(pos%)=�dragval%
(��
(�
(�drag%=0
(��carry_redraw(pos%,0)
(�K� Helplev%=2 � st_dig%(pos%)=1 � strike$(pos%)="" � Cdone%(pos%)=-1 � �
(�Cdone%(pos%)=-1
(�
(�/� mode%(NameNo%)=1 � operator%(NameNo%)=2 �
(�? � pos%=nextdig% � reduce%=0:carry%=0:� Triggers next digit
(�L � �carry_2dig(pos%)=-1 � �carry$(pos%)=1 � Helplev%=2 � pos%=nextdig% �
(�O � strike$(pos%+1)="/" � digcase%=-1 � �count_steps:pos%=nextdig%+Bstep%+1
(� Bstep% +=1:reduce%=-1
) �
)�
)
)"/� mode%(NameNo%)=1 � pos%=nextdig%+Bstep% �
), � Cdone%(pos%)=-1
)6 � operator%(NameNo%)=1 �
)@0 � Helplev%>2 � �dig_carry_redraw(nextdig%)
)J � pos%=nextdig% � carry%=0
)T �
)^ � reduce%=-1 �
)h" reduce%=digcase%:Bstep% -=1
)rC � strike$(nextdig%+Bstep%)="" � st_dig%(nextdig%+Bstep%)=1 �
)| strike%=-1:carry%=-1
)�6 � Helplev%>2 � �strike_redraw(nextdig%,Bstep%)
)� �
)� reduce%=0
)�; � Bstep%=0 � �carry$(nextdig%)=car_dig%(nextdig%) �
)�8 � Helplev%>2 � �digit_redraw(nextdig%):carry%=0
)� �
)�6 � Helplev%>2 � �carry_redraw(nextdig%,Bstep%)
)� �
)� �
)� �
)�- � Helplev%>2 � �digit_redraw(nextdig%)
)�" carry%=0:reduce%=0:Bstep%=0
)� �
* �
*�
*�
*&
*0
*:M� �carry_2dig(pos%)=car_dig%(pos%)>9 � car_dig%(pos%) � 10<>� dig1$(pos%)
*D
*N
*X!� �carry_posx(pos%,� x%,� h%)
*b� operator%(NameNo%)=1 �
*l x%=�digx(pos%)+37:h%=26
*v�
*� x%=�digx(pos%)-14:h%=35
*��
*��
*�
*�
*�� �remove_carry(pos%)
*�� x%,h%
*�� carry$(pos%)="" � �
*��split_carry(pos%,dragval%)
*��carry_redraw(pos%,0)
*�
rubber%=0
*�#ș"Wimp_GetPointerInfo",,block%
*��pick_up_number
+�move_number
+�
+
+
+* � �split_carry(pos%,� lift%)
+4� xco%,l$,r$:xco%=!block%
+>� � carry$(pos%)>1 �
+H. �work_area_origin(handle%(game%),ox%,oy%)
+R, l$=�carry$(pos%),1):r$=�carry$(pos%),1)
+\V � xco%-ox%<�digx(pos%)+14 � carry$(pos%)=r$:lift%=�l$ � carry$(pos%)=l$:lift%=�r$
+f�
+p lift%=�carry$(pos%)
+z carry$(pos%)=""
+��
+��
+�
+�
+�� �rub_out_carry(pos%)
+� � x%,h%,xco%,l%:xco%=!block%
+�� carry$(pos%)="" � �
+��split_carry(pos%,l%)
+��carry_posx(pos%,x%,h%)
+�?ș"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+42,ycar%+h%
+��
+�
+�
,� �grid
,� x%,y%
,ș"Wimp_SetColour",15
,$� x%=0 � 1275 � 75
,.& � ox%+x%,oy%-900:� ox%+x%,oy%-150
,8�
,B� y%=-900 � -150 � 75
,L# � ox%,oy%+y%:� ox%+1275,oy%+y%
,V�
,`� ox%,oy%:� ox%+1275,oy%
,j
,tJș"OS_SpriteOp",&134,sarea%,"numbers",ox%+75,oy%-825,0,scale27%,trans%
,~c� operator%(NameNo%)=2 � ș"OS_SpriteOp",&134,sarea%,"strike",ox%+900,oy%-825,0,scale27%,trans%
,��
,�
,�
,�� �sum_parts
,�5� x%,d%,dig$,shift%,x1%,symbol%,limQ%,lim%,level%
,�,anslim%=�answer_limit:limQ%=�quest_limit
,�symbol%=�digx(limQ%)-75
,�
,�ș"Wimp_SetColour",7
,�@� operator%(NameNo%)=1 � x%=�digx(anslim%) � x%=�digx(limQ%)
,�$ȓ Ȑ ox%+x%,oy%+y3%+63,450-x%,8
,�$ȓ Ȑ ox%+x%,oy%+y3%-12,450-x%,8
-
-
� operator%(NameNo%)=1 �
-K ș"OS_SpriteOp",&134,sarea%,"plus",ox%+symbol%,oy%+y2%,0,scale%,trans%
-�
-(L ș"OS_SpriteOp",&134,sarea%,"minus",ox%+symbol%,oy%+y2%,0,scale%,trans%
-2�
-<
-F� colname%(NameNo%) �
-P7 � operator%(NameNo%)=1 � lim%=anslim% � lim%=limQ%
-Z � d%=0 � lim%
-d5 x%=�digx(d%)+19+14*(d%=4 � decimal%(NameNo%)=0)
-n' power%=d%+2*(decimal%(NameNo%)=1)
-xN ș"OS_SpriteOp",&134,sarea%,"dig"+�power%,ox%+x%,oy%+y0%,0,scale%,trans%
-� �
-��
-�
-��
-�
-�
-�� �digx(d%)=77+75*(4-d%)
-�
-�
-�� �sum_numbers
-�� d%,x%,y%
-�� d%=0 � 4
-� x%=�digx(d%)
.c � dig1$(d%)<>"" � ș"OS_SpriteOp",&134,sarea%,"n"+dig1$(d%),ox%+x%+2,oy%+y1%,0,scale27%,trans%
.c � dig2$(d%)<>"" � ș"OS_SpriteOp",&134,sarea%,"n"+dig2$(d%),ox%+x%+2,oy%+y2%,0,scale27%,trans%
.j � dig3$(d%)<>"" � ș"OS_SpriteOp",&134,sarea%,"move"+dig3$(d%),ox%+x%+19,oy%+y3%+12,8,scale27%,trans%
."
., � operator%(NameNo%)=1 �
.6k � carry$(d%)<>"" � ș"OS_SpriteOp",&134,sarea%,"carry"+carry$(d%),ox%+x%+37,oy%+ycar%,0,scale%,trans%
.@ �
.Je � strike$(d%)="/" � ș"OS_SpriteOp",&134,sarea%,"move30",ox%+x%+16,oy%+y1%+15,8,scale27%,trans%
.T � d%>0 �
.^? � carry$(d%-1)<>"" � �print_carry_dig(�digx(d%-1),d%-1)
.h@ � d%=4 � carry$(d%)<>"" � �print_carry_dig(�digx(d%),d%)
.r �
.| �
.��
.�
.�� decimal%(NameNo%) �
.� � y%=y1% � y3% � -75
.�Q ș"OS_SpriteOp",&134,sarea%,"decpoint",ox%+�digx(2)+4,oy%+y%,8,scale%,trans%
.� �
.��
.��
.�
.�
.�� �sum_numbers_est
.�� d%,x%
.�� d%=0 � 4
/ x%=�printdigx(902,d%)
/g � dig3$(d%)<>"" � ș"OS_SpriteOp",&134,sarea%,"move"+dig3$(d%),ox%+x%+19,oy%-584,8,scale27%,trans%
/�
/&�
/0
/:
/D� �print_carry_dig(x%,d%)
/N� n$
/X� � carry$(d%)=1 �
/bX ș"OS_SpriteOp",&134,sarea%,"carry"+carry$(d%),ox%+x%-5,oy%+ycar%+4,8,scale%,trans%
/l�
/v n$=�carry$(d%),1)
/�O ș"OS_SpriteOp",&134,sarea%,"carry1",ox%+x%-12,oy%+ycar%+4,8,scale%,trans%
/�N ș"OS_SpriteOp",&134,sarea%,"carry"+n$,ox%+x%,oy%+ycar%+4,8,scale%,trans%
/��
/��
/�
/�
/�� �make_add(level%)
/�� f%,s%
/�Ȏ level% �
/�
� 1:�
/�# f%=�(80)+10:s%=�(10)-1
/�$ � f%+s%<�((f%+10)/10)*10
/�
� 2:�
0$ f%=�(80)+10:s%=�(80)+10
0F � ((�((f%+10)/10)*10)+(�(s%/10)*10)>(f%+s%)) � (f%+s%)<100
0 � 3:f%=�(80)+10:s%=�(9)
0
� 4:�
0*$ f%=�(80)+10:s%=�(80)+10
04 � f%+s%<100
0> � 5:f%=�(80)+10:s%=�(80)+10
0H$ � 6:f%=�(800)+100:s%=�(800)+100
0R& � 7:f%=�(8000)+100:s%=�(8000)+100
0\�
0f� s%=0 �
0p s%=1
0z � f% � 10=9 � f% -=1
0��
0� num1%=f%:num2%=s%:ans%=f%+s%
0��
0�
0�
0�� �results_sum
0�1� st$,op$,down%,num1$,num2$,ans$,fill$,fill2$
0�9down%=1-(newR%=1):Rcnt% +=down%:notsavedR%=-1:newR%=0
0�� decimal%(NameNo%) �
0� num1$=�insert_point(�num1%)
0� num2$=�insert_point(�num2%)
0� ans$=�insert_point(�ans%)
0��
1) num1$=�num1%:num2$=�num2%:ans$=�ans%
1�
1
1$#fill$=�12-(�(num1$+num2$))," ")
1.fill2$=�6-� ans$," ")
18%� game%=1 � op$=" + " � op$=" - "
1BJst$=" ("+�(quest%+1)+") "+num1$+op$+num2$+fill$+" = ("+ans$+")"+fill2$
1L&Rptr%=�add_string(Rptr%,st$,down%)
1V�
1`
1j
1t� �insert_point(num$)
1~� split%,left$,right$
1�� � num$>2 �
1� split%=� num$-2
1�( left$=�num$,split%):right$=�num$,2)
1��
1�( left$="0":right$=�2-�num$,"0")+num$
1��
1�=left$+"."+right$
1�
1�
1�� �make_sub(level%)
1�� f%,s%,a%,x%,f$,s$
1��
2 Ȏ level% �
2
� 1:�
2$ f%=�(80)+10:s%=�(10)-1
2" � f%-s%>(�(f%/10)*10)
2( � 2,3:f$="":s$=""
22 � x%=1 � level%
2< �
2F& f%=�(10)-1:s%=�(10)-1
2P � f%>s%
2Z# f$=f$+�f%:s$=s$+�s%
2d �
2n f%=�(f$):s%=�(s$)
2x � 4:�subsub(3,1,0)
2� � 5:�subsub(3,2,0)
2� � 6:�subsub(4,3,0)
2� � 7:�subsub(4,3,1)
2� � 8:�subsub(4,3,2)
2� � 9:�subsub(5,4,3)
2� � 10:f%=�(80)+10:s%=�(9)
2� �
2�
� s%>0
2� num1%=f%:num2%=s%:ans%=f%-s%
2��
2�
2�
2�� �subsub(len%,dec%,zeros%)
3� x%
3f$="":s$="":z%=0
3� x%=1 � len%
3" f%=�(10)-1:s%=�(10)-1
3,. � x%>dec% �:f%=�(10)-1:s%=�(10)-1:� f%>s%
362 � x%=dec%+1 �:f%=�(10)-1:s%=�(10)-1:� f%>s%+1
3@# � x%<len% � � �(6)<zeros% f%=0
3J � f%=0 � x%>1 �
3T z% +=1
3^ � z%>zeros% f%=�(9)
3h �
3r f$=�f%+f$:s$=�s%+s$
3|�
3�f%=�(f$):s%=�(s$)
3��
3�
3�
3�� �digits(num%,dig$())
3�� d%
3�� d%=0 � 4
3�3 � num%>0 � dig$(d%)=�(num% � 10) � dig$(d%)=""
3� num%=num% � 10
3��
3�4� decimal%(NameNo%)=1 � dig$(2)="" � dig$(2)="0"
3��
3�
4
4� �find_error
4� x%
4&� nexterr%>=nextdig% � �
40�
4:nexterr% +=1
4D<� dig3$(nexterr%)<>answer$(nexterr%) � nexterr%=nextdig%
4N
4X� nexterr%<nextdig% �
4b( � rubdig%>-1 � x%=�digx(rubdig%)+10
4l< ș"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75
4v* rubdig%=nexterr%:x%=�digx(rubdig%)+10
4�< ș"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75
4��
4��
4�
4�
4�� �null_event
4�� drag% � �move_number
4�J� �-sesstime%>timelim%(NameNo%)*6000 � Notimer%(NameNo%)=0 � game%>0 �
4�> message$(1)="Time's up":message$(2)="":�7:�font_to_screen
4� �pause(400):�game_end
4��
4�B� drawfont% � �font_to_screen:�message_sprite_back:drawfont%=0
4�F� nextmess% � �pause(100*(nextmess%-1)):�message("pr"):nextmess%=0
55� printer%(NameNo%)=1 � driver%=0 � enprint%=-1 �
5 driver%=�ensure_Pdriver
5@ � driver% � �set_top_icon(7,-1):�shade_icon(SChandle%,11,0)
5 �
5*N� �window_open(Lhandle%)=-1 � create%=-2 � �loadbox_windows(-1):create%=-1
54:� �-TLtime%>1000 � �close_window(Thandle%):TLtime%=1E7
5>�
5H
5R
5\� �move_number
5f&� x%,y%,x1%,x2%,y1%,y2%,w%,h%,flg%
5p#ș"Wimp_GetPointerInfo",,block%
5z
5�� rubber% �
5�, w%=75:h%=75:x%=!block%-6:y%=block%!4-12
5��
5�A w%=36-6*(dragval%=30):h%=44:x%=!block%-w%/2:y%=block%!4-h%/2
5��
5�
5�-�work_area_origin(handle%(game%),ox%,oy%)
5�x% -=ox%:y% -=oy%
5�
5�,� rubber%=-1 � (y%>-266 � dragy%>-266) �
5�@ ș"OS_SpriteOp",&13C,sarea%,"backtop1",1 � r0%,r1%,r2%,r3%
5�4 ș"OS_SpriteOp",&134,sarea%,"top1",0,0,0,-1,-1
5�D ș"OS_SpriteOp",&134,sarea%,"move10",x%-150,844+y%-694,8,-1,-1
61 ș"OS_SpriteOp",r0%,r1%,r2%,r3%:flg%=-1:�26
6�
6)� �(x%-dragx%)<4 � �(y%-dragy%)<8 � �
6$
6.=� x%>dragx% � x2%=x%+w%:x1%=dragx% � x2%=dragx%+w%:x1%=x%
68=� y%>dragy% � y2%=y%+h%:y1%=dragy% � y2%=dragy%+h%:y1%=y%
6Bdragx%=x%:dragy%=y%
6L;� �(initx%-dragx%)>12 � �(inity%-dragy%)>12 � double%=0
6V
6`� rubber% �
6j, cond%=-((x2%<170 � x1%>285) � y1%>-165)
6t0 � x%<0 � x%>1276 � y%<-844 � y%>0 � cond%=1
6~ � "POINTER "+� cond%
6��
6�
6�� y2%>-150 �
6� � y1%>-150 � y1%=-150
6� � y2%>-150 � y2%=-150
6��
6�R� �(y1%=-150 � y2%=-150) � ș"Wimp_ForceRedraw",handle%(game%),x1%,y1%,x2%,y2%
6�
6�� flg% �
6�. �work_area_origin(handle%(game%),ox%,oy%)
6�7 flg%=�update_window(handle%(game%),152,-150,300,0)
6� ȕ flg%
7 L ș"OS_SpriteOp",&134,sarea%,"backtop1",ox%+150,oy%-146,0,scale%,trans%
7
* ș"Wimp_GetRectangle",,block% � flg%
7 �
7F � y1%<-146 � ș"Wimp_ForceRedraw",handle%(game%),x1%,y1%,x2%,-146
7(�
72�
7<
7F
7P� �place_number(ICdrag%)
7Z<� x%,y%,Y3%,dig%,Mode%,flg%,valid%,range%,Dig%:valid%=-1
7d4� game%=1 � range%=anslim% � range%=�quest_limit
7n*Mode%=(mode%(NameNo%)=1 � SCformat%=2)
7x� dragval%=30 � �
7�check%=-1:double%=0
7�Iș"Wimp_ForceRedraw",handle%(game%),dragx%,dragy%,dragx%+75,dragy%+75
7�4� message$(1)<>"" � Helplev%<5 � �remove_message
7�-�work_area_origin(handle%(game%),ox%,oy%)
7�
7�� SCformat%=2 �
7� dig%=ICdrag%-18:Y3%=y3%
7�% x%=�digx(dig%):flg%=(ICdrag%>26)
7��
7� dig%=ICdrag%-28:Y3%=-596
7�. x%=�printdigx(902,dig%):flg%=(ICdrag%<28)
7��
7�� flg% � �
8
8�� Mode%=-1 � SCformat%=2 � valid%=((dig%<=nextdig% � game%=1 � Helplev%=0 � dig%<=range% � game%=2 � nextdig%=anslim%+1 � dig%<=range%) � (carry%=0 � carry%=-1 � (Helplev%<3 � rubdig%>-1)))
8!� valid%=0 � �message("pl"):�
8"-� Mode%=0 � SCformat%=2 � dig%>range% � �
8,
86<� Mode%=-1 � Helplev%=5 � �check_dig_val(dig%,"ans")=0 �
8@0 � rubdig%=-1 � Dig%=nextdig% � Dig%=rubdig%
8J2 � dig%=Dig% � �message("ck") � �message("pr")
8T flg%=-1
8^�
8h� flg% � �
8r
8|J� Mode%=-1 � Helplev%>0 � �check_sum_type(dig%)<>0 � �message("sum"):�
8�
8� dragx%=0:dragy%=-825:drag%=0
8�
8�3� dig3$(dig%)<>"" � sum% -=�dig3$(dig%)*10^dig%
8�dig3$(dig%)=�dragval%
8�sum% +=dragval%*10^dig%
8�
8�L ș"Wimp_ForceRedraw",handle%(game%),x%,Y3%,x%+75,Y3%+75:� Current digit
8�% � dig%<nextdig% � rubdig%=-1 � �
8�
8�� Mode%=-1 �
8�5 � dig%=nextdig% � nextdig% -=(nextdig%<=anslim%)
8�Z � car_dig%(nextdig%)=(operator%(NameNo%)=2) � nextdig%<=anslim% � Cdone%(nextdig%)=-1
9\ � st_dig%(nextdig%)=0 � operator%(NameNo%)=2 � nextdig%<=anslim% � STdone%(nextdig%)=-1
95 � operator%(NameNo%)=1 � Helplev%=0 � �skip_over
9
9& � rubdig%=-1 �
90+ � operator%(NameNo%)=2 � �count_steps
9:j � car_dig%(nextdig%+Bstep%)>1-operator%(NameNo%) � carry$(nextdig%+Bstep%)="" � carry%=-1 � carry%=0
9D �
9N
9X � dig%=rubdig% �
9b rubdig%=�check_rubout
9l �
9v( � try%>0 � rubdig%=-1 � �find_error
9�
9�, �redraw_box_position(nextdig%,Helplev%)
9��
9�Inextmess%=-(Helplev%=5 � (nextdig%<=anslim% � rubdig%>-1) � Mode%=-1)
9�M� (try%<tries%(NameNo%) � force5%=-1) � SCformat%=2 � �set_top_icon(0,-1)
9��
9�
9�
9�� �skip_over
9�� Addition level 0
9�.ȕ dig3$(nextdig%)<>"" � nextdig%<=anslim%
9�nextdig% +=1
9��
:�
:
:
: &� �redraw_box_position(pos%,help%)
:*� operator%(NameNo%)=1 �
:4 �dig_carry_redraw(pos%)
:>�
:H) � carry%=-1 � rubdig%=-1 � help%>2 �
:R
:\ � strike% �
:f" �strike_redraw(pos%,Bstep%)
:p �
:z! �carry_redraw(pos%,Bstep%)
:� �
:�
:� �
:� �digit_redraw(pos%)
:� �
:��
:��
:�
:�
:�� �dig_carry_redraw(dig%)
:�� Addition
:�;� rubdig%>-1 � x%=�digx(rubdig%)+10 � x%=�digx(dig%)+10
:�Vș"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+75,ycar%+106:� Next digit or carry
;�
;
;
;$� �digit_redraw(dig%)
;.� Subtraction
;8;� rubdig%>-1 � x%=�digx(rubdig%)+10 � x%=�digx(dig%)+10
;BHș"Wimp_ForceRedraw",handle%(game%),x%,y3%,x%+75,y3%+75:� Next digit
;L�
;V
;`
;j � �carry_redraw(dig%,shift%)
;t� x%,h%
;~"�carry_posx(dig%+shift%,x%,h%)
;�Nș"Wimp_ForceRedraw",handle%(game%),x%,ycar%,x%+42,ycar%+h%+4:� Next carry
;��
;�
;�
;�!� �strike_redraw(dig%,shift%)
;�x%=�digx(dig%+shift%)+10
;�Iș"Wimp_ForceRedraw",handle%(game%),x%,y1%,x%+75,y1%+75:� Next strike
;��
;�
;�
;�� �count_steps
;�
� flg%
<