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