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