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 ;�� ;� <