Home » Archimedes archive » Zipped Apps » Atelier » !Atelier/Atelier
!Atelier/Atelier
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 » Zipped Apps » Atelier |
Filename: | !Atelier/Atelier |
Read OK: | ✔ |
File size: | F03F bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM> <Atelier$Dir>.Atelier 20REM By Simon Clay Copyright (c) Simon Clay, 1989 30: version$="1.01" 40 50 60ONERROR:PROCerror(ERR,REPORT$,ERL,TRUE) 70PROCinit 80ONERROR:PROCerror(ERR,REPORT$,ERL,FALSE):PROCreport 90PROCnormpoint 100IF FNokfile_at(start_file$,-1,start_t%) THEN t%=start_t%:start_t%=-1:PROCloadfile(start_file$,-1,t%) 110 120REPEAT 130SYS "Wimp_PollIdle",,q%,1E9 TO reason% 140PROCrespond(reason%) 150UNTILquit% 160PROCquit 170END 180 190DEFPROCrespond(reason%) 200PROCwaitpoint 210CASEreason%OF 220WHEN0: 230WHEN1: 240WHEN2:PROCopen(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28) 250WHEN3:PROCclosew(!q%) 260WHEN4: 270WHEN5: 280WHEN6:PROCmouse(!q%,q%!4,q%!8,q%!12,q%!16,q%!20) 290WHEN7:PROCenddrag 300WHEN8: 310WHEN9:PROCmenuselect 320WHEN10 330WHEN11 340WHEN12 350WHEN17,18:PROCumess1 360WHEN19:PROCumess2 370ENDCASE 380PROCnormpoint 390ENDPROC 400 410DEFPROCquit:PROCnormpoint 420IFFNdebug:PROCtidy:END 430$q%="TASK":SYS "Wimp_CloseDown",taskhandle%,!q% 440QUIT 450 460DEFPROCinit 470DIM q% 2500, workbuf% 100 480appl$="Atelier" 490PROCfindmos 500waiter%=0:PROCwaitpoint 510SYS "OS_GetEnv" TO SA$:IF MID$(SA$,7,5)="-quit" THEN testing=FALSE ELSE testing=TRUE 520PROCinit_at 530PROCcheckmos 540*fx229,1 550wimpsaved%=FALSE 560v%=FNinitwimp:IFv%<180:MODE12:PROCerr(2) 570quit%=FALSE:dialogue%=-1E9:stopreason%=-1 580ackpending%=FALSE:ackref%=-1 590dragreason%=-1:help$="" 600savereason%=-1 610PROCdefws:PROCdefmenus:PROCversion 620checkref%=-1 630as$="Are you sure ?" 640PROCbaricon 650REM find start bit 660start_file$="":start_t%=-1 670LOCAL ERROR 680ON ERROR LOCAL start_file$="":start_t%=-1:GOTO 820 690SYS "OS_GetEnv" TO r0,r1,r2 700A$="" 710IF ?r0<>0 THEN A$+=CHR$(?r0):r0+=1:GOTO 710 720IF INSTR(A$," ")<>0 THEN A$=MID$(A$,INSTR(A$," ")+1):GOTO 720 730IF A$<>"" THEN 740SYS "OS_File",5,A$ TO r0,r1,r2 750IF r0=1 THEN 760IF ((r2 AND &FFF00000)=&FFF00000) THEN start_t%=(r2 AND &FFF00)>>8 770start_file$=A$ 780ENDIF 790ENDIF 800ENDIF 810REM end start bit 820ENDPROC 830 840DEFPROCversion 850LOCALT$:T$=version$:IFNOTFNprod:T$+=" *UNFINISHED*" 860PROCseti(w_pinfo%,4,"v"+T$) 870ENDPROC 880 890DEFFNprod=MID$(version$,INSTR(version$,".")+1,1)="0" 900DEFFNdebug=NOTFNprod ANDINKEY-1ANDINKEY-2 910 920DEFFNinitwimp 930$q%="TASK":SYS "Wimp_Initialise",200,!q%,"Atelier"TO!q%,taskhandle% 940=!q% 950 960DEFPROCtidy 970PROCnormpoint 980VDU4:PRINTTAB(0,2);:*fx4 990*fx225,1 1000*fx229 1010ONERROR:REPORT:PRINT" ";ERL:END 1020ENDPROC 1030 1040DEFPROCbaricon 1050!q%=-1:q%!4=0:q%!8=0:q%!12=64:q%!16=68 1060q%!20=%11000000000010:$(q%+24)="!Atelier" 1070SYS"Wimp_CreateIcon",,q%TObaricon% 1080ENDPROC 1090 1100DEFPROCerror(err%,err$,erl%,quit%) 1110PROCnormpoint:dragreason%=-1:@%=&90A:*fx229,1 1120LOCALi%,e%,t$,T$ 1130IFFNdebug:err$+=" ("+STR$ERL+")" 1140LOCALERROR 1150ONERRORLOCAL:PROCerror(ERR,REPORT$,ERL,TRUE) 1160!q%=err%:$(q%+4)=err$:SYS"Wimp_ReportError",q%,1,appl$ 1170IFquit%:PROCquit 1180ENDPROC 1190 1200DEFPROCreport:IFFNdebug:VDU4:REPORT:PRINT" @ ";ERL:PROCtidy:END 1210ENDPROC 1220 1230DEFFNdir 1240LOCALT$:T$=FNArfVar(appl$+"$Dir") 1250IFT$="":T$="&.!"+appl$+"." 1260IFRIGHT$(T$)<>".":T$+="." 1270=T$ 1280 1290DEFFNArfVar(A$) 1300LOCALERROR 1310ONERRORLOCALIFERR=292:="":ELSERESTOREERROR:PROCerr(0) 1320SYS&23,A$,workbuf%,200,0,3TO,,L% 1330workbuf%?L%=13:=$workbuf% 1340 1350DEFPROCumess1 1360ref%=q%!8:task%=q%!4:IFtask%=taskhandle%:ENDPROC 1370mess%=q%!16 1380CASEmess%OF 1390WHEN0:PROCquit 1400WHEN1:PROCdatasaved 1410WHEN2:PROCsavedata 1420WHEN3:PROCdataload 1430WHEN4:ackpending%=FALSE 1440WHEN5:PROCdataopen 1450WHEN6: 1460WHEN7: 1470WHEN8:PROCprequit 1480WHEN9: 1490WHEN&502: 1500WHEN&400C0:PROCsubmenu(q%!20,q%!24,q%!28,q%+32) 1510ENDCASE 1520ENDPROC 1530 1540DEFPROCdataopen 1550LOCALs%,t% 1560file$=FNzts(q%+44):s%=q%!36:t%=q%!40 1570IFFNokfile_at(file$,s%,t%)PROCdataloadack:PROCloadfile(file$,s%,t%) 1580ENDPROC 1590 1600DEFPROCdataload 1610LOCALs%,t% 1620file$=FNzts(q%+44):s%=q%!36:t%=q%!40 1630IFFNokfile_at(file$,s%,t%)PROCdataloadack:PROCloadfile(file$,s%,t%) 1640ENDPROC 1650 1660DEFPROCdatasaved 1670LOCALs%,t% 1680file$=FNzts(q%+44):s%=q%!36:t%=q%!40 1690IFFNokfile_at(file$,s%,t%)PROCdatasaveack 1700ENDPROC 1710 1720DEFPROCtemplate(T$) 1730PROCtemplate1(T$,q%) 1740ENDPROC 1750 1760DEFPROCtemplate1(T$,q%) 1770LOCAL c%:$workbuf%=T$ 1780SYS "Wimp_LoadTemplate",,q%,curbuf%,endbuf%,-1,workbuf%TO,,curbuf%,,,,c% 1790IF c%=0 THEN ERROR 1,"Template '"+T$+"' not found" 1800ENDPROC 1810 1820DEFPROCdefws 1830LOCALI% 1840bufsz%=&1000 1850DIM buffer% bufsz%:curbuf%=buffer%:endbuf%=buffer%+bufsz% 1860SYS"Wimp_OpenTemplate",,FNdir+"AtFrm" 1870PROCtemplate("stopbox"):q%!64=1:SYS"Wimp_CreateWindow",,q%TOw_stop% 1880PROCtemplate("save"):q%!64=1:SYS"Wimp_CreateWindow",,q%TOw_save% 1890PROCtemplate("ProgInfo"):SYS"Wimp_CreateWindow",,q%TOw_pinfo% 1900SYS"Wimp_CloseTemplate" 1910free%=endbuf%-curbuf% 1920ENDPROC 1930 1940DEFPROCdefmenus 1950LOCALt$ 1960DIM mlist% 32,function% 51 1970bufsz%=&200 1980DIM menufree% bufsz%:menuptr%=menufree%:menuend%=menufree%+bufsz% 1990menustart%=menufree%:RESTORE+2 2000READt$:m_save%=FNcrmenu(t$) 2010DATA"#Save,Compressed Screen}w_save%,System Screen}w_save%,Super Compacted Screen}w_save%,Super Compacted Sprite}w_save%,System Sprite(s)}w_save%,Brush Shapes}w_save%,Patterns}w_save%" 2020READt$:m_main%=FNcrmenu(t$) 2030DATA"#Atelier,Info>w_pinfo%,Save>m_save%,Quit" 2040ENDPROC 2050 2060DEFPROCfront(h%,X%,Y%) 2070PROCgetw(h%) 2080IFX%>=0x1%+=X%-x0%:x0%=X% 2090IFY%>=0y1%+=Y%-y0%:y0%=Y% 2100PROCopen(h%,x0%,y0%,x1%,y1%,scx%,scy%,-1) 2110ENDPROC 2120 2130DEFPROCtop(h%) 2140PROCgetw(h%):PROCopen(h%,x0%,y0%,x1%,y1%,scx%,scy%,-1):ENDPROC 2150 2160DEFPROCopen(oh%,ox0%,oy0%,ox1%,oy1%,oscx%,oscy%,obh%) 2170LOCALO% 2180!q%=oh%:SYS"Wimp_GetWindowState",,q% 2190PROCwimpopen 2200ENDPROC 2210 2220DEFPROCwimpopen 2230!q%=oh%:q%!4=ox0%:q%!8=oy0%:q%!12=ox1%:q%!16=oy1% 2240q%!20=oscx%:q%!24=oscy%:q%!28=obh%:SYS"Wimp_OpenWindow",,q% 2250ENDPROC 2260 2270DEFPROCclosew(!q%) 2280LOCALI% 2290SYS"Wimp_CloseWindow",,q% 2300IF!q%=dialogue%:dialreason%=-1:dialogue%=-1 2310IFdialogue%>=0:PROCclosew(dialogue%) 2320CASE!q%OF 2330WHENw_stop%:stopreason%=-1 2340ENDCASE 2350ENDPROC 2360 2370DEFFNia(h%,i%):PROCgeti(h%,i%):PROCchkii:=q%!28 2380DEFFNva(h%,i%):PROCgeti(h%,i%):PROCchkii:=q%!32 2390DEFFNil(h%,i%):PROCgeti(h%,i%):PROCchkii:=q%!36 2400 2410DEFPROCchkii:IF(q%!24AND&100)=0ERROR1,"Icon not indirected" 2420ENDPROC 2430 2440DEFPROCgeti(h%,i%):!q%=h%:q%!4=i%:SYS"Wimp_GetIconState",,q%:ENDPROC 2450 2460DEFPROCstop(r%,T$,U$,T%) 2470dialreason%=r% 2480IFINKEY-3mi%=3:PROCmstop:ENDPROC 2490PROCseti(w_stop%,0,T$):PROCseti(w_stop%,1,U$) 2500PROCunselall(w_stop%):PROCdialogue(w_stop%) 2510dialreason%=r% 2520ENDPROC 2530 2540DEFPROCdialogue(h%) 2550LOCALX%,Y% 2560IFdialogue%>=0:PROCclosew(dialogue%) 2570PROCnomenu:PROCreadpointer:X%=mx%-200:Y%=my%-85 2580IFX%<0X%=0 2590IFY%<96Y%=96 2600dialogue%=h%:PROCfront(h%,X%,Y%):PROCsetct(h%,-1,-1) 2610ENDPROC 2620 2630DEFPROCreadpointer:LOCALq%:q%=workbuf% 2640SYS"Wimp_GetPointerInfo",,q% 2650mx%=!q%:my%=q%!4:mb%=q%!8:mh%=q%!12:mi%=q%!16 2660ENDPROC 2670 2680DEFFNdialogue 2690IFdialogue%>=0ANDmh%<>dialogue%THEN 2700PROCclosew(dialogue%) 2710ENDIF 2720=FALSE 2730 2740DEFPROCmouse(mx%,my%,mb%,mh%,mi%,mo%) 2750IFdragreason%>=0ORmb%>255:ENDPROC 2760IFFNdialogue:ENDPROC 2770CASEmb%OF 2780WHEN2:PROCmenu 2790WHEN1,4:PROCselect 2800WHEN16,64:PROCstartdrag 2810ENDCASE 2820ENDPROC 2830 2840DEFPROCseti(h%,i%,T$):T$=LEFT$(T$,FNil(h%,i%)):$FNia(h%,i%)=T$ 2850PROCiconupd(h%,i%):PROCgetct:IF!q%=h%ANDq%!4=i%:PROCsetct(h%,i%,LENT$) 2860ENDPROC 2870 2880DEFPROCiset(h%,i%,B%,E%):LOCALq%:q%=workbuf% 2890!q%=h%:q%!4=i%:q%!12=B%:q%!8=E%:SYS"Wimp_SetIconState",,q%:ENDPROC 2900 2910DEFPROCiconupd(h%,i%):PROCiset(h%,i%,0,0):ENDPROC 2920 2930DEFPROCreadblock(p%) 2940x0%=!p%:y0%=p%!4:x1%=p%!8:y1%=p%!12:REM physical area 2950scx%=p%!16:scy%=p%!20:bhandle%=p%!24:REM scroll offsets, stack depth 2960bx%=x0%-scx%:by%=y1%-scy%:REM calculate physical co-ords of logical area 2970ex0%=p%!40:ey0%=p%!44:ex1%=p%!48:ey1%=p%!52:REM logical area 2980gx0%=p%!24:gy0%=p%!28:gx1%=p%!32:gy1%=p%!36:REM graphics window 2990open%=(p%!28AND&10000)<>0:REM window open flag 3000ENDPROC 3010 3020DEFPROCgetw(h%) 3030!q%=h%:SYS "Wimp_GetWindowInfo",,q% 3040PROCreadblock(q%+4) 3050ENDPROC 3060 3070DEFPROCselect 3080CASEmh%OF 3090WHEN-2:enter%=0:PROCenter_atelier 3100WHENw_stop%:PROCmstop 3110WHENw_save%:PROCmsave 3120ENDCASE 3130ENDPROC 3140 3150DEFPROCmstop 3160IFmi%<3ORmi%>4ENDPROC 3170LOCALT%:T%=dialreason%:dialreason%=-1 3180IFmi%=3THEN 3190CASET%OF 3200WHEN1:PROCquit 3210ENDCASE 3220ENDIF 3230PROCclosew(w_stop%):ENDPROC 3240 3250DEFPROCmsave 3260IFmi%<>0ENDPROC 3270LOCALT$:T$=$FNia(w_save%,2):IFT$=FNleaf(T$):ERROR99,"To save, please drag the file icon to a directory viewer" 3280file$=T$:PROCsavedata1 3290ENDPROC 3300 3310DEFPROCstartdrag 3320dragreason%=-1:dragbutton%=mb% 3330CASEmh%OF 3340WHENw_save%:IFmi%=3:dragreason%=1:PROCdragicon(w_save%,3) 3350ENDCASE 3360ENDPROC 3370 3380DEFPROCenddrag 3390PROCreadpointer 3400IFmh%<>-1THEN 3410CASEdragreason%OF 3420WHEN1:file$=FNleaf($FNia(w_save%,2)) 3430PROCsavereq(file$,savet%,saves%,savereason%) 3440ENDCASE 3450ENDIF 3460dragreason%=-1 3470ENDPROC 3480 3490DEFPROCunseli(h%,i%):PROCiset(h%,i%,&200000,0):ENDPROC 3500 3510DEFPROCseli(h%,i%):PROCiset(h%,i%,&200000,&200000):ENDPROC 3520 3530DEFPROCunselall(h%) 3540LOCALI%,i%:PROCwchi(h%) 3550I%=q%:REPEAT:i%=!I%:IFi%>=0:PROCunseli(h%,i%) 3560I%+=4:UNTILi%<0:ENDPROC 3570 3580DEFPROCwchi(h%):SYS "Wimp_WhichIcon",h%,q%,&200000,&200000 3590ENDPROC 3600 3610DEFPROCmenu 3620CASEmh%OF 3630WHEN-2:my%=64+3*40:PROCpop(m_main%,-1) 3640ENDCASE 3650ENDPROC 3660 3670DEFFNpar(t$,s$,RETURN i%):LOCALi1% 3680i1%=i%+1:i%=INSTR(t$+s$,s$,i1%) 3690=MID$(t$,i1%,i%-i1%) 3700 3710DEFFNcrmenu(menu$) 3720IFmenufree%+28>menuend%ERROR99,"Menu area full" 3730LOCAL m% 3740menuptr%=menufree% 3750i%=0 3760IF LEFT$(menu$,1)="#"i%=1:menutitle$=FNpar(menu$,",",i%)ELSEmenutitle$="" 3770$menuptr%=menutitle$ 3780menuptr%?12=7:menuptr%?13=2:menuptr%?14=7:menuptr%?15=0 3790menuptr%!16=196-24:menuptr%!20=40:menuptr%!24=0 3800menuptr%+=28:maxx%=LENmenutitle$ 3810REPEATitem$=FNpar(menu$,",",i%) 3820PROCmenuitem(item$) 3830UNTIL item$="" 3840m%=menufree%:m%!16=(maxx%*8+6)*2 3850menufree%=menuptr% 3860=m% 3870 3880DEFPROCmenuitem(text$) 3890IFtext$=""menuptr%!-24=(menuptr%!-24)OR&80:ENDPROC 3900IFmenuptr%+24>menuend%THENERROR99,"Menu area full" 3910LOCALi%,flg% 3920flg%=&00 3930i%=INSTR(text$,">") 3940IFi%>0subptr%=EVALMID$(text$,i%+1):text$=LEFT$(text$,i%-1)ELSEsubptr%=-1 3950i%=INSTR(text$,"}") 3960IFi%>0subptr%=EVALMID$(text$,i%+1):text$=LEFT$(text$,i%-1):flg%+=&08 3970IFRIGHT$(text$,1)="#"text$=LEFT$(text$):flg%+=&02 3980menuptr%!0=flg%:menuptr%!4=subptr%:menuptr%!8=&07000021 3990IFLEFT$(text$,1)="$"THEN 4000!menuptr%+=&04:menuptr%!8+=&100:i%=INSTR(text$,"(") 4010IFi%>0THENL%=VALMID$(text$,i%+1):text$=LEFT$(text$,i%-1)ELSEL%=12 4020menuptr%!12=EVALMID$(text$,2):menuptr%!16=-1:menuptr%!20=L% 4030text$=STRING$(L%," ") 4040ELSE 4050IFLENtext$<=12THEN 4060$(menuptr%+12)=text$ 4070ELSE 4080I%=FNworkspace(LENtext$+1):$I%=text$ 4090menuptr%!12=I%:menuptr%!16=-1:menuptr%!20=LENtext$+1 4100menuptr%!8=menuptr%!8 OR &100 4110ENDIF 4120IFLENtext$>maxx%maxx%=LENtext$ 4130ENDIF 4140menuptr%+=24 4150ENDPROC 4160 4170DEFFNworkspace(L%) 4180IF curbuf%+L%>endbuf%ERROR99,"No more buffer space" 4190curbuf%+=L%:=curbuf%-L% 4200 4210DEFPROCprep(menu%,tree%) 4220LOCALI%,T$ 4230PROCclearts(menu%) 4240CASEmenu%OF 4250WHENm_main%:PROCmp_main 4260ENDCASE 4270ENDPROC 4280 4290DEFPROCmp_main 4300LOCALn%,f$,s%,t% 4310IFtree%>0THEN 4320IF!mlist%=1THEN 4330n%=mlist%!4:PROCsetfile_at(n%,f$,s%,t%):PROCsaveset(f$,t%,n%,s%) 4340ENDIF 4350ENDIF 4360ENDPROC 4370 4380DEFPROCpop(menu%,tree%) 4390IFmenu%<0:ENDPROC 4400PROCprep(menu%,tree%) 4410SYS "Wimp_CreateMenu",,menu%,mx%-50,my%+32 4420openmenu%=menu% 4430ENDPROC 4440 4450DEFPROCnomenu 4460SYS"Wimp_CreateMenu",,-1:openmenu%=-1 4470ENDPROC 4480 4490DEFPROCmenuselect 4500LOCALI% 4510I%=0:REPEATmlist%!I%=q%!I%:I%+=4:UNTILq%!(I%-4)=-1 4520PROCreadpointer 4530CASEopenmenu%OF 4540WHENm_main%:PROCm_main 4550ENDCASE 4560IFmb%=1THEN 4570PROCpop(openmenu%,mlist%):ELSEPROCnomenu 4580ENDIF 4590ENDPROC 4600 4610DEFPROCm_main 4620CASE!mlist%OF 4630WHEN0:PROCdialogue(w_pinfo%) 4640WHEN2:IFFNaltered_at:PROCqquit:ELSEPROCquit 4650ENDCASE 4660ENDPROC 4670 4680DEFPROCsubmenu(menu%,X%,Y%,q%) 4690REM ;{{{{{{ 4700LOCALI% 4710I%=0:REPEATmlist%!I%=q%!I%:I%+=4:UNTILq%!(I%-4)=-1 4720PROCprep(openmenu%,mlist%) 4730SYS"Wimp_CreateSubMenu",,menu%,X%,Y% 4740ENDPROC 4750 4760DEFPROCclearts(mh%):LOCALI%:I%=mh%+28 4770IFmh%<menustart%ORmh%>menuend%:ENDPROC 4780REPEAT 4790!I%=!I%ANDNOT1:I%!8=I%!8ANDNOT&400000: 4800I%+=24:UNTILI%!-24AND&80 4810ENDPROC 4820 4830DEFPROCshade(mh%,I%) 4840mh%!(28+8+24*I%)=mh%!(28+8+24*I%)OR&400000:ENDPROC 4850 4860DEFPROCtick(mh%,I%) 4870mh%!(28+24*I%)=mh%!(28+24*I%)OR&01:ENDPROC 4880 4890DEFFNcommand 4900LOCALT%,I%,T$ 4910SYS"OS_GetEnv" TO T$ 4920PROCstrip(T$) 4930=T$ 4940 4950DEFFNparam 4960LOCALI%,T$:T$=FNcommand 4970I%=INSTR(T$," -quit "):IFI%=0:="" 4980T$=MID$(T$,I%+7):PROCstrip(T$) 4990I%=INSTR(T$," "):IFI%>0T$=MID$(T$,I%+1):PROCstrip(T$):ELSE="" 5000I%=INSTR(T$," "):IFI%>0T$=LEFT$(T$,I%-1):PROCstrip(T$) 5010=T$ 5020 5030DEFFNfiletype(T$) 5040LOCALT%,U%:SYS "OS_File",5,T$ TOU%,,T% 5050IFT%=0:=-1 5060=(T%AND&FFF00)>>8 5070 5080DEFPROCwaitpoint 5090IF os%<>2 ENDPROC 5100waiter%+=1 5110SYS"Hourglass_On" 5120ENDPROC 5130 5140DEFPROCnormpoint 5150IF os%<>2 ENDPROC 5160WHILEwaiter%>0:SYS"Hourglass_Off":waiter%-=1:ENDWHILE:waiter%=0 5170ENDPROC 5180 5190DEFPROChelp 5200ENDPROC 5210 5220DEFPROCdataloadack 5230q%!0=20:q%!12=ref%:q%!16=4 5240SYS"Wimp_SendMessage",17,q%,task% 5250ENDPROC 5260 5270DEFPROCdatasaveack 5280IFFNArfVar("Wimp$Scrap")="":ERROR99,"<Wimp$Scrap> not defined" 5290!q%=60:q%!12=ref%:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+CHR$0 5300SYS"Wimp_SendMessage",17,q%,task%:ackref%=q%!8 5310ENDPROC 5320 5330DEFPROCsavereq(T$,t%,s%,r%) 5340savereason%=r% 5350q%!32=my%:q%!28=mx%:q%!24=mi%:q%!20=mh% 5360q%!16=1:q%!12=0:q%!36=s%:q%!40=t%:!q%=60 5370$(q%+44)=T$+CHR$0:SYS"Wimp_SendMessage",17,q%,q%!20,q%!24 5380saveref%=q%!8:ENDPROC 5390 5400DEFPROCloadmess 5410$(q%+44)=file$+CHR$0:!q%=60 5420q%!12=ref%:q%!16=3:SYS"Wimp_SendMessage",17,q%,task% 5430ackpending%=TRUE:ENDPROC 5440 5450DEFFNzts(T%):LOCALT$:T$="" 5460WHILE?T%<>0:T$+=CHR$?T%:T%+=1:ENDWHILE 5470=T$ 5480 5490DEFPROCgetct:SYS"Wimp_GetCaretPosition",,q%:ENDPROC 5500 5510DEFPROCsetct(h%,i%,o%):SYS "Wimp_SetCaretPosition",h%,i%,,,-1,o% 5520ENDPROC 5530 5540DEFFNleaf(T$) 5550LOCALI%,C% 5560IF((INSTR(T$,".")=0)AND(INSTR(T$,":")=0))THEN=T$ 5570I%=LEN(T$) 5580REPEAT 5590C%=ASCMID$(T$,I%,1) 5600I%-=1 5610UNTIL(I%<=0ORC%=ASC"."ORC%=ASC":") 5620IFI%>0THEN=RIGHT$(T$,LEN(T$)-I%-1) 5630=T$ 5640 5650DEFPROCscrsz 5660!workbuf%=4:workbuf%!4=5:workbuf%!8=11:workbuf%!12=12:workbuf%!16=-1 5670SYS "OS_ReadVduVariables",workbuf%,workbuf%+24 5680q%!32=(workbuf%!32)<<(workbuf%!24):q%!36=(workbuf%!36)<<(workbuf%!28) 5690ENDPROC 5700 5710DEFPROCsaveset(f$,T%,r%,s%) 5720savereason%=r%:savef$=f$:savet%=T%:saves%=s% 5730PROCseti(w_save%,2,f$):$FNva(w_save%,3)="sfile_"+RIGHT$("00"+STR$~T%,3) 5740ENDPROC 5750 5760DEFPROCdragicon(h%,i%) 5770LOCALx%,y%,ys% 5780PROCgetw(h%):ys%=y1%-y0%:x%=bx%:y%=y0%-scy% 5790PROCgeti(h%,i%):q%!8+=x%:q%!12+=y%+ys%:q%!16+=x% 5800q%!20+=y%+ys%:q%!24=0:q%!28=0:!q%=0:PROCdrag5:ENDPROC 5810 5820DEFPROCdrag5:PROCreadpointer:PROCscrsz 5830q%!24-=mx%-q%!8:q%!28-=my%-q%!12:q%!32+=q%!16-mx%:q%!36+=q%!20-my% 5840q%!4=5:SYS"Wimp_DragBox",,q%:ENDPROC 5850 5860DEFPROCsavedata 5870IFq%!12<>saveref%:ENDPROC 5880file$=FNzts(q%+44) 5890PROCsavedata1 5900ENDPROC 5910 5920DEFPROCsavedata1:PROCclosew(w_save%) 5930PROCsavefile(savereason%,file$) 5940savereason%=-1:PROCloadmess 5950ENDPROC 5960 5970DEFPROCprequit 5980IFFNaltered_at:PROCackrec:PROCqquit 5990ENDPROC 6000 6010DEFPROCackrec:q%!12=ref%:SYS "Wimp_SendMessage",19,q%,task% 6020DEFPROCqquit:PROCstop(1,"Lose screen and quit Atelier",as$,-1) 6030ENDPROC 6040 6050DEFPROCenter_atelier 6060LOCALERROR:ONERRORLOCAL:RESTOREERROR:PROCrestorewimp:ERRORERR,REPORT$ 6070enter%=0:PROCrun_at:PROCrestorewimp:ENDPROC 6080 6090DEFPROCsavefile(n%,f$) 6100LOCALERROR:ONERRORLOCAL:RESTOREERROR:PROCrestorewimp:ERRORERR,REPORT$ 6110PROCsave_at(n%,f$):PROCrestorewimp:ENDPROC 6120 6130DEFPROCsavewimp:IFos%=1:ENDPROC 6140IF wimpsaved% THEN ENDPROC 6150wimpsaved%=TRUE 6160LOCALI%,J%:REM SYS"Wimp_CommandWindow",1 6170PROCnormpoint:mode%=MODE:PROCmode15 6180*fx229 6190ENDPROC 6200 6210DEFPROCrestorewimp:IFos%=1:ENDPROC 6220IF NOT wimpsaved% THEN ENDPROC 6230wimpsaved%=FALSE 6240*fx229,1 6250SYS "Wimp_CommandWindow",-1 6260SYS "Wimp_SetMode",mode%:OFF:SYS"Wimp_ForceRedraw",-1,-1E9,-1E9,1E9,1E9 6270ENDPROC 6280 6290DEFPROCmode15 6300LOCALERROR 6310ONERRORLOCAL:RESTOREERROR:ERROR99,"Atelier needs to use MODE 15 and there is not enough RAM! You must use the task manager to make at least 160k of screen available" 6320MODE15:ENDPROC 6330 6340DEFPROCfindmos:os%=1 6350LOCALERROR:ONERRORLOCAL:RESTOREERROR:ENDPROC 6360RESTORE+1 6370os%=2:ENDPROC 6380 6390DEFPROCcheckmos:os%=1 6400LOCALERROR:ONERRORLOCAL:RESTOREERROR:PROCmos12:END 6410RESTORE+1 6420os%=2:ENDPROC 6430 6440DEFPROCmos12 6450MODE15:OFF 6460SYS &400C0 6470enter%=0 6480PROCrun_at 6490MODE12:*desktop 6500END 6510 6520DEFPROCstore(RETURN A$,f$) 6530LOCALI%,C%,T$:T$=f$:IFT$>""THEN 6540FORI%=1TOLENT$:C%=ASCMID$(T$,I%) 6550IFC%>64ANDC%<91MID$(T$,I%,1)=CHR$(C%+32) 6560NEXT 6561ENDIF 6570IFINSTR(T$,"$scrap>")=0A$=f$ 6571ENDPROC 6580 6590 6600REM ----ATELIER BITS------------------------------------------------- 6610DEFPROCrun_at 6620REM ;{{ here, copy the background screen to the foreground 6630REM ;{{ and do the biz. NB all ERROR traps etc MUST be LOCAL 6640PROCsavewimp 6650PROCnormpoint 6660VDU 23,255,255,255,255,255,255,255,255,255 6670cat%!0=148 6680cat%!4=-1 6690SYS "OS_ReadVduVariables",cat%,cat% 6700!topscreen%=!cat% 6710PROCunsetsoftkeys 6720SYS "OS_RemoveCursors" 6730PROCsetvectors 6740CALL undorestore% 6750PROCenter_action 6760CALL colour% 6770CALL mousecolour% 6780CALL liftdown% 6790VDU5:CALL helptext% 6800PROCupdate 6810PROCatelier 6820CALL liftup% 6830CALL undosave% 6840PROCunsetvectors 6850REM PROCsetsoftkeys 6860PROCrestorewimp 6870ENDPROC 6880 6890DEFPROCsetvectors 6900IF vectors_set% THEN ENDPROC 6910SYS "OS_Claim",&1D,duff_call%,0 6920PROCset_abort_traps 6930vectors_set%=TRUE 6940ENDPROC 6950 6960DEFPROCunsetvectors 6970IF NOT vectors_set% THEN ENDPROC 6980SYS "OS_Release",&1D,duff_call%,0 6990PROCunset_abort_traps 7000vectors_set%=FALSE 7010ENDPROC 7020 7030DEFPROCenter_action 7040ON ERROR LOCAL:PROCerror_at:ENDPROC 7050CASE enter% OF 7060WHEN0:REM no action,just enter 7070WHEN1:REM compacted load 7080*UnDefine 7090*SetPosition 0 1023 7100G%=cat%:$cat%=f$:CALL com_update_info% 7110OSCLI"PlotFile "+f$ 7120enter%=0:PROCstore($screen_str%,f$) 7130WHEN2:$file_str%=f$ :REM sprites - handled by atelier 7140WHEN3:$cat%=f$ 7150G%=cat% 7160CALL compactedload% 7170CALL undosave% 7180enter%=0 7190ENDCASE 7200ENDPROC 7210 7220DEFFNaltered_at 7230REM ;{{ return TRUE if you would lose any data if they quit just 7240REM ;{{ now (ie they have altered screen/sprites/brushes etc 7250REM ;{{ since last save/load. Just return FALSE if you don't care 7260=TRUE 7270 7280DEFFNokfile_at(f$,s%,t%) 7290IF t%=&D7E OR t%=&D3A OR t%=&D7F OR t%=&D39 OR t%=&FF9 OR t%=&DE2 THEN =TRUE ELSE =FALSE 7300 7310DEFPROCloadfile(f$,s%,t%) 7320LOCALERROR:ONERRORLOCAL:RESTOREERROR:PROCrestorewimp:ERRORERR,REPORT$ 7330PROCload_at(f$,s%,t%):PROCrestorewimp:ENDPROC 7340 7350DEFPROCload_at(f$,s%,t%) 7360CASE t% OF 7370WHEN&D7F,&FF9,&DE2 7380SYS "OS_Find",&40,f$ TO hdl% 7390SYS "OS_GBPB",4,hdl%,cat%,1 7400SYS "OS_Find",&00,hdl% 7410ENDCASE 7420CASE t% OF 7430WHEN&D7E:OSCLI"LOAD "+f$+" "+STR$~(brush%):PROCstore($brush_str%,f$) 7440WHEN&D3A:OSCLI"LOAD "+f$+" "+STR$~(brpatt%):PROCstore($pattern_str%,f$):!pm%=1 7450WHEN&D7F:enter%=1:PROCrun_at 7460WHEN&D39:PROCformula_load(f$) 7470WHEN&FF9:enter%=2:PROCstore($sprite_str%,f$):PROCrun_at 7480WHEN&DE2:enter%=3:PROCstore($screen_str%,f$):PROCrun_at 7490ENDCASE 7500ENDPROC 7510 7520DEFPROCsave_at(n%,f$) 7530CALL savecheck% 7540CASE n% OF 7550WHEN0,1,2,3 7560SYS "OS_File",&0A,f$,&FFF,,cat%,cat% :REM saves dummy file 7570PROCsavewimp 7580cat%!0=148:cat%!4=-1 7590SYS "OS_ReadVduVariables",cat%,cat% 7600!topscreen%=!cat%:SYS "OS_RemoveCursors" 7610CALL undorestore% 7620CASE n% OF 7630WHEN0:PROCcompressedsave(f$):PROCstore($screen_str%,f$) 7640WHEN1:OSCLI"SCREENSAVE "+f$:PROCstore($screen_str%,f$) 7650WHEN2:PROCcompactedsave(0,f$):PROCstore($screen_str%,f$) 7660WHEN3:PROCcompactedsave(1,f$):PROCstore($screen_str%,f$) 7670ENDCASE 7680PROCrestorewimp 7690WHEN4:OSCLI"SSAVE "+f$:PROCstore($sprite_str%,f$) 7700WHEN5:OSCLI"SAVE "+f$+" "+STR$~(brush%)+" +2000":PROCstore($brush_str%,f$) 7710OSCLI"SETTYPE "+f$+" D7E" 7720WHEN6:OSCLI"SAVE "+f$+" "+STR$~(brpatt%)+" +2000":PROCstore($brush_str%,f$) 7730OSCLI"SETTYPE "+f$+" D3A" 7740ENDCASE 7750ENDPROC 7760 7770DEFPROCsetfile_at(n%,RETURN f$,RETURN s%,RETURN t%) 7780REM ;{{ setup up f$ to be filename, s% to estimated size and t% 7790REM ;{{ to filetype for file of internal type n% 7800REM ;{{ NB s%<0 means unknown size, try it anyway 7810CASE n% OF 7820WHEN0:t%=&DE2:f$=$screen_str% :s%=&28000 7830WHEN1:t%=&FF9:f$=$screen_str% :s%=&28000 7840WHEN2:t%=&D7F:f$=$screen_str% :s%=-1 7850WHEN3:t%=&D7F:f$=$screen_str% :s%=-1 7860WHEN4:t%=&FF9:f$=$sprite_str% :SYS "OS_SpriteOp",8TO,,,,,s% 7870WHEN5:t%=&D7E:f$=$brush_str% :s%=&2000 7880WHEN6:t%=&D3A:f$=$pattern_str%:s%=&2000 7890ENDCASE 7900ENDPROC 7910 7920DEFPROCanimate 7930FOR count=0 TO 359 STEP 18 7940MX=640:MY=512:GCOL128+(!pc%AND63) TINT (!pc%AND192):CLS 7950step%=happenstep%:PROCscreen_select 7960PROCcompactedsave(1,"Frame"+STR$(count DIV 18)) 7970NEXT 7980ENDPROC 7990 8000DEFPROCatelier 8010angle=0 8020*FX 15,0 8030REM ---------MAIN LOOP----------- 8040ON ERROR LOCAL PROCerror_at 8050REPEAT 8060REPEAT 8070mrctx1%=0 8080mrcty1%=0 8090mrctx2%=1279 8100mrcty2%=1023 8110CASE !Ac% OF 8120WHEN35,36:mrctx1%=32:mrcty1%=32:mrctx2%=1216:mrcty2%=960 8130WHEN24:IF step%>2 THEN PROCsetlimits(xs%,-ys%) 8140WHEN71:IF step%>2 THEN mrctx1%=x1%:mrcty1%=y2%:mrctx2%=xs%:mrcty2%=-ys% 8150WHEN75:IF step%>2 THEN mrctx2%-=xs%DIV2:mrcty2%+=ys% 8160WHEN37,40:IF FNsprites>0 THEN CALL locatesprite%:SYS &2E,40,,!sprstr TO ,,,xs%,ys%:PROCsetlimits(xs%*2,ys%*4) 8170ENDCASE 8180MOUSE RECTANGLE mrctx1%,mrcty1%,mrctx2%,mrcty2% 8190PROCmouse_handle 8200IF MB=2 OR enter% THEN PROCmenucalled 8210AcCODE%=?(!step_codes) 8220happenstep%=(AcCODE% AND 15) 8230stepcode%=?(!step_codes+step%) 8240IF (!pm%=2) AND (stepcode% AND 64) THEN step%+=1:PROCcopysort:F%=step%:CALL helpstep%:GOTO 8230 8250CASE !Ac% OF 8260WHEN60,61,62,63,64,65 8270CASE !rect_brush_mode OF 8280WHEN0:AcCODE%=AcCODE% AND 191 8290WHEN1:happenstep%+=1:AcCODE%=AcCODE% OR 64 8300IF step%=2 THEN stepcode%=stepcode% OR 16 8310WHEN2:happenstep%+=1:AcCODE%=AcCODE% AND 191 8320IF step%=1 THEN stepcode%=stepcode% OR 16+32 8330ENDCASE 8340ENDCASE 8350IF (AcCODE% AND 64) AND step%=happenstep% THEN step%=1:PROCBUTOFF(4):F%=step%:CALL helpstep% 8360IF NOT (AcCODE% AND 64) AND step%=happenstep% THEN step%=step%-1:F%=step%:CALL helpstep% 8370CASE TRUE OF 8380WHEN(NOT (AcCODE% AND 64)) AND (step%=happenstep%-1): 8390IF (MB AND 4)=4 THEN step%=step%+1:F%=step%:CALL helpstep% 8400OTHERWISE 8410IF NOT select THEN IF (MB AND 4)=(step% AND 1)*4 THEN step%=step%+1:F%=step%:CALL helpstep% 8420IF select THEN IF (MB AND 4) THEN step%=step%+1:F%=step%:CALL helpstep%:PROCBUTOFF(4) 8430ENDCASE 8440*FX 229,1 8450IF step%=happenstep% THEN *FX 229,0 8460inaction=!Ac% 8470IF (MB AND 1)=1 THEN PROCadjustpressed 8480E%=-1 8490IF stepcode% AND 16 THEN 8500CASE step% OF 8510WHEN0,1:C%=MX-x0%:D%=MY-y0% 8520WHEN2,3:C%=MX-x1%:D%=MY-y1% 8530WHEN4,5:C%=MX-x3%:D%=MY-y3% 8540ENDCASE 8550IF stepcode% AND 32 THEN B%=C%*2:C%=D%:CALL calc_radius%:C%=!RESULTX/2:E%=2 ELSE E%=0 8560ENDIF 8570A%=MX:B%=MY:CALL help% 8580IF step%=happenstep% AND (AcCODE% AND 128) THEN 8590WAIT 8600CALL liftup% 8610CALL colour% 8620IF !pm%>0 AND (AcCODE% AND &20) THEN CALL bit_map_scan_A% 8630PROCscreen_select 8640IF !pm%>0 AND (AcCODE% AND &20) THEN CALL bit_map_pattern% 8650IF (AcCODE% AND 16) THEN CALL show_thru% 8660CALL liftdown% 8670ELSE 8680GCOL 3,63 TINT 192 8690PROCscreen_select 8700ENDIF 8710keypress%=INKEY(0):IF keypress%>0 THEN PROCkeypressed 8720IF inaction<>!Ac% THEN PROCprocess_new_action 8730IF step%<>oldstep% THEN F%=step%:CALL helpstep% 8740oldstep%=step% 8750UNTIL !Ac%=20 8760PROCreset_action 8770IF os%=1 THEN 8780IF testing THEN 8790PROCerrorhandle(3,"Where to Boss","Basic Program|Source Code|Don't Exit",selected) 8800ELSE 8810PROCerrorhandle(2,"Do you really wish to exit from ATELIER","CONFIRM",selected) 8820ENDIF 8830ELSE selected=1 8840ENDIF 8850IF testing THEN UNTIL selected=1 OR selected=2 8860IF NOT testing THEN UNTIL selected=1 8870REM -------------END OF MAIN LOOP ---------- 8880IF NOT testing OR os%=2 THEN ENDPROC 8890PROCtidy_at 8900*FX 15,0 8910CASE selected OF 8920WHEN1: 8930*KEY 4 SAVE|MRUN|M 8940*FX 138,0,69 8950*FX 138,0,68 8960*FX 138,0,46 8970*FX 138,0,46 8980*FX 138,0,13 8990END 9000WHEN2: 9010*KEY 4 RUN|M 9020PROCstring_to_buffer("LO. ""<Ateli*$Dir>.Sour*.Sou*"""+CHR$(13)+"ED.."+CHR$(13)) 9030END 9040ENDCASE 9050ENDPROC 9060 9070DEFPROCadjustpressed 9080IF !Ac%=82 OR !Ac%=59 THEN 9090PROCreset_action 9100ELSE 9110IF (MB AND 1)=1 AND step%>1 THEN step%=step%-1:PROCBUTOFF(1):PROCupdate:F%=step%:CALL helpstep% 9120ENDIF 9130ENDPROC 9140 9150DEFPROCreset_action 9160!Ac%=!oldaction% 9170ENDPROC 9180 9190DEFPROCmouse_handle 9200MOUSE MX,MY,MB:IF mgs THEN PROCmousegrid 9210IF !left_handed THEN CASE MB OF 9220WHEN%001:MB=%100 9230WHEN%011:MB=%110 9240WHEN%100:MB=%001 9250WHEN%110:MB=%011 9260ENDCASE 9270IF NOT INKEY(-97) THEN ENDPROC 9280IF INKEY(-1) THEN xrst%=MX:yrst%=MY ELSE MOUSE TO xrst%,yrst% 9290ENDPROC 9300 9310DEF PROCmousegrid 9320MX=((MX+mousegrid DIV 2) DIV mousegrid)*mousegrid 9330MY=((MY+mousegrid DIV 2) DIV mousegrid)*mousegrid 9340IF MX<mrctx1% THEN MX=mrctx1% 9350IF MY<mrcty1% THEN MY=mrcty1% 9360IF MX>mrctx2% THEN MX=mrctx2% 9370IF MY>mrcty2% THEN MY=mrcty2% 9380POINT TO MX,MY 9390ENDPROC 9400 9410DEFPROCset_action 9420CASE !Ac% OF 9430WHEN57,59,82,43 9440OTHERWISE 9450!oldaction%=!Ac% 9460ENDCASE 9470ENDPROC 9480 9490DEFPROCBUTOFF(M) 9500REPEAT 9510MOUSE DX,DY,MB 9520IF !left_handed THEN CASE MB OF 9530WHEN%001:MB=%100 9540WHEN%011:MB=%110 9550WHEN%100:MB=%001 9560WHEN%110:MB=%011 9570ENDCASE 9580UNTIL (MB AND M)=0 9590ENDPROC 9600 9610DEFPROCkeypressed 9620*FX 15,0 9630CASE CHR$(keypress%) OF 9640WHEN"*":enter%=5 9650ENDCASE 9660IF (keypress% AND 128)=0 THEN ENDPROC 9670CASE keypress% OF 9680WHEN&80,&90,&A0,&B0 :REM f0-print key 9690CALL liftup% 9700CALL undosave% 9710PROCpoint(0,0) 9720OSCLI(funcprint$) 9730IF MODE<>15 THEN MODE 15:CALL undorestore% 9740PROCupdate 9750CALL liftdown% 9760WHEN&B1 9770CALL undosave% 9780*FX229 9790MODE 0 9800VDU2 9810FOR !Ac%=0 TO 82 9820!rect_brush_mode=(!Ac% MOD 3) 9830PRINT"Function ";!Ac% 9840PRINT 9850CALL helptext% 9860PRINT 9870NEXT 9880VDU3 9890MODE 15 9900CALL undorestore% 9910WHEN&81,&91,&A1,&B1:CALL liftup%:CALL undorestore%:CALL liftdown% 9920WHEN&82,&92,&A2,&B2:step%=1:PROCset_action:!Ac%=57 9930WHEN&83,&93,&A3,&B3:IF !Ac%<>82 THEN step%=1:PROCset_action:!Ac%=82 ELSE !brushsel%=((!brushsel%+1) AND 15) 9940WHEN&84,&94,&A4,&B4:!pm%=0:!pc%=POINT(MX,MY)+TINT(MX,MY):PROCupdate 9950WHEN&85,&95,&A5,&B5 9960IF !helpstatus% THEN CALL helpon%:VDU5:CALL helptext%:F%=step%:CALL helpstep% ELSE CALL helpoff% 9970WHEN&86,&96,&A6,&B6 9980mgs=1-mgs:PROCupdate 9990WHEN&87,&97,&A7,&B7 10000IF testing AND keypress%=&A7 THEN 10010*FX229 10020CALL liftup%:PROCanimate:CALL liftdown% 10030ELSE 10040CALL liftup% 10050CALL undosave% 10060CALL liftdown% 10070ENDIF 10080WHEN&88,&98,&A8,&B8 10090IF (testing AND keypress%=&88) OR (NOT testing) THEN PROCset_action:!Ac%=20 10100IF testing AND keypress%=&98 THEN os%=1:!Ac%=20 10110IF testing AND keypress%=&A8 THEN CALL liftup%:A%=!presentmenu%:G%=MX:H%=MY:CALL drawmenu%:CALL liftdown% 10120ENDCASE 10130keyin%=(keypress%AND&F)-9 10140IF keyin%>4 THEN keyin%=-1 10150IF keyin%>-1 THEN 10160keylevel%=(((keypress%AND&F0)>>4)MOD4) 10170IF INKEY(-3) THEN function%(keyin%,keylevel%)=!Ac% ELSE !Ac%=function%(keyin%,keylevel%):PROCupdate 10180ENDIF 10190ENDPROC 10200 10210DEFPROCprocess_new_action 10220IF !Ac%=33 THEN PROCreset_action 10230VDU5:CALL helptext%:F%=1:CALL helpstep%:step%=1:PROCupdate 10240ENDPROC 10250 10260DEFPROCmenucalled 10270PROCset_action 10280MOUSE RECTANGLE 0,0,1279,1023 10290CALL liftup% 10300!mousebuts=0 10310IF ?(!actionsave)<255 THEN ?(!actionsave)=!Ac% 10320GCOL 128+(BACKCOL% AND 63) TINT (BACKCOL% AND 192) 10330CASE enter% OF 10340WHEN2:A%=7:CALL downtree%:REM sprites 10350WHEN5:A%=28:CALL downtree%:REM oscli 10360ENDCASE 10370IF enter%=4 AND !Ac%=12 THEN A%=9 ELSE A%=0 10380G%=MX:H%=MY:CALL menusystem% 10390IF !Ac%=33 THEN PROCreset_action 10400step%=1:PROCupdate:PROCBUTOFF(7) 10410IF !Ac%<>43 THEN 10420CALL liftdown% 10430VDU5:CALL helptext% 10440F%=step%:CALL helpstep% 10450ENDIF 10460IF ?(!actionsave)<255 THEN !oldaction%=?(!actionsave) 10470enter%=0 10480ENDPROC 10490 10500DEFPROCiniterror 10510IF MODE=15 THEN MODE 0 10520VDU 7 10530IF ERR=17 THEN PRINT"Escaped!":END 10540PRINTREPORT$;" at line ";ERL 10550IF NOT testing THEN END 10560*FX 15,0 10570A=GET 10580PROCstring_to_buffer("ED. "+STR$(ERL)+CHR$(13)) 10590END 10600ENDPROC 10610 10620DEFPROCstring_to_buffer(tran$) 10630REPEAT 10640OSCLI"FX 138,0,"+STR$(ASC(LEFT$(tran$,1))) 10650tran$=MID$(tran$,2) 10660UNTIL tran$="" 10670ENDPROC 10680 10690DEFPROCtidy_at 10700PROCsetsoftkeys 10710PROCunsetvectors 10720ENDPROC 10730 10740DEFPROCunsetsoftkeys 10750FOR R=221 TO 228:OSCLI"FX "+STR$(R)+",2":NEXT 10760*FX 219,9 10770ENDPROC 10780 10790DEFPROCsetsoftkeys 10800FOR R=221 TO 228:OSCLI"FX "+STR$(R)+",1":NEXT 10810*FX 219,9 10820ENDPROC 10830 10840DEFPROCinit_at 10850IF testing THEN ON ERROR LOCAL PROCiniterror 10860RESTORE10840 10870PNglass=2:PNbrush=3:PNflood=4:PNpencil=5:PNspray=6 10880PNnormal=7:PNspriteop=8:PNcalculator=14:PNkeyboard=15:PNA=16:PNstopped=17 10890PNquestion=18:PNhand=19 10900com_gx1%=0:com_gy1%=0:com_gx2%=1278:com_gy2%=1020 10910REM *FX 229,1 10920PROCunsetsoftkeys 10930K=1024 10940DIM BLOW% 1*K,cat% 1*K,STORE% 160*K,brush% 8*K,brpatt% 8*K,cycle% 128,file_icons% 3*K,log_table% 256,log_scale% 1040,formnames% 1*K,fontlist% 1*K 10950DIM skel% 1764*10,sqr% &5201,sin% 360*4,tan% 90*4,numbers% &720,screen_str% 256,pattern_str% 256,brush_str% 256,sprite_str% 256,file_str% 256 10960DIM behind% 256,flags% 4,PO% &14DC,sprstr% 30,fontstr% 45,presentfont% 80,xget% 800,yget% 800,BUFF% 1*K,BUFFER% 35328,freetable% 256,abts% 16 10970DIM L(640),A%(641,1),B%(256,1),function%(4,3),formulas$(10) 10980OSCLI"LOAD "+FNdir+"POINTER "+STR$~(PO%) 10990IF os%=1 THEN PROCpoint(0,1) 11000s%=OPENIN(FNdir+"code*"):sz%=EXT#s%:CLOSE#s% 11010DIM code% sz%:OSCLI"LOAD "+FNdir+"code* "+STR$~(code%) 11020pl$="LOAD "+FNdir 11030OSCLIpl$+"!Brushes "+STR$~(brush%) 11040OSCLIpl$+"!Patterns "+STR$~(brpatt%) 11050*Com_Open <Atelier$Dir>.Sprites 11060PROCin(file_icons%,"40 8") 11070PROCin(numbers%,"12 8") 11080PROCin(BUFFER%,"384 92") 11090*Com_Close 11100PROCcodevars 11110IF os%=1 THEN PROCpoint(0,0) 11120$screen_str%="Screen" 11130$pattern_str%="Patterns" 11140$brush_str%="Brushes" 11150$sprite_str%="SpriteFile" 11160$sprstr%="new_sprite" 11170g_sprite$="new_sprite" 11180cycle%!0=16 11190FOR R=0 TO 3 11200READ o% 11210FOR R1=0 TO 3 11220!(cycle%+R*16+R1*4+4)=o%+R1 11230NEXT:NEXT 11240FOR R=0 TO 255:?(behind%+R)=255:NEXT 11250FOR R=1 TO 256:?(log_table%+R-1)=20+(R^2)/300:NEXT:FOR R=0 TO 5248:!(sqr%+R*4)=SQR(R*1024):NEXT 11260FOR R=0 TO 359:!(sin%+R*4)=SINRAD(R)*65536:NEXT 11270FOR R=0 TO 89:!(tan%+R*4)=TANRAD(R)*65536:NEXT 11280DATA 0,44,208,252 11290DATA 4,364,408,584,224,584,72,456,72 11300READ numlist 11310!bolpoint%=numlist 11320FOR R=0 TO !bolpoint%-1 11330READ X,Y 11340!(xget%+R*4)=X:!(yget%+R*4)=Y+4 11350NEXT 11360?(flags%)=255 11370?(flags%+1)=255 11380?(flags%+2)=255 11390?(flags%+3)=255 11400!sprstr=sprstr% 11410!brpatt=brpatt% 11420!flags=flags% 11430!cat=cat% 11440!behind=behind% 11450!brushshapes=brush% 11460!BUFF=BUFF% 11470!FLOB=PO% 11480!bolx=xget% 11490!boly=yget% 11500!fontstr=fontstr% 11510!presentfont=presentfont% 11520!STORE=STORE% 11530!freetable=freetable% 11540!put=BUFFER% 11550!cycle=cycle% 11560!screen_str=screen_str% 11570!pattern_str=pattern_str% 11580!brush_str=brush_str% 11590!sprite_str=sprite_str% 11600!file_icons=file_icons% 11610!log_table=log_table% 11620!log_scale=log_scale% 11630!numbers=numbers% 11640!sqr=sqr% 11650!sin=sin% 11660!tan=tan% 11670!file_str=file_str% 11680!formnames=formnames% 11690!skel=skel% 11700!fontlist=fontlist% 11710LOCAL ERROR 11720ON ERROR LOCAL $fontlist%="Font Disk Not Present"+CHR$(0):GOTO 11740 11730CALL initialisation% 11740RESTORE ERROR 11750PROCcheckdumper 11760xrst%=640:yrst%=512 11770x0%=0:y0%=0:x1%=0:y1%=0 11780x2%=0:y2%=0:x3%=0:y3%=0 11790x4%=0:y4%=0:x5%=0:y5%=0 11800actionflags%=8:actionstep%=3 11810xs%=0:ys%=0:oldstep%=0 11820step%=1:vectors_set%=FALSE 11830wedge%=0:col%=0 11840psizex%=292:psizey%=309 11850xpsize%=-1:ypsize%=-1 11860mgs=FALSE:mcs=FALSE 11870mousegrid=32:select=TRUE 11880P%=formnames% 11890[OPT 0 11900EQUB 1 11910EQUB 10 11920EQUS "Defineable" 11930] 11940formula$="SIN(YR)*50" 11950dummy=FNbuild_formula(formula$,0) 11960botrad$="1" 11970atext$="Atelier (C) Simon Clay 1989" 11980PROCremovekeymod 11990funcprint$="BYE" 12000eval$="" 12010!oldaction%=60 12020ENDPROC 12030 12040 12050DEFPROCin(b%,s$) 12060OSCLI"Com_Sprites $ "+STR$(b%)+" "+s$ 12070ENDPROC 12080 12090DEFPROCremovekeymod 12100LOCAL ERROR 12110ON ERROR LOCAL ENDPROC 12120*Unplug InternationalKeyboard 12130ENDPROC 12140 12150DEFPROCset_abort_traps 12160abts%!0=!&C 12170abts%!4=!&10 12180abts%!8=!&14 12190FOR PASS=0 TO 2 STEP 2 12200P%=&C 12210[OPT PASS 12220B abt1% ;sets abort on instuction fetch error trap 12230B abt2% ;sets abort on data transfer error trap 12240B abt3% ;sets address exception error trap 12250]NEXT 12260ENDPROC 12270 12280DEFPROCunset_abort_traps 12290!&0C=abts%!0 12300!&10=abts%!4 12310!&14=abts%!8 12320ENDPROC 12330 12340DEFPROCcodevars 12350 12360variablelocate%=code%+4*1 12370com_put%=code%+4*2 12380locatesprite%=code%+4*3 12390help%=code%+4*4 12400helpon%=code%+4*5 12410helpoff%=code%+4*6 12420helpstep%=code%+4*7 12430helptext%=code%+4*8 12440liftup%=code%+4*9 12450liftdown%=code%+4*10 12460colour%=code%+4*11 12470undorestore%=code%+4*12 12480undosave%=code%+4*13 12490drawmenu%=code%+4*14 12500menusystem%=code%+4*15 12510mousecolour%=code%+4*16 12520screen_select%=code%+4*17 12530spriteinit%=code%+4*18 12540magnify%=code%+4*19 12550uptree%=code%+4*20 12560putbackground%=code%+4*21 12570com_get%=code%+4*22 12580putscreenrectangle%=code%+4*23 12590brusheor%=code%+4*24 12600brushdraw%=code%+4*25 12610brushundo%=code%+4*26 12620spritepix%=code%+4*27 12630brushget%=code%+4*28 12640shapeget%=code%+4*29 12650spriteputerror%=code%+4*30 12660getspritefromscreen%=code%+4*31 12670priorityin%=code%+4*32 12680undochar%=code%+4*33 12690undobox%=code%+4*34 12700scanscreen%=code%+4*35 12710colourbyte%=code%+4*36 12720calc_intensity%=code%+4*37 12730splodgeread%=code%+4*38 12740setbord%=code%+4*39 12750abt1%=code%+4*40 12760FINDMENU%=code%+4*41 12770SKIPWORD%=code%+4*42 12780drawword%=code%+4*43 12790abt2%=code%+4*44 12800abt3%=code%+4*45 12810COLaverage%=code%+4*46 12820COLgcol%=code%+4*47 12830COLmode15_13resize%=code%+4*48 12840show_thru%=code%+4*49 12850swap_pixels%=code%+4*50 12860COLsmooth_rectangle%=code%+4*51 12870compactedsave%=code%+4*52 12880screensave%=code%+4*53 12890bit_map_scan_A%=code%+4*54 12900bit_map_scan_B%=code%+4*55 12910bit_map_pattern%=code%+4*56 12920vertical_fill%=code%+4*57 12930copy_fill%=code%+4*58 12940calc_radius%=code%+4*59 12950framedraw%=code%+4*60 12960spin_bottle%=code%+4*61 12970translate_point%=code%+4*62 12980anti_aliased_squash%=code%+4*63 12990screenload%=code%+4*64 13000initialisation%=code%+4*65 13010formframedraw%=code%+4*66 13020form_translate%=code%+4*67 13030convertmode%=code%+4*68 13040bytecolour%=code%+4*69 13050downtree%=code%+4*70 13060checksprites%=code%+4*71 13070compactedload%=code%+4*72 13080savecheck%=code%+4*73 13090fontlistinit%=code%+4*74 13100duff_call%=code%+4*75 13110draw_error_box%=code%+4*76 13120com_update_info%=code%+4*77 13130 13140CALLvariablelocate% 13150 13160c=!code% 13170 13180Ac%=c+4*0 13190printmenu%=c+4*1 13200pc%=c+4*2 13210brushsel%=c+4*3 13220helpstatus%=c+4*4 13230presentmenu%=c+4*5 13240bolpoint%=c+4*6 13250topscreen%=c+4*7 13260blowcol%=c+4*8 13270YES%=c+4*9 13280putit%=c+4*10 13290sprsel%=c+4*11 13300startx%=c+4*12 13310starty%=c+4*13 13320compaction%=c+4*14 13330sprpos=c+4*15 13340freecol=c+4*16 13350OUT=c+4*17 13360limtop=c+4*18 13370limbot=c+4*19 13380start=c+4*20 13390hlength=c+4*21 13400RESULTX=c+4*22 13410RESULTY=c+4*23 13420lastmenu=c+4*24 13430r1store=c+4*25 13440r0store=c+4*26 13450left_handed=c+4*27 13460compact3x4=c+4*28 13470inlaysed=c+4*29 13480sprstr=c+4*30 13490brpatt=c+4*31 13500flags=c+4*32 13510cat=c+4*33 13520behind=c+4*34 13530brushshapes=c+4*35 13540BUFF=c+4*36 13550FLOB=c+4*37 13560bolx=c+4*38 13570boly=c+4*39 13580fontstr=c+4*40 13590presentfont=c+4*41 13600STORE=c+4*42 13610freetable=c+4*43 13620put=c+4*44 13630cycle=c+4*45 13640rect_brush=c+4*46 13650screen_str=c+4*47 13660pattern_str=c+4*48 13670brush_str=c+4*49 13680sprite_str=c+4*50 13690help_text_data=c+4*51 13700file_icons=c+4*52 13710bit_map=c+4*53 13720fillstylepic=c+4*54 13730log_table=c+4*55 13740log_scale=c+4*56 13750 13760numbers=c+4*58 13770magnify_xpos=c+4*59 13780magnify_ypos=c+4*60 13790putpos=c+4*61 13800magputpos=c+4*62 13810sizex=c+4*63 13820sizey=c+4*64 13830sprsize=c+4*65 13840spritex=c+4*66 13850spritey=c+4*67 13860gtspritex=c+4*68 13870gtspritey=c+4*69 13880diskfontlistposition=c+4*70 13890catpos=c+4*71 13900fontsel=c+4*72 13910pattsel=c+4*73 13920treepos=c+4*74 13930matrixput=c+4*75 13940barval_red=c+4*76 13950barval_grn=c+4*77 13960barval_blu=c+4*78 13970scaleval_left=c+4*79 13980scaleval_right=c+4*80 13990cycleplace=c+4*81 14000cycledirection=c+4*82 14010cyclemode=c+4*83 14020pm%=c+4*84 14030mixval_red=c+4*85 14040mixval_grn=c+4*86 14050mixval_blu=c+4*87 14060mousex=c+4*88 14070mousey=c+4*89 14080mousebuts=c+4*90 14090magnification=c+4*91 14100magnify_xget=c+4*92 14110magnify_yget=c+4*93 14120magnify_status=c+4*94 14130HANG=c+4*95 14140rect_brush_mode=c+4*96 14150vacant=c+4*97 14160com_x1=c+4*98 14170com_y1=c+4*99 14180com_x2=c+4*100 14190com_y2=c+4*101 14200sprint_xsize=c+4*102 14210sprint_ysize=c+4*103 14220spritemask=c+4*104 14230fill_style=c+4*105 14240fill_prop=c+4*106 14250fill_logr=c+4*107 14260fill_dith=c+4*108 14270step_codes=c+4*109 14280border=c+4*110 14290sqr=c+4*111 14300actionsave=c+4*112 14310bottle=c+4*113 14320bot_tilt=c+4*114 14330bot_lean=c+4*115 14340bot_xout=c+4*116 14350bot_yout=c+4*117 14360line_selected=c+4*118 14370bot_finish=c+4*119 14380bot_xscale=c+4*120 14390bot_yscale=c+4*121 14400hangdelay=c+4*122 14410sin=c+4*123 14420tan=c+4*124 14430file_str=c+4*125 14440form=c+4*126 14450tilt=c+4*127 14460lean=c+4*128 14470rotation=c+4*129 14480xscale=c+4*130 14490yscale=c+4*131 14500hscale=c+4*132 14510form_list_pos=c+4*133 14520formnames=c+4*134 14530formula=c+4*135 14540skel=c+4*136 14550shade_range=c+4*137 14560min_shade=c+4*138 14570fontlist=c+4*139 14580oldaction%=c+4*140 14590 14600 14610BORDSIZE=28 14620WEDGESIZE=16 14630textcol%=0 14640BACKCOL%=202 14650TITLECOL%=0 14660BORDERCOL%=74 14670BORD1%=207 14680BORD2%=15 14690BORD3%=138 14700BORD4%=197 14710DIRECTORYCOL%=224 14720 14730ENDPROC 14740 14750DEFPROCscreen_select 14760 14770IF (!Ac%=1 OR !Ac%=2) AND step%=3 THEN 14780REPEAT 14790PROCmouse_handle 14800D%=!Ac%:E%=step%:F%=MB:G%=MX:H%=MY:CALL screen_select% 14810UNTIL MB=0 14820IF !Ac%=1 THEN x1%=MX:y1%=MY 14830ELSE 14840D%=!Ac%:E%=step%:F%=MB:G%=MX:H%=MY:CALL screen_select% 14850ENDIF 14860IF !YES% THEN 14870CASE step% OF 14880WHEN1:x1%=MX:y1%=MY 14890WHEN2:x2%=MX:y2%=MY 14900WHEN3:x3%=MX:y3%=MY 14910WHEN4:x4%=MX:y4%=MY 14920WHEN5:x5%=MX:y5%=MY 14930ENDCASE 14940ENDIF 14950IF !YES% THEN ENDPROC 14960 14970 14980CASE (!Ac%) OF 14990 15000REM Magnify 15010WHEN12:CASE step% OF 15020WHEN2:enter%=4 15030!magnify_xpos=MX DIV 2 15040!magnify_ypos=255-(MY DIV 4) 15050ENDCASE 15060 15070REM Fill 15080WHEN13:CASE step% OF 15090WHEN2:PROCpoint(0,0) 15100GCOL 128+POINT(MX,MY) TINT TINT(MX,MY) 15110CASE !fill_style OF 15120WHEN0: 15130IF !pm%>0 THEN CALL bit_map_scan_A% 15140PLOT&85,MX,MY 15150IF !pm%>0 THEN CALL bit_map_pattern% 15160WHEN1,2,3: 15170CALL bit_map_scan_A% 15180PLOT&85,MX,MY 15190CASE !fill_style OF 15200WHEN1,2:CALL vertical_fill% 15210WHEN3:A%=MX DIV2:B%=255-MY DIV4 15220CALL vertical_fill% 15230ENDCASE 15240ENDCASE 15250PROCupdate 15260ENDCASE 15270 15280REM Sprite Handling 15290WHEN14,16 15300GCOL 0,(textcol% AND 63) TINT (textcol% AND 192) 15310GCOL 0,128+(BACKCOL% AND 63) TINT (BACKCOL% AND 192) 15320SYS &2E,8 TO ,,,r3 15330SYS &2E,13,,sprstr%,30,!sprsel% TO ,,,leng 15340?(sprstr%+leng+1)=13 15350errorcheat=!Ac% 15360!putit%=1:PROCpoint(0,PNkeyboard) 15370PROCreset_action:CALL uptree% 15380A%=-128:B%=!starty%+56:E%=-1:CALL help% 15390A%=-128:B%=!starty%-!sizey-96:E%=-1:CALL help% 15400XP=!startx%+6:YP=!starty%-48:MOVE XP,YP:VDU 5:PRINT" "; 15410step%=1:PRINT$sprstr%:!starty%=!starty%-32 15420old$=$sprstr%:old$=LEFT$(old$,LEN(old$)-1) 15430go=FNinstring(33,126,"",out$,12) 15440CALL liftup%:CALL putbackground% 15450IF go THEN 15460CASE errorcheat OF 15470WHEN16:OSCLI "SCOPY "+old$+" "+out$:!sprsel%=r3+1:!sprpos=r3-5 15480WHEN14:OSCLI "SRENAME "+old$+" "+out$ 15490ENDCASE 15500ENDIF 15510PROCreset_entry 15520 15530REM Save Compressed Screen 15540WHEN15:IF FNtext_entry(33,$screen_str%,255) THEN 15550PROCpoint(0,1):PROCcompressedsave(out$):$screen_str%=out$ 15560ENDIF 15570PROCreset_entry 15580 15590REM Save Brushes 15600WHEN17:IF FNtext_entry(33,$brush_str%,255) THEN 15610PROCpoint(0,1):OSCLI "SAVE "+out$+" "+STR$~(brush%)+" +2000" 15620OSCLI("SETTYPE "+out$+" &D7E"):$brush_str%=out$ 15630ENDIF 15640PROCreset_entry 15650 15660REM Name Sprite 15670WHEN18:IF FNtext_entry(33,g_sprite$,12) THEN g_sprite$=out$ 15680!Ac%=38:PROCreset_entry 15690 15700REM Save Patterns 15710WHEN19:IF FNtext_entry(33,$pattern_str%,255) THEN 15720PROCpoint(0,1):OSCLI "SAVE "+out$+" "+STR$~(brpatt%)+" +2000" 15730OSCLI("SETTYPE "+out$+" &D3A"):$pattern_str%=out$ 15740ENDIF 15750PROCreset_entry 15760 15770REM function 20 -- FINISH -- ! 15780 15790REM Set Border Colour 15800WHEN21:PROCreset_action 15810CALL setbord% 15820 15830REM Ellipse 15840WHEN22:CASE step% OF 15850WHEN1:x1%=MX:y1%=MY 15860WHEN2:rd%=SQR((MX-x1%)^2+(MY-y1%)^2) 15870CIRCLE x1%,y1%,rd% 15880WAIT:WAIT:CIRCLE x1%,y1%,rd% 15890WHEN3:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &C5,MX,MY 15900WAIT:WAIT:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &C5,MX,MY 15910WHEN4:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &C5,MX,MY 15920ENDCASE 15930 15940REM EllipseFill 15950WHEN23:CASE step% OF 15960WHEN1:x1%=MX:y1%=MY 15970WHEN2:rd%=SQR((MX-x1%)^2+(MY-y1%)^2) 15980CIRCLE x1%,y1%,rd% 15990WAIT:WAIT:CIRCLE x1%,y1%,rd% 16000WHEN3:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &C5,MX,MY 16010WAIT:WAIT:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &C5,MX,MY 16020WHEN4:MOVE x1%,y1%:MOVE x1%+rd%,y1%:PLOT &CD,MX,MY 16030ENDCASE 16040 16050REM fastcopy 16060WHEN24:CASE step% OF 16070WHEN1,2:PROCgetrectangle 16080WHEN3:MX=(MX DIV 2)*2:MY=(MY DIV 4)*4:PROCcopysort 16090RECTANGLE MX,MY,xs%-2,-(ys%+4) 16100WAIT:WAIT:RECTANGLE MX,MY,xs%-2,-(ys%+4) 16110WHEN4: 16120A%=x1%DIV2 16130B%=255-(y1%DIV4) 16140C%=xs%DIV2 16150D%=-ys%DIV4 16160E%=MX DIV2 16170F%=255-(MY DIV4)+(ys%+4)DIV4 16180G%=!pm% 16190CALL putscreenrectangle% 16200ENDCASE 16210 16220REM smearcopy 16230WHEN25:CASE step% OF 16240WHEN1,2:PROCgetrectangle 16250WHEN3:px1%=MX:py1%=MY 16260WHEN4:LINE px1%,py1%,MX,MY 16270WAIT:WAIT:LINE px1%,py1%,MX,MY 16280px2%=MX:py2%=MY 16290WHEN5:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%,py1% 16300WAIT:WAIT:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%,py1% 16310px3%=MX:py3%=MY 16320WHEN6:LINE px1%,py1%,px2%,py2%:DRAW px3%,py3%:DRAW MX,MY:DRAW px1%,py1% 16330WAIT:WAIT:LINE px1%,py1%,px2%,py2%:DRAW px3%,py3%:DRAW MX,MY:DRAW px1%,py1% 16340px4%=MX:py4%=MY 16350WHEN7: 16360PROCsmearscreen(x1%,y1%,xs%,ys%) 16370ENDCASE 16380 16390REM Parrallogram 16400WHEN26:CASE step% OF 16410WHEN1:px1%=MX:py1%=MY 16420WHEN2:LINE px1%,py1%,MX,MY 16430WAIT:WAIT:LINE px1%,py1%,MX,MY 16440px2%=MX:py2%=MY 16450WHEN3:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%-(px2%-MX),py1%-(py2%-MY):DRAW px1%,py1% 16460WAIT:WAIT:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%-(px2%-MX),py1%-(py2%-MY):DRAW px1%,py1% 16470WHEN4:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%-(px2%-MX),py1%-(py2%-MY):DRAW px1%,py1% 16480ENDCASE 16490 16500REM Parralogram fill 16510WHEN27:CASE step% OF 16520WHEN1:px1%=MX:py1%=MY 16530WHEN2:LINE px1%,py1%,MX,MY 16540WAIT:WAIT:LINE px1%,py1%,MX,MY 16550px2%=MX:py2%=MY 16560WHEN3:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%-(px2%-MX),py1%-(py2%-MY):DRAW px1%,py1% 16570WAIT:WAIT:LINE px1%,py1%,px2%,py2%:DRAW MX,MY:DRAW px1%-(px2%-MX),py1%-(py2%-MY):DRAW px1%,py1% 16580WHEN4:MOVE px1%,py1%:MOVE px2%,py2%:PLOT &75,MX,MY 16590ENDCASE 16600 16610REM Cls 16620WHEN28: 16630PROCerrorhandle(2,"Do you really wish to clear the screen to the current colour (NOTE You can UNDO afterwards)","CONFIRM",selected) 16640IF selected=1 THEN 16650CALL liftup% 16660CALL colour%:RECTANGLE FILL 0,0,1279,1023 16670CALL liftdown% 16680ENDIF 16690PROCreset_action 16700PROCupdate 16710 16720REM Filing (Believe it or not!) 16730WHEN29,30,31,32 16740PROCpoint(0,1) 16750errorcheat=!Ac%:filename$=$file_str% 16760PROCreset_action:CALL uptree% 16770CASE errorcheat OF 16780WHEN29:OSCLI "SLOAD "+filename$:$sprite_str%=filename$:!pm%=2 16790WHEN30:OSCLI "SMERGE "+filename$:$sprite_str%=filename$:!pm%=2 16800WHEN31 16810CALL liftup%:CALL undosave% 16820$screen_str%=filename$ 16830CASE os% OF 16840WHEN1:B%=file_str%:CALL screenload% 16850OTHERWISE:OSCLI "SCREENLOAD "+$file_str% 16860ENDCASE 16870IF MODE<>15 THEN 16880SYS "OS_RemoveCursors" 16890CASE INKEY$(0) OF 16900WHEN"D","d" 16910FOR R=0 TO 15:COLOUR R,R<<4,R<<4,R<<4:NEXT 16920WHEN"I","i" 16930FOR R=0 TO 15:COLOUR 15-R,R<<4,R<<4,R<<4:NEXT 16940ENDCASE 16950LOCAL ERROR:err%=FALSE 16960ON ERROR LOCAL err%=TRUE:GOTO 16990 16970CALL convertmode% 16980$screen_str%=filename$ 16990MODE15 17000RESTORE ERROR 17010SYS "OS_RemoveCursors" 17020CALL undorestore% 17030IF err% THEN ERROR ERR,REPORT$ 17040ENDIF 17050CALL liftdown% 17060WHEN32:PROCformula_load(filename$) 17070ENDCASE 17080PROCupdate 17090 17100REM Function 33 = dummy 17110 17120REM Eval Expression 17130WHEN34:!putit%=1:PROCpoint(0,PNkeyboard) 17140PROCreset_action:CALL uptree% 17150A%=-128:B%=!starty%+56:E%=-1:CALL help% 17160A%=-128:B%=!starty%-!sizey-96:E%=-1:CALL help% 17170step%=1 17180REPEAT 17190dummy=FNinstring(32,126,eval$,out$,255):IF dummy THEN 17200!starty%-=32:PROCBUTOFF(7):eval$=out$ 17210PROCeval_error_cheat:dummy=FNinstring(32,126,t$,t$,1) 17220ENDIF 17230!starty%+=32:PROCBUTOFF(7) 17240UNTIL NOT dummy 17250CALL liftup%:CALL putbackground% 17260PROCreset_entry 17270 17280REM Pattern & Brush get 17290WHEN35,36:CASE step% OF 17300WHEN1:RECTANGLE MX-32,MY-32,62,60 17310WAIT:WAIT:RECTANGLE MX-32,MY-32,62,60 17320WHEN2:A%=(MX DIV 2)-16:B%=255-((MY DIV 4)+7) 17330CASE !Ac% OF 17340WHEN35:CALL brushget% 17350WHEN36:CALL shapeget% 17360ENDCASE 17370ENDCASE 17380 17390REM Sprite put 17400WHEN37:IF FNput_check THEN 17410CASE step% OF 17420WHEN1:MX=(MX DIV 2)*2:MY=(MY DIV 4)*4:PROCspritesort 17430RECTANGLE MX,MY,xs%-2,-(ys%+4) 17440WAIT:WAIT:RECTANGLE MX,MY,xs%-2,-(ys%+4) 17450WHEN2:PROCspritesort 17460A%=x1%DIV2 17470B%=255-(y1%DIV4) 17480C%=xs%DIV2 17490D%=-ys%DIV4 17500E%=MX DIV2 17510F%=255-(MY DIV4)+(ys%+4)DIV4 17520G%=2 17530CALL putscreenrectangle% 17540ENDCASE 17550ENDIF 17560 17570REM Get Sprite 17580WHEN38:CASE step% OF 17590WHEN1,2:PROCgetrectangle 17600WHEN3:PROCsortcord 17610A%=x1%:B%=y1%:C%=x2%:D%=y2% 17620PROCpoint(0,0) 17630$sprstr%=g_sprite$ 17640CALL getspritefromscreen% 17650PROCupdate 17660ENDCASE 17670 17680REM Save Sprites 17690WHEN39:IF FNtext_entry(33,$sprite_str%,255) THEN 17700PROCpoint(0,1):OSCLI "SSAVE "+out$:$sprite_str%=out$ 17710ENDIF 17720PROCreset_entry 17730 17740REM Sprite smear 17750WHEN40:IF FNput_check THEN 17760CASE step% OF 17770WHEN1:MX=(MX DIV 2)*2:MY=(MY DIV 4)*4:PROCspritesort 17780RECTANGLE MX,MY,xs%-2,-(ys%+4) 17790WAIT:WAIT:RECTANGLE MX,MY,xs%-2,-(ys%+4) 17800WHEN2:PROCspritesort 17810OSCLI "SCHOOSE "+$sprstr% 17820GCOL 8,0 17830REPEAT 17840PROCmouse_handle 17850PLOT &ED,MX,MY 17860UNTIL MB=0 17870ENDCASE 17880ENDIF 17890 17900REM Printer Dumps 17910WHEN41 17920PROCreset_action 17930*FX 229 17940CALL liftup% 17950A$="SCREENDUMP 0 "+STR$~(!line_selected-1) 17960OSCLI A$ 17970CALL liftdown% 17980PROCupdate 17990 18000REM Delete Sprite 18010WHEN42 18020IF FNsprites THEN 18030SYS &2E,13,,sprstr%,30,!sprsel% TO ,,,leng 18040?(sprstr%+leng+1)=13 18050PROCerrorhandle(2,"Do you really wish to delete the sprite "+$sprstr%,"Confirm",selected) 18060IF selected=1 THEN 18070OSCLI"SDELETE "+$sprstr% 18080IF !sprsel%>FNsprites THEN !sprsel%=FNsprites 18090IF !sprsel%<1 THEN !sprsel%=1 18100ENDIF 18110ELSE 18120VDU 7 18130ENDIF 18140PROCreset_action:PROCupdate 18150 18160REM oscli 18170WHEN43: 18180PROCoscliaction 18190PROCcheckdumper 18200 18210REM Anti aliased text to screen 18220WHEN44:CASE step% OF 18230WHEN1:PROCgetrectangle 18240WHEN2:PROCgetrectangle 18250WHEN3:PROCsortcord 18260tint%=((!pc% AND 192) >> 2) 18270red%=tint%+((!pc% AND 3) << 6) 18280grn%=tint%+((!pc% AND 12) << 4) 18290blu%=tint%+((!pc% AND 48) << 2) 18300tint2%=TINT(MX,MY) >> 2 18310back%=POINT(MX,MY) 18320red2%=tint2%+((back% AND 3) << 6) 18330grn2%=tint2%+((back% AND 12) << 4) 18340blu2%=tint2%+((back% AND 48) << 2) 18350FONT$=$presentfont%+CHR$(13) 18360VDU 23,25,&FF,15,red2%,grn2%,blu2%,red%,grn%,blu% 18370SYS "Font_FindFont",,FONT$,320,320,0,0 TO roman% :REM ;scrapsizes 18380SYS "Font_StringBBox",,atext$ TO ,xmin%,ymin%,xmax%,ymax% 18390xsize%=ABS(xmax%-xmin%):ysize%=ABS(ymax%-ymin%) 18400SYS "Font_ReadScaleFactor" TO ,xscale%,yscale% 18410psizex%=(x2%-x1%)*320/(xsize%/xscale%) 18420psizey%=(y1%-y2%)*320/(ysize%/yscale%) 18430xo%=(xmin%/xscale%)*psizex%/320 18440yo%=(ymin%/yscale%)*psizey%/320 18450SYS "Font_FindFont",,FONT$,psizex%,psizey%,0,0 TO roman% 18460SYS "Font_Paint",,atext$,%10000,x1%-xo%,y2%-yo% 18470COLOUR 63 TINT 192 18480ENDCASE 18490 18500REM Anti box text to screen 18510WHEN45:CASE step% OF 18520WHEN1: 18530FONT$=$presentfont%+CHR$(13) 18540SYS "Font_FindFont",,FONT$,320,320,0,0 TO roman% :REM ;scrapsizes 18550SYS "Font_StringBBox",,atext$ TO ,xmin%,ymin%,xmax%,ymax% 18560xsize%=ABS(xmax%-xmin%):ysize%=ABS(ymax%-ymin%) 18570SYS "Font_ReadScaleFactor" TO ,xscale%,yscale% 18580xs%=(xsize%/xscale%)*psizex%/320 18590ys%=(ysize%/yscale%)*psizey%/320 18600xo%=(xmin%/xscale%)*psizex%/320 18610yo%=(ymin%/yscale%)*psizey%/320 18620RECTANGLE MX+xo%,MY+yo%,xs%,ys% 18630WAIT:WAIT 18640RECTANGLE MX+xo%,MY+yo%,xs%,ys% 18650WHEN2: 18660tint%=((!pc% AND 192) >> 2) 18670red%=tint%+((!pc% AND 3) << 6) 18680grn%=tint%+((!pc% AND 12) << 4) 18690blu%=tint%+((!pc% AND 48) << 2) 18700tint2%=TINT(MX,MY) >> 2 18710back%=POINT(MX,MY) 18720red2%=tint2%+((back% AND 3) << 6) 18730grn2%=tint2%+((back% AND 12) << 4) 18740blu2%=tint2%+((back% AND 48) << 2) 18750VDU 23,25,&FF,15,red2%,grn2%,blu2%,red%,grn%,blu% 18760SYS "Font_FindFont",,FONT$,psizex%,psizey%,0,0 TO roman% 18770SYS "Font_Paint",,atext$,%10000,MX,MY 18780COLOUR 63 TINT 192 18790ENDCASE 18800 18810REM demo function 18820WHEN46 18830PROCreset_action 18840PROCerrorhandle(1,"This is a demonstration version of ATELIER so this function has been disabled,|CALL 0392 437756 to order a proper version of ATELIER, the ultimate art package.","||Continue",selected) 18850 18860REM Bottle draw 18870WHEN47:CASE step% OF 18880WHEN1,2:PROCgetrectangle 18890WHEN3 18900VDU 29,MX;MY; 18910F%=-1:CALL framedraw% 18920WAIT:WAIT 18930VDU 29,MX;MY; 18940F%=-1:CALL framedraw% 18950CALL spin_bottle% 18960WHEN4:PROCpoint(0,0) 18970PROCcopysort 18980steps%=ABS(ys%)/4-1 18990PT%=(!bolpoint%)-1 19000TL=0:FOR R%=1 TO PT% 19010L(R%)=SQR(((FNboltx(R%)-FNboltx(R%-1))^2+(FNbolty(R%)-FNbolty(R%-1))^2)) 19020TL=TL+L(R%) 19030NEXT R% 19040TLP=TL/(steps%-1) 19050TLP=(TL+TLP-1)/(steps%) 19060FOR YP%=0 TO steps% 19070FL=YP%*TLP:GP%=0:FLB=0 19080IF FL<TL THEN 19090REPEAT 19100FLB=FLB+L(GP%) 19110GP%=GP%+1 19120UNTIL FLB>FL 19130ELSE 19140GP%=PT%-1 19150ENDIF 19160GP%=GP%-1 19170IF GP%>PT% THEN GP%=PT%-1 19180IF GP%<1 THEN GP%=1 19190LL=FLB-L(GP%) 19200PL=FL-LL 19210PM=PL/L(GP%) 19220B%(YP%,0)=(((FNboltx(GP%))-(FNboltx(GP%-1)))*PM)+(FNboltx(GP%-1)) 19230B%(YP%,1)=((FNbolty(GP%)-FNbolty(GP%-1))*PM)+FNbolty(GP%-1) 19240NEXT YP% 19250PT%=ABS(y1%-y2%) 19260ST%=ABS(xs%) 19270STCM=360/ST% 19280SB%=0 19290T1%=0:T2%=steps%-1:TS%=1:y1%+=1 19300IF !bot_lean<=90 THEN T1%=steps%-1:T2%=0:TS%=-1:y1%-=2 19310IF !bot_lean>270 THEN T1%=steps%-1:T2%=0:TS%=-1:y1%-=2 19320FOR BT%=T1% TO T2% STEP TS% 19330wedge%=0 19340X%=B%(BT%,0):Y%=B%(BT%,1) 19350SC%=0 19360CT%=-1 19370IF !bot_lean<=180 THEN 19380deg1=-STCM:deg2=360:degs=STCM 19390ELSE 19400deg1=359+STCM:deg2=0:degs=-STCM 19410ENDIF 19420FOR Cd=deg1 TO deg2 STEP degs*2 19430CT%=CT%+1 19440VDU 26 19450CASE !pm% OF 19460WHEN0,1:plt%=FNgcol(x2%-(Cd+1)/STCM+2,y1%-BT%*4+4) 19470WHEN2:plt%=FNgcol(x2%-Cd/STCM-1,y1%-BT%*4) 19480ENDCASE 19490angle=Cd 19500A%=632-((632-X%)*EVAL(botrad$)):B%=Y%:C%=Cd:CALL translate_point% 19510XD%=!bot_xout:YD%=!bot_yout 19520VDU 29,MX;MY; :REM origin 19530IF SB%>0 AND SC%>0 AND plt% THEN 19540MOVE LXD2%,LYD2% 19550MOVE LXD%,LYD%:PLOT &55,XD%,YD% 19560PLOT&55,A%(CT%,0),A%(CT%,1) 19570ENDIF 19580SC%=1 19590LXD%=A%(CT%,0):LYD%=A%(CT%,1) 19600LXD2%=XD%:LYD2%=YD% 19610A%(CT%,0)=XD%:A%(CT%,1)=YD% 19620NEXT Cd 19630REM UNTIL C%*STCM>360 19640SB%=1 19650NEXT BT% 19660PROCupdate 19670VDU 26 19680ENDCASE 19690 19700REM Set Mouse Grid 19710WHEN48:IF FNtext_entry(33,STR$(mousegrid),15) 19720mousegrid=EVAL(out$) 19730IF mousegrid<1 THEN mousegrid=1 19740mgs=1 19750ENDIF 19760PROCreset_entry 19770 19780REM Formula Entry 19790WHEN49:oldform$=formula$:test=FALSE 19800!putit%=1:PROCpoint(0,PNkeyboard) 19810PROCreset_action:CALL uptree% 19820A%=-128:B%=!starty%+56:E%=-1:CALL help% 19830A%=-128:B%=!starty%-!sizey-96:E%=-1:CALL help% 19840REPEAT 19850go=FNinstring(32,126,formula$,formula$,255) 19860P%=formnames% 19870num%=?P%:P%+=1 19880F=0 19890test$="" 19900num2%=?P%:P%+=1 19910FOR R=1 TO num2% 19920test$=test$+CHR$(?P%) 19930P%+=1:NEXT 19940IF formula$=test$ THEN formula$=formulas$(F-1):GOTO 19850 19950F+=1 19960IF F<num% THEN GOTO 19890 19970IF go THEN PROCpoint(0,0):test=FNbuild_formula(formula$,0) 19980UNTIL test OR NOT go 19990IF NOT go THEN formula$=oldform$ 20000!formula=0 20010CALL liftup%:CALL putbackground% 20020PROCreset_entry 20030 20040WHEN50,54,53:CASE step% OF 20050REM FORMULA COPY 20060WHEN1,2:PROCgetrectangle 20070WHEN3: 20080VDU 29,MX;MY; 20090F%=-1:CALL formframedraw% 20100WAIT:WAIT 20110VDU 29,MX;MY; 20120F%=-1:CALL formframedraw% 20130WHEN4:PROCcopysort 20140xsteps=720/(xs%/2):ysteps=720/(ys%/4) 20150IF !Ac%=53 THEN 20160PROCpoint(0,PNcalculator) 20170max=-65536 20180min=65536 20190ofm=0 20200FOR XD=-360 TO 360 STEP xsteps 20210wedge%=0 20220FOR YD=360 TO -360 STEP ysteps 20230XR=RAD(XD) 20240YR=RAD(YD) 20250IF !formula=0 THEN FM=EVAL(formula$) ELSE FM=EVAL(formulas$(!formula-1)) 20260FD=ofm-FM 20270IF YD<360 THEN IF FD>max THEN max=FD 20280IF YD<360 THEN IF FD<min THEN min=FD 20290ofm=FM 20300NEXT YD,XD 20310ENDIF 20320YF%=0 20330PROCpoint(0,0) 20340FOR YD=360 TO -360 STEP ysteps 20350wedge%=0 20360FOR XD=-360 TO 360 STEP xsteps 20370XR=RAD(XD) 20380YR=RAD(YD) 20390IF !formula=0 THEN FM=EVAL(formula$) ELSE FM=EVAL(formulas$(!formula-1)) 20400A%=XD:B%=YD:C%=FM:CALL form_translate% 20410npx%=!bot_xout 20420npy%=!bot_yout 20430PX%=((360+XD)/xsteps):PY%=((360+YD)/-ysteps) 20440VDU 4 20450VDU 26 20460xp%=x1%+PX%*2-2:yp%=y2%+PY%*4+3 20470plt%=FNgcol(xp%,yp%) 20480IF XD>-360 AND YD<360 AND plt% THEN 20490IF !Ac%=53 THEN 20500num%=4+(((L(PX%)-FM)-min)/((max-min)/11)) 20510IF num%<4 THEN num%=4:IF testing THEN VDU 7 20520IF num%>15 THEN num%=15:IF testing THEN VDU 7 20530A%=col%:B%=15-num%:CALL calc_intensity% 20540ENDIF 20550VDU 29,MX;MY; 20560MOVE nlpx%,nlpy% 20570MOVE A%((ABS(PX%))-1,0),A%((ABS(PX%))-1,1) 20580PLOT &55,A%(ABS(PX%),0),A%(ABS(PX%),1) 20590PLOT &55,npx%,npy% 20600IF !Ac%=54 THEN 20610CALL colour% 20620MOVE nlpx%,nlpy% 20630DRAW A%((ABS(PX%))-1,0),A%((ABS(PX%))-1,1) 20640DRAW npx%,npy% 20650DRAW A%(ABS(PX%),0),A%(ABS(PX%),1) 20660DRAW nlpx%,nlpy% 20670ENDIF 20680ENDIF 20690L(PX%)=FM 20700nlpx%=A%(ABS(PX%),0) 20710nlpy%=A%(ABS(PX%),1) 20720A%(ABS(PX%),0)=npx% 20730A%(ABS(PX%),1)=npy% 20740ENDIF 20750NEXT XD 20760YF%=1 20770NEXT YD 20780PROCupdate 20790VDU 26 20800ENDCASE 20810 20820REM Rotate copy 20830WHEN51:CASE step% OF 20840WHEN1,2:PROCgetrectangle 20850WHEN3:x3%=MX:y3%=MY 20860WHEN4:PROCshape 20870WAIT:WAIT:PROCshape 20880WHEN5:PROCsmearscreen(x1%,y1%,xs%,ys%) 20890ENDCASE 20900 20910REM AA text input 20920WHEN52:IF FNtext_entry(32,atext$,255) THEN atext$=out$ 20930PROCreset_entry 20940 20950REM Save Compacted Screen 20960WHEN55:IF FNtext_entry(33,$screen_str%,255) THEN 20970PROCpoint(0,1):PROCcompactedsave(0,out$):$screen_str%=out$ 20980ENDIF 20990PROCreset_entry 21000 21010REM Set Print Key Command 21020WHEN56:IF FNtext_entry(32,funcprint$,255) THEN funcprint$=out$ 21030PROCreset_entry 21040 21050REM undo box 21060WHEN57:CASE step% OF 21070WHEN1,2:PROCgetrectangle 21080WHEN3:PROCsortcord 21090A%=x1%:B%=y1%:C%=xs%:D%=-ys% 21100CALL undobox% 21110ENDIF 21120step%=1:PROCreset_action:PROCupdate 21130ENDCASE 21140 21150REM Save System Screen 21160WHEN58:IF FNtext_entry(33,$screen_str%,255) THEN 21170PROCpoint(0,1):OSCLI "SCREENSAVE "+out$:$screen_str%=out$ 21180ENDIF 21190PROCreset_entry 21200 21210REM Title Screen 21220WHEN59:CASE step% OF 21230WHEN1:IF FNsprites=0 THEN PROCtitlesprite 21240WHEN2:PROCreset_action 21250ENDCASE 21260 21270REM Brushes 21280WHEN60,61,62,63,64,65 21290A%=!Ac%-60 21300CASE !rect_brush_mode OF 21310WHEN0:CASE step% OF 21320WHEN1:A%=(MX DIV 2)-16:B%=255-((MY DIV 4)+8) 21330CALL brusheor% 21340WAIT:WAIT:CALL brusheor% 21350WHEN2:REPEAT 21360PROCmouse_handle 21370B%=MX-32:C%=MY+32:CALL brushdraw% 21380UNTIL MB=0 21390ENDCASE 21400WHEN1:CASE step% OF 21410WHEN1,2:PROCgetrectangle 21420WHEN3:PROCpoint(0,0) 21430PROCsortcord 21440B%=x1%:C%=y1%:D%=xs%DIV2:E%=-ys%DIV4 21450CALL brushdraw% 21460PROCupdate 21470ENDCASE 21480WHEN2:CASE step% OF 21490WHEN1:x0%=640:y0%=512 21500CIRCLE x0%,y0%,SQR((MX-x0%)^2+(MY-y0%)^2) 21510WAIT:WAIT 21520CIRCLE x0%,y0%,SQR((MX-x0%)^2+(MY-y0%)^2) 21530R%=SQR((MX-x0%)^2+(MY-y0%)^2) 21540WHEN3:REPEAT 21550PROCmouse_handle 21560AN=RAD(RND(360)):RO%=TAN(RAD(RND(80)))*(R%/10) 21570B%=MX+SIN(AN)*RO% 21580C%=MY+COS(AN)*RO% 21590CALL brushdraw% 21600UNTIL MB=0 21610ENDCASE 21620ENDCASE 21630 21640REM Anti aliased squash 21650WHEN67:CASE step% OF 21660WHEN1,2:PROCgetrectangle 21670WHEN3:x3%=MX:y3%=MY 21680WHEN4:RECTANGLE x3%,y3%,MX-x3%,MY-y3% 21690WAIT:WAIT:RECTANGLE x3%,y3%,MX-x3%,MY-y3% 21700x4%=MX:y4%=MY 21710WHEN5:PROCcopysort 21720x3%=(x3%DIV2)*2 21730x4%=(x4%DIV2)*2 21740y3%=(y3%DIV4)*4 21750y4%=(y4%DIV4)*4 21760IF x3%>x4% THEN temp%=x3%:x3%=x4%:x4%=temp% 21770IF y4%>y3% THEN temp%=y4%:y4%=y3%:y3%=temp% 21780xps%=x4%-x3%+3:yps%=y4%-y3%-7 21790A%=x1% 21800B%=y1% 21810C%=xs%DIV2 21820D%=-ys%DIV4 21830E%=x3% 21840F%=y3% 21850G%=xps%DIV2 21860H%=-yps%DIV4 21870CALL anti_aliased_squash% 21880ENDCASE 21890 21900REM Fuzz 21910WHEN68:CASE step% OF 21920WHEN1:x0%=640:y0%=512 21930CIRCLE x0%,y0%,SQR((MX-x0%)^2+(MY-y0%)^2) 21940WAIT:WAIT 21950CIRCLE x0%,y0%,SQR((MX-x0%)^2+(MY-y0%)^2) 21960R%=SQR((MX-x0%)^2+(MY-y0%)^2) 21970WHEN3 21980REPEAT 21990PROCmouse_handle 22000AN1=RAD(RND(360)):RO1%=TAN(RAD(RND(80)))*(R%/10) 22010AN2=RAD(RND(360)):RO2%=TAN(RAD(RND(80)))*(R%/10) 22020A%=MX+SIN(AN1)*RO1% 22030B%=MY+COS(AN1)*RO1% 22040C%=MX+SIN(AN2)*RO2% 22050D%=MY+COS(AN2)*RO2% 22060CALL swap_pixels% 22070UNTIL MB=0 22080ENDCASE 22090 22100REM Options 22110WHEN69,70,78,79 22120CASE !Ac% OF 22130WHEN69:select=TRUE 22140WHEN70:select=FALSE 22150WHEN78:!left_handed=0 22160WHEN79:!left_handed=1 22170ENDCASE 22180PROCreset_action 22190 22200REM Pixellate 22210WHEN71:CASE step% OF 22220WHEN1,2:PROCgetrectangle 22230WHEN3:PROCsortcord 22240gsx%=ABS(x1%-MX):gsy%=ABS(y1%-MY) 22250gsx%=(gsx% DIV 2)*2 22260gsy%=(gsy% DIV 4)*4 22270IF gsx%<4 THEN gsx%=4 22280IF gsy%<8 THEN gsy%=8 22290PROCpixgrid 22300WAIT:WAIT 22310PROCpixgrid 22320WHEN4:PROCpoint(0,0) 22330FOR gy%=y1% TO y2% STEP -gsy% 22340FOR gx%=x1% TO x2% STEP gsx% 22350sx%=gsx%:sy%=gsy% 22360IF gx%+sx%>x2% THEN sx%-=gx%+sx%-x2%-2 22370IF gy%-sy%<y2% THEN sy%-=y2%-(gy%-sy%)-4 22380A%=gx%:B%=gy%:C%=sx%DIV2:D%=sy%DIV4 22390CALL COLaverage% 22400NEXT 22410NEXT 22420MOUSE RECTANGLE 0,0,1279,1023 22430PROCupdate 22440ENDCASE 22450 22460REM Copy Fill 22470WHEN72:CASE step% OF 22480WHEN1,2:PROCgetrectangle 22490WHEN3:px%=MX:py%=MY 22500WHEN4:PROCcopysort:PROCpoint(0,0) 22510GCOL 128+POINT(MX,MY) TINT TINT(MX,MY) 22520IF !fill_style=0 OR !fill_style=3 THEN !fill_style=2 22530CASE !fill_style OF 22540WHEN1,2,3: 22550CALL bit_map_scan_A% 22560PLOT&85,MX,MY 22570A%=x1%DIV2:B%=y1%DIV4:C%=xs%DIV2:D%=-ys%DIV4 22580CASE !fill_style OF 22590WHEN1,2:CALL copy_fill% 22600WHEN3:REM Should be full mapping. 22610ENDCASE 22620ENDCASE 22630PROCupdate 22640ENDCASE 22650 22660REM Save Compacted Sprite 22670WHEN73:IF FNtext_entry(33,$screen_str%,255) THEN 22680PROCpoint(0,1):PROCcompactedsave(1,out$) 22690area$=STR$(xs%*ys%) 22700per$=LEFT$(STR$(cs%/(xs%*ys%)*100),4) 22710IF INKEY(-1) THEN PROCerrorhandle(1,"Compaction Report|Size: "+STR$(xs%)+"x"+STR$(ys%)+"|Area in bytes: "+area$+"|Bytes used: "+STR$(cs%)+"|Percentage: "+per$," ",selected) 22720$screen_str%=out$ 22730ENDIF 22740PROCreset_entry 22750 22760REM Compacted Get 22770WHEN74:CASE step% OF 22780WHEN1,2:PROCgetrectangle 22790WHEN3:PROCsortcord 22800!com_x1=x1% 22810!com_y1=y1% 22820!com_x2=x2% 22830!com_y2=y2% 22840ENDCASE 22850 22860REM Mode 15 to 13 convert 22870WHEN75:CASE step% OF 22880WHEN1,2:PROCgetrectangle 22890WHEN3:PROCsortcord:xs%-=2:ys%+=4:px%=MX:py%=MY 22900RECTANGLE px%,py%,xs%/2,-ys% 22910WAIT:WAIT 22920RECTANGLE px%,py%,xs%/2,-ys% 22930WHEN4:PROCsortcord 22940A%=x1%:B%=y1%:C%=xs%DIV4:D%=-ys%DIV4:E%=px%:F%=py%-ys%-4 22950CALL COLmode15_13resize% 22960ENDCASE 22970 22980REM Colour Average Area 22990WHEN76:CASE step% OF 23000WHEN1,2:PROCgetrectangle 23010WHEN3:PROCsortcord 23020A%=x1%:B%=y1%:C%=xs%DIV2:D%=-ys%DIV4 23030CALL COLaverage% 23040ENDCASE 23050 23060REM Update Font List 23070WHEN77 23080CALL fontlistinit% 23090PROCreset_action 23100 23110REM 3 point curve 23120WHEN80:CASE step% OF 23130WHEN1:x1%=MX:y1%=MY 23140WHEN2:x2%=MX:y2%=MY 23150MOVE x1%,y1%:DRAW x2%,y2% 23160WAIT:WAIT 23170MOVE x1%,y1%:DRAW x2%,y2% 23180WHEN3:x3%=MX:y3%=MY 23190PROCcurve(20):WAIT:WAIT:PROCcurve(20) 23200WHEN4:PROCcurve(1) 23210ENDCASE 23220 23230REM Bottle Wall Formula 23240WHEN81:IF FNtext_entry(32,botrad$,255) THEN botrad$=out$ 23250PROCreset_entry 23260 23270REM Undo Brush 23280WHEN82:CASE step% OF 23290WHEN1:A%=(MX DIV 2)-16:B%=255-((MY DIV 4)+8) 23300CALL brusheor% 23310WAIT:WAIT:CALL brusheor% 23320WHEN2:REPEAT 23330PROCmouse_handle 23340A%=(MX DIV 2)-16:B%=255-((MY DIV 4)+8) 23350CALL brushundo% 23360UNTIL MB=0 23370ENDCASE 23380 23390ENDCASE 23400ENDPROC 23410 23420DEFPROCcurve(r%) 23430PLOT &45,x1%,y1% 23440xs%=x1%-x2%:ys%=y1%-y2% 23450xs2%=(x1%-xs%/2)-x3%:ys2%=(y1%-ys%/2)-y3% 23460IF r%<>1 THEN 23470s%=r% 23480ELSE 23490IF ABSxs%>ABSys% THEN s%=ABSxs% ELSE s%=ABSys% 23500ENDIF 23510FOR st=1/s% TO 1-1/s% STEP 1/s% 23520x%=x1%-(xs%*st)-(xs2%*SINRAD(st*180)) 23530y%=y1%-(ys%*st)-(ys2%*SINRAD(st*180)) 23540PLOT &25,x%,y% 23550NEXT 23560PLOT &25,x2%,y2% 23570ENDPROC 23580 23590DEFFNtext_entry(sl%,in$,len%) 23600!putit%=1 23610PROCpoint(0,PNkeyboard) 23620PROCreset_action:CALL uptree% 23630A%=-128:B%=!starty%+56:E%=-1:CALL help% 23640A%=-128:B%=!starty%-!sizey-96:E%=-1:CALL help% 23650step%=1 23660go=FNinstring(sl%,126,in$,out$,len%) 23670CALL liftup%:CALL putbackground% 23680=go 23690 23700DEFPROCreset_entry 23710CALL liftdown%:VDU5:CALL helptext%:PROCupdate 23720ENDPROC 23730 23740DEFPROCeval_error_cheat 23750LOCAL ERROR 23760ON ERROR LOCAL eval$="":VDU7:t$=REPORT$:RESTORE ERROR:ENDPROC 23770IF ASC(eval$)=126 THEN t$=STR$~(EVAL(MID$(eval$,2))) ELSE t$=STR$(EVAL(eval$)) 23780RESTORE ERROR 23790ENDPROC 23800 23810DEFPROCcompactedsave(t%,fn$) 23820LOCAL ERROR 23830ON ERROR LOCAL CALL undosave%:RESTORE ERROR:ERROR 99,REPORT$:ENDPROC 23840OSCLI"DefineBuffer "+STR$(STORE%)+" &28000" 23850CASE t% OF 23860WHEN0:OSCLI"Com_Save "+fn$+" 0 0 1279 1023 0" 23870WHEN1:IF ?(flags%+1)=0 THEN tl%=behind% ELSE tl%=0 23880OSCLI"Com_Save "+fn$+" "+STR$(!com_x1)+" "+STR$(!com_y1)+" "+STR$(!com_x2)+" "+STR$(!com_y2)+" "+STR$(tl%) 23890ENDCASE 23900cs%=10 23910xs%=10 23920ys%=10 23930CALL undosave% 23940RESTORE ERROR 23950ENDPROC 23960 23970DEFPROCcompressedsave(fn$) 23980LOCAL ERROR 23990ON ERROR LOCAL CALL undosave%:RESTORE ERROR:ERROR 99,REPORT$:ENDPROC 24000$cat%=fn$ 24010CALL compactedsave% 24020CALL undosave% 24030RESTORE ERROR 24040ENDPROC 24050 24060DEFPROCpixgrid 24070RECTANGLE x1%,y1%,xs%,ys% 24080FOR X%=x1%+gsx% TO x2% STEP gsx% 24090LINE X%,y1%,X%,y2% 24100NEXT 24110FOR Y%=y1%-gsy% TO y2% STEP -gsy% 24120LINE x1%,Y%,x2%,Y% 24130NEXT 24140ENDPROC 24150 24160DEFFNsprites 24170CALL checksprites% 24180=!OUT 24190 24200DEFFNput_check 24210IF FNsprites>0 THEN =TRUE 24220PROCreset_action 24230IF !Ac%=37 OR !Ac%=40 THEN !Ac%=38:ERROR 99,"No Sprites Present. Unable to Restore Action, Setting Action to Sprite Get." 24240=FALSE 24250 24260DEFPROCtitlesprite 24270LOCAL ERROR 24280ON ERROR LOCAL RESTORE ERROR:ENDPROC 24290MOVE 52,711:MOVE 274,932:*SGET Diamond 24300RESTORE ERROR:ENDPROC 24310 24320REM formula functions 24330 24340DEF FNradiusR 24350=SQR(XR^2+YR^2) 24360 24370DEF FNradiusD 24380=SQR(XD^2+YD^2) 24390 24400DEF FNdepth 24410LOCAL r%,g%,b%,t% 24420t%=(col% AND 192)>> 6 24430r%=t%+(col% AND 3)<<2 24440g%=t%+(col% AND 12) 24450b%=t%+(col% AND 48)>>2 24460t%=r% 24470IF g%>t% THEN t%=g% 24480IF b%>t% THEN t%=b% 24490=t%/15 24500 24510DEF FNwedge(up%,down%) 24520IF col%=up% THEN wedge%+=1 24530IF col%=down% THEN wedge%-=1 24540=wedge% 24550 24560DEFPROCsmearscreen(x1%,y1%,xs%,ys%) 24570PROCcopysort 24580c1%=(px1%-px4%) 24590c2%=(py1%-py4%) 24600c3%=(ys%) 24610c4%=(xs%) 24620c5%=(px2%-px1%) 24630c6%=(py2%-py1%) 24640c7%=(px3%-px4%)-c5% 24650c8%=(py3%-py4%)-c6% 24660PROCpoint(0,0) 24670FOR yp%=y1% TO y1%+ys% STEP SGN(ys%)*4 24680arx%=0 24690FOR xp%=x1% TO x1%+xs% STEP SGN(xs%)*2 24700IF yp%=y1% THEN A%(arx%,0)=FNnpx(xp%,yp%):A%(arx%,1)=FNnpy(xp%,yp%):GOTO 24800 24710IF arx%=0 THEN nplx%=FNnpx(xp%,yp%):nply%=FNnpy(xp%,yp%):GOTO 24780 24720plt%=FNgcol(xp%-2,yp%+4) 24730MOVE tx%,ty% 24740MOVE A%(arx%,0),A%(arx%,1) 24750IF plt% THEN PLOT &55,nplx%,nply% 24760nplx%=FNnpx(xp%,yp%):nply%=FNnpy(xp%,yp%) 24770IF plt% THEN PLOT &55,nplx%,nply% 24780tx%=A%(arx%,0):ty%=A%(arx%,1) 24790A%(arx%,0)=nplx%:A%(arx%,1)=nply% 24800arx%=arx%+1 24810NEXT xp%,yp% 24820step%=1 24830ENDCASE 24840PROCupdate 24850ENDPROC 24860 24870DEF FNnpx(PX,PY) 24880w1=((PY-y1%)/c3%) 24890w2=((PX-x1%)/c4%) 24900=px1%-(c1%*w1)+(c5%+c7%*w1)*w2 24910 24920DEF FNnpy(PX,PY) 24930=py1%-(c2%*w1)+(c6%+c8%*w1)*w2 24940 24950DEF FNatn(X,Y) 24960IF ABS(Y)>0 THEN A=DEG(ATN(X/Y)) ELSE A=90+180*(X<0) 24970IF Y<0 THEN A=A+180 24980=A 24990 25000DEF FNradius(X,Y) 25010=SQR(X^2+Y^2) 25020 25030DEFPROCshape 25040A=FNatn(MX-x3%,MY-y3%) 25050D=FNradius(MX-x3%,MY-y3%) 25060OA1=2*(DEG(ATN(ABS(xs%)/ABS(ys%)))) 25070OA2=180-OA1 25080px1%=x3%+D*SIN(RAD(A)) 25090py1%=y3%+D*COS(RAD(A)) 25100px2%=x3%+D*SIN(RAD(A+OA1)) 25110py2%=y3%+D*COS(RAD(A+OA1)) 25120px3%=x3%+D*SIN(RAD(A+OA1+OA2)) 25130py3%=y3%+D*COS(RAD(A+OA1+OA2)) 25140px4%=x3%+D*SIN(RAD(A-OA2)) 25150py4%=y3%+D*COS(RAD(A-OA2)) 25160MOVE px1%,py1% 25170GCOL 3,3 25180DRAW px2%,py2% 25190GCOL 3,63 25200DRAW px3%,py3% 25210DRAW px4%,py4% 25220DRAW px1%,py1% 25230ENDPROC 25240 25250DEF FNformx(xpos,ypos,upval) 25260rd=FNradius(xpos,ypos) 25270an=RAD(FNatn(xpos,ypos)) 25280an=an+offset 25290=mx%+SIN(an)*rd*(xs2%/720) 25300 25310DEF FNformy(xpos,ypos,upval) 25320=my%+COS(an)*rd*(ys2%/720)*COS(lean)+upval*SIN(lean) 25330 25340DEF FNboltx(A) 25350=!(xget%+A*4) 25360DEF FNbolty(A) 25370=!(yget%+A*4) 25380 25390DEFPROCoscliaction 25400LOCAL ERROR 25410*POINTER 0 25420*FX 4,0 25430*FX 229,0 25440SYS "OS_RestoreCursors" 25450PROCreset_action 25460PROCsetsoftkeys 25470CALL uptree% 25480PRINT 25490ON ERROR LOCAL PRINT:PRINT REPORT$ 25500REPEAT 25510INPUT "*"out$ 25520IF LEFT$(out$,8)<>"MENU OFF" THEN OSCLI out$ 25530UNTIL LEFT$(out$,8)="MENU OFF" OR MODE<>15 OR out$="" 25540IF MODE<>15 THEN MODE 15 25550*FX 229,1 25560SYS "OS_RemoveCursors" 25570!putit%=1:CALL putbackground% 25580RESTORE ERROR 25590REM VDU 21 25600*FX 4,1 25610PROCunsetsoftkeys 25620PROCpoint(0,0) 25630IF LEFT$(out$,8)="MENU OFF" THEN OSCLI MID$(out$,9) 25640IF MODE<>15 THEN MODE 15:!putit%=1:CALL putbackground% 25650CALL liftdown% 25660PROCupdate 25670ENDPROC 25680 25690DEFPROCdumpererror 25700P%=!printmenu% 25710[OPT0 25720EQUS"< Printer Dumps" 25730EQUB1:EQUB255 25740EQUS"Not Installed":EQUB 0:EQUB 33 25750] 25760ENDPROC 25770 25780DEFPROCcheckdumper 25790LOCAL ERROR 25800ON ERROR LOCAL PROCdumpererror:RESTORE ERROR:ENDPROC 25810P%=!printmenu% 25820OSCLI ("SCREENDUMPIDS &"+STR$~(P%)) 25830RESTORE ERROR 25840ENDPROC 25850 25860DEFPROCgetrectangle 25870CASE step% OF 25880WHEN1:x1%=MX:y1%=MY 25890WHEN2:RECTANGLE x1%,y1%,MX-x1%,MY-y1% 25900WAIT:WAIT:RECTANGLE x1%,y1%,MX-x1%,MY-y1% 25910xs%=MX-x1%:ys%=MY-y1% 25920x2%=MX:y2%=MY 25930ENDCASE 25940ENDPROC 25950 25960DEFPROCsortcord 25970x1%=(x1%DIV2)*2 25980x2%=(x2%DIV2)*2 25990y1%=(y1%DIV4)*4 26000y2%=(y2%DIV4)*4 26010IF x1%>x2% THEN temp%=x1%:x1%=x2%:x2%=temp% 26020IF y2%>y1% THEN temp%=y2%:y2%=y1%:y1%=temp% 26030xs%=x2%-x1%+3:ys%=y2%-y1%-7 26040ENDPROC 26050 26060DEF FNgcol(xp%,yp%) 26070IF !pm%<>2 THEN 26080GCOL POINT(xp%,yp%) TINT TINT(xp%,yp%) 26090col%=POINT(xp%,yp%)+TINT(xp%,yp%) 26100=TRUE 26110ELSE 26120A%=xp%DIV2:B%=(-ys%-yp%)DIV4 26130CALL spritepix% 26140col%=!RESULTX 26150=!spritemask 26160ENDIF 26170 26180DEFPROCspritesort 26190CALL spriteinit% 26200x1%=0:y1%=4*!sprint_ysize 26210xs%=2*!sprint_xsize 26220ys%=-4*!sprint_ysize 26230x2%=xs% 26240y2%=0 26250ENDPROC 26260 26270DEFPROCcopysort 26280wedge%=0 26290CASE !pm% OF 26300WHEN0,1:REM solid,pattern 26310PROCsortcord 26320WHEN2:REM sprite 26330PROCspritesort 26340ENDCASE 26350ENDPROC 26360 26370DEFFNinstring(min,max,in$,RETURN out$,length) 26380l%=!sizex/8-2 26390*FX 4,1 26400*FX 229,1 26410OMX=-1:OMY=-1 26420XP=!startx%+6:YP=!starty%-48 26430MOVE XP,YP:VDU 5 26440out$=in$:posit%=LEN(out$)+1:of%=posit%-l%+1:IF of%<1 THEN of%=1 26450GCOL 0,5 TINT 64:PRINT">"; 26460REPEAT 26470MOVE XP+16,YP: 26480GCOL 0,(BACKCOL% AND 63) TINT (BACKCOL% AND 192) 26490PRINTSTRING$(l%,CHR$(255)) 26500GCOL 0,(textcol% AND 63) TINT (textcol% AND 192) 26510MOVE XP+16,YP:PRINTMID$(out$,of%,l%) 26520GCOL 3,63 TINT 192 26530RECTANGLE FILL XP+(posit%-of%+1)*16,YP,16,-28 26540REPEAT 26550MOUSE DX,DY,MB 26560IF DX<>OMX OR DY<>OMY THEN PROCpoint(0,PNkeyboard) 26570A$=INKEY$(0) 26580IF A$<>"" THEN *POINTER 0 26590UNTIL A$<>"" OR MB>0 26600OMX=DX:OMY=DY 26610RECTANGLE FILL XP+(posit%-of%+1)*16,YP,16,-28 26620MOVE XP+16,YP 26630i$="":IF ASC(A$)>min-1 AND ASC(A$)<max+1 THEN i$=A$ 26640IF ASC(A$)=163 THEN i$=A$ 26650IF ASC(A$)=21 THEN out$="":of%=1:posit%=1 26660IF LEN(out$)=length AND i$<>"" THEN VDU 7 26670IF i$<>"" AND LEN(out$)<length THEN out$=LEFT$(out$,posit%-1)+A$+MID$(out$,posit%):posit%=posit%+1 26680IF ASC(A$)=127 THEN 26690IF posit%>1 THEN out$=LEFT$(out$,posit%-2)+MID$(out$,posit%):posit%=posit%-1 ELSE VDU 7 26700ENDIF 26710IF ASC(A$)=136 THEN posit%=posit%-1 26720IF ASC(A$)=137 THEN posit%=posit%+1 26730IF (posit%-of%+1)>l% THEN of%+=1 26740IF (posit%-of%)<4 THEN of%=posit%-4 26750IF of%<1 THEN of%=1 26760IF posit%<1 THEN posit%=1 26770IF posit%>LEN(out$)+1 THEN posit%=LEN(out$)+1 26780IF ASC(A$)=27 THEN =FALSE 26790IF MB=1 THEN =FALSE 26800UNTIL ASC(A$)=13 OR MB=4 26810VDU 4:*FX 4,0 26820=NOT (LEN(out$)=0) 26830 26840DEFPROCsetcol 26850GCOL 0,(textcol% AND 63) TINT (textcol% AND 192) 26860GCOL 0,128+(BACKCOL% AND 63) TINT (BACKCOL% AND 192) 26870ENDPROC 26880 26890DEFPROCpoint(L,N) 26900P%=PO%+N*267 26910SYS &400D8,2,P%+11,32,32,P%?9,P%?10 26920MOUSE COLOUR 1,P%?0,P%?1,P%?2 26930MOUSE COLOUR 2,P%?3,P%?4,P%?5 26940MOUSE COLOUR 3,P%?6,P%?7,P%?8 26950OSCLI "FX 106,"+STR$(2 OR L<<7) 26960ENDPROC 26970 26980DEF FNbuild_formula(A$,pos%) 26990REM A$=eval of the formula,pos=formula number 27000LOCAL ERROR 27010ON ERROR LOCAL RESTORE ERROR:=FALSE 27020FOR Y%=0 TO 20 27030FOR X%=0 TO 20 27040XD=X%*36-360 27050YD=Y%*36-360 27060XR=RAD(XD):YR=RAD(YD) 27070A=(EVAL(A$)<<8) 27080!(skel%+pos%*1764+(X%+21*Y%)*4)=A 27090NEXT 27100NEXT 27110RESTORE ERROR 27120=TRUE 27130 27140DEFPROCformula_load(filename$) 27150REM reads and descifers a formula list 27160SYS "OS_Find",&40,filename$ TO handle% 27170formulas%=1 27180P%=formnames% 27190[OPT 0 27200EQUB 7 27210EQUB 10 27220EQUS "Defineable" 27230] 27240name$="":formulas$(formulas%-1)="":past%=FALSE 27250REPEAT 27260SYS "OS_GBPB",4,handle%,log_scale%,1 TO ,,,finish% 27270b%=?log_scale%:cr%=(b%=10 OR b%=13) 27280IF cr% THEN 27290IF past% THEN 27300IF FNbuild_formula(formulas$(formulas%-1),formulas%) THEN ?P%=LEN(name$):P%+=1:$P%=name$:P%+=LEN(name$):formulas%+=1 27310ENDIF 27320name$="":formulas$(formulas%-1)="":past%=FALSE 27330ELSE 27340IF past% THEN formulas$(formulas%-1)+=CHR$(b%) 27350IF b%=ASC("$") THEN past%=TRUE 27360IF NOT past% THEN name$+=CHR$(b%) 27370ENDIF 27380UNTIL finish%=1 27390?formnames%=formulas% 27400SYS "OS_Find",&00,handle% 27410ENDPROC 27420 27430DEFPROCupdate 27440IF (mgs AND mousegrid>2) OR mcs THEN l=1 ELSE l=0 27450CASE !Ac% OF 27460WHEN12:PROCpoint(l,PNglass) 27470WHEN13:PROCpoint(l,PNflood):CALL mousecolour% 27480WHEN21,33,34:PROCpoint(l,PNspray):CALL mousecolour% 27490WHEN37,38:PROCpoint(l,PNspriteop) 27500WHEN31,32,35:PROCpoint(l,PNbrush) 27510WHEN41:PROCpoint(0,PNspray) 27520WHEN59:PROCpoint(l,PNA) 27530OTHERWISE:PROCpoint(l,PNnormal):CALL mousecolour% 27540ENDCASE 27550ENDPROC 27560 27570DEFPROCerror_at 27580VDU 26 27590IF ERR=17 THEN 27600step%=1:PROCpoint(0,PNstopped) 27610CALL liftdown% 27620FOR R%=0 TO 20000:NEXT 27630PROCupdate 27640ENDPROC 27650ENDIF 27660IF !lastmenu=12 OR !lastmenu=30 THEN CALL uptree% 27670VDU 7 27680CASE testing OF 27690WHENFALSE:PROCerrorhandle(1,"An Error Has Occured,|"+REPORT$,"Continue",selected) 27700WHENTRUE:PROCerrorhandle(3,"An Error Has Occured,|"+REPORT$+"|At line "+STR$(ERL),"Edit This Line|Edit Last Line|Continue",selected) 27710*FX 15,0 27720IF selected=1 THEN PROCstring_to_buffer("ED. "+STR$(ERL)+CHR$(13)) 27730IF selected=2 THEN PROCstring_to_buffer("ED.."+CHR$(13)) 27740IF selected=1 OR selected=2 THEN END 27750ENDCASE 27760step%=1 27770IF !lastmenu<>1 AND !lastmenu<>9 THEN !presentmenu%=!lastmenu 27780ENDPROC 27790 27800DEFPROCerrorhandle(N,message$,question$,RETURN selected) 27810IF MODE<>15 THEN MODE 15:SYS "OS_RemoveCursors" 27820*FX229,1 27830PROCpoint(0,PNquestion) 27840MOUSE RECTANGLE 256,331,768,372 27850A%=N:CALL draw_error_box% 27860VDU 28,32,19,59,12 27870COLOUR 128+(BACKCOL% AND 63) TINT (BACKCOL% AND 192) 27880COLOUR (textcol% AND 63) TINT (textcol% AND 192) 27890PROCstrhandle(message$) 27900SYS "OS_PrettyPrint",BUFF% 27910COLOUR 63 TINT 192 27920PRINTTAB(0,5); 27930PROCstrhandle(question$+" ?") 27940SYS "OS_PrettyPrint",BUFF% 27950PROCBUTOFF(7) 27960REPEAT 27970MOUSE DX,DY,ChB 27980IF ChB>0 AND DX>308 AND DX<463 AND DY<653 AND DY>516 AND ChB<>2 THEN !presentmenu%=0:!lastmenu=0:ChB=2:!treepos=0:!Ac%=0 27990UNTIL ChB=2 OR (ChB>0 AND DX>300 AND DX<474 AND DY<484 AND DY>368) 28000PROCBUTOFF(7) 28010CALL undorestore% 28020PROCupdate 28030CALL liftdown% 28040VDU5:CALL helptext% 28050F%=step%:CALL helpstep% 28060selected=INT((484-DY)/120*N)+1 28070IF ChB=2 THEN enter%=10:selected=-1 28080ENDPROC 28090 28100DEFPROCstrhandle(string$) 28110out$="" 28120FOR R=1 TO LEN(string$) 28130ch$=MID$(string$,R,1) 28140IF ch$="|" THEN ch$=CHR$(13) 28150out$=out$+ch$ 28160NEXT 28170$BUFF%=out$+CHR$(0) 28180ENDPROC 28190 28200DEFPROCsetlimits(LMX,LMY) 28210mrctx1%=-LMX+2 28220mrcty1%=-LMY+4 28230mrctx2%=1277+LMX 28240mrcty2%=1019+LMY 28250ENDPROC
�> <Atelier$Dir>.Atelier 3� By Simon Clay Copyright (c) Simon Clay, 1989 : version$="1.01" ( 2 <�:�error(�,�$,�,�) F �init P�:�error(�,�$,�,�):�report Z�normpoint d`� �okfile_at(start_file$,-1,start_t%) � t%=start_t%:start_t%=-1:�loadfile(start_file$,-1,t%) n x� �(ș "Wimp_PollIdle",,q%,1E9 � reason% ��respond(reason%) � �quit% � �quit �� � ���respond(reason%) ��waitpoint �Ȏreason%� ��0: ��1: �9�2:�open(!q%,q%!4,q%!8,q%!12,q%!16,q%!20,q%!24,q%!28) ��3:�closew(!q%) �4: �5: .�6:�mouse(!q%,q%!4,q%!8,q%!12,q%!16,q%!20) "�7:�enddrag ,�8: 6�9:�menuselect @�10 J�11 T�12 ^�17,18:�umess1 h�19:�umess2 r� |�normpoint �� � ���quit:�normpoint ��debug:�tidy:� �2$q%="TASK":ș "Wimp_CloseDown",taskhandle%,!q% �Ș � � ��init �� q% 2500, workbuf% 100 �appl$="Atelier" ��findmos �waiter%=0:�waitpoint �Dș "OS_GetEnv" � SA$:� �SA$,7,5)="-quit" � testing=� � testing=� �init_at �checkmos *fx229,1 &wimpsaved%=� 0$v%=�initwimp:�v%<180:�12:�err(2) :)quit%=�:dialogue%=-1E9:stopreason%=-1 Dackpending%=�:ackref%=-1 Ndragreason%=-1:help$="" Xsavereason%=-1 b�defws:�defmenus:�version lcheckref%=-1 vas$="Are you sure ?" ��baricon �� find start bit �start_file$="":start_t%=-1 �� � �+� � � start_file$="":start_t%=-1:� �TtC �ș "OS_GetEnv" � r0,r1,r2 � A$="" �&� ?r0<>0 � A$+=�(?r0):r0+=1:� �dFB �-� �A$," ")<>0 � A$=�A$,�A$," ")+1):� �dPB �� A$<>"" � � ș "OS_File",5,A$ � r0,r1,r2 �� r0=1 � �>� ((r2 � &FFF00000)=&FFF00000) � start_t%=(r2 � &FFF00)>>8 start_file$=A$ � � � *� end start bit 4� > H ��version R/�T$:T$=version$:笤prod:T$+=" *UNFINISHED*" \�seti(w_pinfo%,4,"v"+T$) f� p z,ݤprod=�version$,�version$,".")+1,1)="0" �ݤdebug=��prod ��-1��-2 � �ݤinitwimp �E$q%="TASK":ș "Wimp_Initialise",200,!q%,"Atelier"�!q%,taskhandle% �=!q% � � ��tidy ��normpoint ��4:�0,2);:*fx4 �*fx225,1 � *fx229 ��:�:�" ";�:� �� ��baricon *!q%=-1:q%!4=0:q%!8=0:q%!12=64:q%!16=68 $-q%!20=%11000000000010:$(q%+24)="!Atelier" .$ș"Wimp_CreateIcon",,q%�baricon% 8� B L!��error(err%,err$,erl%,quit%) V.�normpoint:dragreason%=-1:@%=&90A:*fx229,1 `�i%,e%,t$,T$ j�debug:err$+=" ("+Þ+")" t� ~��:�error(�,�$,�,�) �9!q%=err%:$(q%+4)=err$:ș"Wimp_ReportError",q%,1,appl$ ��quit%:�quit �� � �*��report:�debug:�4:�:�" @ ";�:�tidy:� �� � � ݤdir � �T$:T$=�ArfVar(appl$+"$Dir") ��T$="":T$="&.!"+appl$+"." ���T$)<>".":T$+="." �=T$ ݤArfVar(A$) � ���=292:="":���:�err(0) ("ș&23,A$,workbuf%,200,0,3�,,L% 2workbuf%?L%=13:=$workbuf% < F��umess1 P-ref%=q%!8:task%=q%!4:�task%=taskhandle%:� Zmess%=q%!16 dȎmess%� n�0:�quit x�1:�datasaved ��2:�savedata ��3:�dataload ��4:ackpending%=� ��5:�dataopen ��6: ��7: ��8:�prequit ��9: � �&502: �-�&400C0:�submenu(q%!20,q%!24,q%!28,q%+32) �� �� � ��dataopen �s%,t% 'file$=�zts(q%+44):s%=q%!36:t%=q%!40 "?�okfile_at(file$,s%,t%)�dataloadack:�loadfile(file$,s%,t%) ,� 6 @��dataload J �s%,t% T'file$=�zts(q%+44):s%=q%!36:t%=q%!40 ^?�okfile_at(file$,s%,t%)�dataloadack:�loadfile(file$,s%,t%) h� r |��datasaved � �s%,t% �'file$=�zts(q%+44):s%=q%!36:t%=q%!40 �(�okfile_at(file$,s%,t%)�datasaveack �� � ���template(T$) ��template1(T$,q%) �� � ���template1(T$,q%) �� c%:$workbuf%=T$ �Jș "Wimp_LoadTemplate",,q%,curbuf%,endbuf%,-1,workbuf%�,,curbuf%,,,,c% �.� c%=0 � � 1,"Template '"+T$+"' not found" � ��defws &�I% 0bufsz%=&1000 :;� buffer% bufsz%:curbuf%=buffer%:endbuf%=buffer%+bufsz% D'ș"Wimp_OpenTemplate",,�dir+"AtFrm" NB�template("stopbox"):q%!64=1:ș"Wimp_CreateWindow",,q%�w_stop% X?�template("save"):q%!64=1:ș"Wimp_CreateWindow",,q%�w_save% b<�template("ProgInfo"):ș"Wimp_CreateWindow",,q%�w_pinfo% lș"Wimp_CloseTemplate" vfree%=endbuf%-curbuf% �� � ���defmenus ��t$ �� mlist% 32,function% 51 �bufsz%=&200 �C� menufree% bufsz%:menuptr%=menufree%:menuend%=menufree%+bufsz% �menustart%=menufree%:�+2 ��t$:m_save%=�crmenu(t$) ڹ�"#Save,Compressed Screen}w_save%,System Screen}w_save%,Super Compacted Screen}w_save%,Super Compacted Sprite}w_save%,System Sprite(s)}w_save%,Brush Shapes}w_save%,Patterns}w_save%" ��t$:m_main%=�crmenu(t$) �/�"#Atelier,Info>w_pinfo%,Save>m_save%,Quit" �� ��front(h%,X%,Y%) �getw(h%) �X%>=0x1%+=X%-x0%:x0%=X% *�Y%>=0y1%+=Y%-y0%:y0%=Y% 4*�open(h%,x0%,y0%,x1%,y1%,scx%,scy%,-1) >� H R ��top(h%) \6�getw(h%):�open(h%,x0%,y0%,x1%,y1%,scx%,scy%,-1):� f p4��open(oh%,ox0%,oy0%,ox1%,oy1%,oscx%,oscy%,obh%) z�O% �'!q%=oh%:ș"Wimp_GetWindowState",,q% � �wimpopen �� � ���wimpopen �5!q%=oh%:q%!4=ox0%:q%!8=oy0%:q%!12=ox1%:q%!16=oy1% �>q%!20=oscx%:q%!24=oscy%:q%!28=obh%:ș"Wimp_OpenWindow",,q% �� � ���closew(!q%) ��I% �ș"Wimp_CloseWindow",,q% �.�!q%=dialogue%:dialreason%=-1:dialogue%=-1 $�dialogue%>=0:�closew(dialogue%) Ȏ!q%� �w_stop%:stopreason%=-1 $� .� 8 B*ݤia(h%,i%):�geti(h%,i%):�chkii:=q%!28 L*ݤva(h%,i%):�geti(h%,i%):�chkii:=q%!32 V*ݤil(h%,i%):�geti(h%,i%):�chkii:=q%!36 ` j3��chkii:�(q%!24�&100)=0�1,"Icon not indirected" t� ~ �<��geti(h%,i%):!q%=h%:q%!4=i%:ș"Wimp_GetIconState",,q%:� � ���stop(r%,T$,U$,T%) �dialreason%=r% ��-3mi%=3:�mstop:� �+�seti(w_stop%,0,T$):�seti(w_stop%,1,U$) �)�unselall(w_stop%):�dialogue(w_stop%) �dialreason%=r% �� � ���dialogue(h%) � �X%,Y% $�dialogue%>=0:�closew(dialogue%) -�nomenu:�readpointer:X%=mx%-200:Y%=my%-85 �X%<0X%=0 �Y%<96Y%=96 (2dialogue%=h%:�front(h%,X%,Y%):�setct(h%,-1,-1) 2� < F!��readpointer:�q%:q%=workbuf% Pș"Wimp_GetPointerInfo",,q% Z1mx%=!q%:my%=q%!4:mb%=q%!8:mh%=q%!12:mi%=q%!16 d� n xݤdialogue �!�dialogue%>=0�mh%<>dialogue%� ��closew(dialogue%) �� �=� � �$��mouse(mx%,my%,mb%,mh%,mi%,mo%) ��dragreason%>=0�mb%>255:� ��dialogue:� � Ȏmb%� ��2:�menu ��1,4:�select ��16,64:�startdrag �� � 6��seti(h%,i%,T$):T$=�T$,�il(h%,i%)):$�ia(h%,i%)=T$ "<�iconupd(h%,i%):�getct:�!q%=h%�q%!4=i%:�setct(h%,i%,�T$) ,� 6 @'��iset(h%,i%,B%,E%):�q%:q%=workbuf% J?!q%=h%:q%!4=i%:q%!12=B%:q%!8=E%:ș"Wimp_SetIconState",,q%:� T ^'��iconupd(h%,i%):�iset(h%,i%,0,0):� h r��readblock(p%) |7x0%=!p%:y0%=p%!4:x1%=p%!8:y1%=p%!12:� physical area �Fscx%=p%!16:scy%=p%!20:bhandle%=p%!24:� scroll offsets, stack depth �Jbx%=x0%-scx%:by%=y1%-scy%:� calculate physical co-ords of logical area �>ex0%=p%!40:ey0%=p%!44:ex1%=p%!48:ey1%=p%!52:� logical area �Agx0%=p%!24:gy0%=p%!28:gx1%=p%!32:gy1%=p%!36:� graphics window �.open%=(p%!28�&10000)<>0:� window open flag �� � ���getw(h%) �&!q%=h%:ș "Wimp_GetWindowInfo",,q% ��readblock(q%+4) �� � ���select Ȏmh%� �-2:enter%=0:�enter_atelier �w_stop%:�mstop &�w_save%:�msave 0� :� D N��mstop X�mi%<3�mi%>4� b%�T%:T%=dialreason%:dialreason%=-1 l�mi%=3� v ȎT%� ��1:�quit �� �� ��closew(w_stop%):� � ���msave ��mi%<>0� �g�T$:T$=$�ia(w_save%,2):�T$=�leaf(T$):�99,"To save, please drag the file icon to a directory viewer" �file$=T$:�savedata1 �� � ���startdrag �"dragreason%=-1:dragbutton%=mb% Ȏmh%� 6�w_save%:�mi%=3:dragreason%=1:�dragicon(w_save%,3) � � * 4 ��enddrag >�readpointer H �mh%<>-1� RȎdragreason%� \#�1:file$=�leaf($�ia(w_save%,2)) f-�savereq(file$,savet%,saves%,savereason%) p� z� �dragreason%=-1 �� � �,��unseli(h%,i%):�iset(h%,i%,&200000,0):� � �0��seli(h%,i%):�iset(h%,i%,&200000,&200000):� � ���unselall(h%) ��I%,i%:�wchi(h%) �(I%=q%:�:i%=!I%:�i%>=0:�unseli(h%,i%) �I%+=4:�i%<0:� � �8��wchi(h%):ș "Wimp_WhichIcon",h%,q%,&200000,&200000 � ��menu $ Ȏmh%� .$�-2:my%=64+3*40:�pop(m_main%,-1) 8� B� L Vݤpar(t$,s$,� i%):�i1% `i1%=i%+1:i%=�t$+s$,s$,i1%) j=�t$,i1%,i%-i1%) t ~ݤcrmenu(menu$) �.�menufree%+28>menuend%�99,"Menu area full" �� m% �menuptr%=menufree% �i%=0 �C� �menu$,1)="#"i%=1:menutitle$=�par(menu$,",",i%)�menutitle$="" �$menuptr%=menutitle$ �;menuptr%?12=7:menuptr%?13=2:menuptr%?14=7:menuptr%?15=0 �3menuptr%!16=196-24:menuptr%!20=40:menuptr%!24=0 �"menuptr%+=28:maxx%=�menutitle$ ��item$=�par(menu$,",",i%) ��menuitem(item$) �� item$="" $m%=menufree%:m%!16=(maxx%*8+6)*2 menufree%=menuptr% =m% (��menuitem(text$) 2.�text$=""menuptr%!-24=(menuptr%!-24)�&80:� <.�menuptr%+24>menuend%��99,"Menu area full" F�i%,flg% Pflg%=&00 Zi%=�text$,">") d<�i%>0subptr%=��text$,i%+1):text$=�text$,i%-1)�subptr%=-1 ni%=�text$,"}") x;�i%>0subptr%=��text$,i%+1):text$=�text$,i%-1):flg%+=&08 �)��text$,1)="#"text$=�text$):flg%+=&02 �;menuptr%!0=flg%:menuptr%!4=subptr%:menuptr%!8=&07000021 ��text$,1)="$"� �2!menuptr%+=&04:menuptr%!8+=&100:i%=�text$,"(") �3�i%>0�L%=��text$,i%+1):text$=�text$,i%-1)�L%=12 �8menuptr%!12=��text$,2):menuptr%!16=-1:menuptr%!20=L% �text$=�L%," ") �� ��text$<=12� �$(menuptr%+12)=text$ �� �%I%=�workspace(�text$+1):$I%=text$ �6menuptr%!12=I%:menuptr%!16=-1:menuptr%!20=�text$+1 menuptr%!8=menuptr%!8 � &100 � �text$>maxx%maxx%=�text$ "� ,menuptr%+=24 6� @ Jݤworkspace(L%) T2� curbuf%+L%>endbuf%�99,"No more buffer space" ^curbuf%+=L%:=curbuf%-L% h r��prep(menu%,tree%) | �I%,T$ ��clearts(menu%) �Ȏmenu%� ��m_main%:�mp_main �� �� � � ��mp_main ��n%,f$,s%,t% � �tree%>0� ��!mlist%=1� �>n%=mlist%!4:�setfile_at(n%,f$,s%,t%):�saveset(f$,t%,n%,s%) �� �� � ��pop(menu%,tree%) &�menu%<0:� 0�prep(menu%,tree%) :-ș "Wimp_CreateMenu",,menu%,mx%-50,my%+32 Dopenmenu%=menu% N� X b��nomenu l(ș"Wimp_CreateMenu",,-1:openmenu%=-1 v� � ���menuselect ��I% �-I%=0:�mlist%!I%=q%!I%:I%+=4:�q%!(I%-4)=-1 ��readpointer �Ȏopenmenu%� ��m_main%:�m_main �� ��mb%=1� �#�pop(openmenu%,mlist%):��nomenu �� �� � ��m_main Ȏ!mlist%� �0:�dialogue(w_pinfo%) !�2:�altered_at:�qquit:��quit *� 4� > H��submenu(menu%,X%,Y%,q%) R � ;{{{{{{ \�I% f-I%=0:�mlist%!I%=q%!I%:I%+=4:�q%!(I%-4)=-1 p�prep(openmenu%,mlist%) z'ș"Wimp_CreateSubMenu",,menu%,X%,Y% �� � � ��clearts(mh%):�I%:I%=mh%+28 �"�mh%<menustart%�mh%>menuend%:� �� �"!I%=!I%��1:I%!8=I%!8��&400000: �I%+=24:�I%!-24�&80 �� � ���shade(mh%,I%) �/mh%!(28+8+24*I%)=mh%!(28+8+24*I%)�&400000:� � ���tick(mh%,I%) 'mh%!(28+24*I%)=mh%!(28+24*I%)�&01:� ݤcommand $ �T%,I%,T$ .ș"OS_GetEnv" � T$ 8�strip(T$) B=T$ L Vݤparam `�I%,T$:T$=�command jI%=�T$," -quit "):�I%=0:="" tT$=�T$,I%+7):�strip(T$) ~1I%=�T$," "):�I%>0T$=�T$,I%+1):�strip(T$):�="" �,I%=�T$," "):�I%>0T$=�T$,I%-1):�strip(T$) �=T$ � �ݤfiletype(T$) �$�T%,U%:ș "OS_File",5,T$ �U%,,T% � �T%=0:=-1 �=(T%�&FFF00)>>8 � ���waitpoint �� os%<>2 � �waiter%+=1 �ș"Hourglass_On" � ��normpoint � os%<>2 � (8ȕwaiter%>0:ș"Hourglass_Off":waiter%-=1:�:waiter%=0 2� < F ��help P� Z d��dataloadack nq%!0=20:q%!12=ref%:q%!16=4 x$ș"Wimp_SendMessage",17,q%,task% �� � ���datasaveack �<�ArfVar("Wimp$Scrap")="":�99,"<Wimp$Scrap> not defined" �A!q%=60:q%!12=ref%:q%!16=2:q%!36=-1:$(q%+44)="<Wimp$Scrap>"+�0 �1ș"Wimp_SendMessage",17,q%,task%:ackref%=q%!8 �� � ���savereq(T$,t%,s%,r%) �savereason%=r% �+q%!32=my%:q%!28=mx%:q%!24=mi%:q%!20=mh% �,q%!16=1:q%!12=0:q%!36=s%:q%!40=t%:!q%=60 �9$(q%+44)=T$+�0:ș"Wimp_SendMessage",17,q%,q%!20,q%!24 saveref%=q%!8:� ��loadmess "$(q%+44)=file$+�0:!q%=60 ,7q%!12=ref%:q%!16=3:ș"Wimp_SendMessage",17,q%,task% 6ackpending%=�:� @ Jݤzts(T%):�T$:T$="" Tȕ?T%<>0:T$+=�?T%:T%+=1:� ^=T$ h r+��getct:ș"Wimp_GetCaretPosition",,q%:� | �>��setct(h%,i%,o%):ș "Wimp_SetCaretPosition",h%,i%,,,-1,o% �� � �ݤleaf(T$) � �I%,C% �$�((�T$,".")=0)�(�T$,":")=0))�=T$ �I%=�(T$) �� �C%=��T$,I%,1) � I%-=1 ��(I%<=0�C%=�"."�C%=�":") ��I%>0�=�T$,�(T$)-I%-1) �=T$ ��scrsz H!workbuf%=4:workbuf%!4=5:workbuf%!8=11:workbuf%!12=12:workbuf%!16=-1 &1ș "OS_ReadVduVariables",workbuf%,workbuf%+24 0Iq%!32=(workbuf%!32)<<(workbuf%!24):q%!36=(workbuf%!36)<<(workbuf%!28) :� D N��saveset(f$,T%,r%,s%) X0savereason%=r%:savef$=f$:savet%=T%:saves%=s% b>�seti(w_save%,2,f$):$�va(w_save%,3)="sfile_"+�"00"+�~T%,3) l� v ���dragicon(h%,i%) ��x%,y%,ys% �,�getw(h%):ys%=y1%-y0%:x%=bx%:y%=y0%-scy% �1�geti(h%,i%):q%!8+=x%:q%!12+=y%+ys%:q%!16+=x% �0q%!20+=y%+ys%:q%!24=0:q%!28=0:!q%=0:�drag5:� � ���drag5:�readpointer:�scrsz �Fq%!24-=mx%-q%!8:q%!28-=my%-q%!12:q%!32+=q%!16-mx%:q%!36+=q%!20-my% �!q%!4=5:ș"Wimp_DragBox",,q%:� � ���savedata ��q%!12<>saveref%:� �file$=�zts(q%+44) �savedata1 � ��savedata1:�closew(w_save%) * �savefile(savereason%,file$) 4savereason%=-1:�loadmess >� H R ��prequit \�altered_at:�ackrec:�qquit f� p z9��ackrec:q%!12=ref%:ș "Wimp_SendMessage",19,q%,task% �:��qquit:�stop(1,"Lose screen and quit Atelier",as$,-1) �� � ���enter_atelier � �:��:��:�restorewimp:��,�$ �#enter%=0:�run_at:�restorewimp:� � ���savefile(n%,f$) � �:��:��:�restorewimp:��,�$ �"�save_at(n%,f$):�restorewimp:� � ���savewimp:�os%=1:� �� wimpsaved% � � wimpsaved%=� &�I%,J%:� SYS"Wimp_CommandWindow",1 �normpoint:mode%=�:�mode15 $ *fx229 .� 8 B��restorewimp:�os%=1:� L� � wimpsaved% � � Vwimpsaved%=� `*fx229,1 jș "Wimp_CommandWindow",-1 tGș "Wimp_SetMode",mode%:�:ș"Wimp_ForceRedraw",-1,-1E9,-1E9,1E9,1E9 ~� � ���mode15 �� ����:��:�99,"Atelier needs to use MODE 15 and there is not enough RAM! You must use the task manager to make at least 160k of screen available" � �15:� � ���findmos:os%=1 ��:��:��:� ��+1 �os%=2:� � ���checkmos:os%=1 �:��:��:�mos12:� �+1 os%=2:� (��mos12 2 �15:� < ș &400C0 Fenter%=0 P�run_at Z�12:*desktop d� n x��store(� A$,f$) ��I%,C%,T$:T$=f$:�T$>""� ��I%=1��T$:C%=��T$,I%) �"�C%>64�C%<91�T$,I%,1)=�(C%+32) �� �� ��T$,"$scrap>")=0A$=f$ �� � � �G� ----ATELIER BITS------------------------------------------------- ���run_at �<� ;{{ here, copy the background screen to the foreground �>� ;{{ and do the biz. NB all ERROR traps etc MUST be LOCAL � �savewimp ��normpoint ,� 23,255,255,255,255,255,255,255,255,255 cat%!0=148 cat%!4=-1 "&ș "OS_ReadVduVariables",cat%,cat% ,!topscreen%=!cat% 6�unsetsoftkeys @ș "OS_RemoveCursors" J�setvectors T� undorestore% ^�enter_action h � colour% r� mousecolour% |� liftdown% ��5:� helptext% ��update ��atelier � � liftup% �� undosave% ��unsetvectors �� PROCsetsoftkeys ��restorewimp �� � ���setvectors �� vectors_set% � � �"ș "OS_Claim",&1D,duff_call%,0 �set_abort_traps vectors_set%=� � & 0��unsetvectors :� � vectors_set% � � D$ș "OS_Release",&1D,duff_call%,0 N�unset_abort_traps Xvectors_set%=� b� l v��enter_action �� � �:�error_at:� �Ȏ enter% � ��0:� no action,just enter ��1:� compacted load � *UnDefine �*SetPosition 0 1023 �'G%=cat%:$cat%=f$:� com_update_info% ��"PlotFile "+f$ �$enter%=0:�store($screen_str%,f$) �5�2:$file_str%=f$ :� sprites - handled by atelier ��3:$cat%=f$ �G%=cat% �� compactedload% � undosave% enter%=0 � � * 4ݤaltered_at >B� ;{{ return TRUE if you would lose any data if they quit just H>� ;{{ now (ie they have altered screen/sprites/brushes etc RC� ;{{ since last save/load. Just return FALSE if you don't care \=� f pݤokfile_at(f$,s%,t%) zI� t%=&D7E � t%=&D3A � t%=&D7F � t%=&D39 � t%=&FF9 � t%=&DE2 � =� � =� � ���loadfile(f$,s%,t%) � �:��:��:�restorewimp:��,�$ �%�load_at(f$,s%,t%):�restorewimp:� � ���load_at(f$,s%,t%) �Ȏ t% � ��&D7F,&FF9,&DE2 �ș "OS_Find",&40,f$ � hdl% �ș "OS_GBPB",4,hdl%,cat%,1 �ș "OS_Find",&00,hdl% �� �Ȏ t% � ;�&D7E:�"LOAD "+f$+" "+�~(brush%):�store($brush_str%,f$) E�&D3A:�"LOAD "+f$+" "+�~(brpatt%):�store($pattern_str%,f$):!pm%=1 �&D7F:enter%=1:�run_at $�&D39:�formula_load(f$) .2�&FF9:enter%=2:�store($sprite_str%,f$):�run_at 82�&DE2:enter%=3:�store($screen_str%,f$):�run_at B� L� V `��save_at(n%,f$) j� savecheck% tȎ n% � ~�0,1,2,3 �=ș "OS_File",&0A,f$,&FFF,,cat%,cat% :� saves dummy file � �savewimp �cat%!0=148:cat%!4=-1 �&ș "OS_ReadVduVariables",cat%,cat% �+!topscreen%=!cat%:ș "OS_RemoveCursors" �� undorestore% �Ȏ n% � �2�0:�compressedsave(f$):�store($screen_str%,f$) �0�1:�"SCREENSAVE "+f$:�store($screen_str%,f$) �3�2:�compactedsave(0,f$):�store($screen_str%,f$) �3�3:�compactedsave(1,f$):�store($screen_str%,f$) �� �restorewimp +�4:�"SSAVE "+f$:�store($sprite_str%,f$) A�5:�"SAVE "+f$+" "+�~(brush%)+" +2000":�store($brush_str%,f$) �"SETTYPE "+f$+" D7E" (B�6:�"SAVE "+f$+" "+�~(brpatt%)+" +2000":�store($brush_str%,f$) 2�"SETTYPE "+f$+" D3A" <� F� P Z#��setfile_at(n%,� f$,� s%,� t%) dA� ;{{ setup up f$ to be filename, s% to estimated size and t% n2� ;{{ to filetype for file of internal type n% x3� ;{{ NB s%<0 means unknown size, try it anyway �Ȏ n% � �)�0:t%=&DE2:f$=$screen_str% :s%=&28000 �)�1:t%=&FF9:f$=$screen_str% :s%=&28000 �%�2:t%=&D7F:f$=$screen_str% :s%=-1 �%�3:t%=&D7F:f$=$screen_str% :s%=-1 �:�4:t%=&FF9:f$=$sprite_str% :ș "OS_SpriteOp",8�,,,,,s% �(�5:t%=&D7E:f$=$brush_str% :s%=&2000 �(�6:t%=&D3A:f$=$pattern_str%:s%=&2000 �� �� � � ��animate �� count=0 � 359 � 18 0MX=640:MY=512:�128+(!pc%�63) Ȝ (!pc%�192):� $step%=happenstep%:�screen_select +�compactedsave(1,"Frame"+�(count � 18)) "� ,� 6 @ ��atelier Jangle=0 T*FX 15,0 ^6� ---------MAIN LOOP----------- h� � � �error_at r� |� � mrctx1%=0 � mrcty1%=0 �mrctx2%=1279 �mrcty2%=1023 � Ȏ !Ac% � �9�35,36:mrctx1%=32:mrcty1%=32:mrctx2%=1216:mrcty2%=960 �(�24:� step%>2 � �setlimits(xs%,-ys%) �D�71:� step%>2 � mrctx1%=x1%:mrcty1%=y2%:mrctx2%=xs%:mrcty2%=-ys% �/�75:� step%>2 � mrctx2%-=xs%�2:mrcty2%+=ys% �a�37,40:� �sprites>0 � � locatesprite%:ș &2E,40,,!sprstr � ,,,xs%,ys%:�setlimits(xs%*2,ys%*4) �� �)ȗ ȓ mrctx1%,mrcty1%,mrctx2%,mrcty2% ��mouse_handle !� MB=2 � enter% � �menucalled AcCODE%=?(!step_codes) happenstep%=(AcCODE% � 15) &"stepcode%=?(!step_codes+step%) 0R� (!pm%=2) � (stepcode% � 64) � step%+=1:�copysort:F%=step%:� helpstep%:� �Tf` : Ȏ !Ac% � D�60,61,62,63,64,65 NȎ !rect_brush_mode � X�0:AcCODE%=AcCODE% � 191 b*�1:happenstep%+=1:AcCODE%=AcCODE% � 64 l(� step%=2 � stepcode%=stepcode% � 16 v+�2:happenstep%+=1:AcCODE%=AcCODE% � 191 �+� step%=1 � stepcode%=stepcode% � 16+32 �� �� �R� (AcCODE% � 64) � step%=happenstep% � step%=1:�BUTOFF(4):F%=step%:� helpstep% �O� � (AcCODE% � 64) � step%=happenstep% � step%=step%-1:F%=step%:� helpstep% � Ȏ � � �0�(� (AcCODE% � 64)) � (step%=happenstep%-1): �5� (MB � 4)=4 � step%=step%+1:F%=step%:� helpstep% � �N� � select � � (MB � 4)=(step% � 1)*4 � step%=step%+1:F%=step%:� helpstep% �I� select � � (MB � 4) � step%=step%+1:F%=step%:� helpstep%:�BUTOFF(4) �� � *FX 229,1 !#� step%=happenstep% � *FX 229,0 !inaction=!Ac% !!� (MB � 1)=1 � �adjustpressed ! E%=-1 !*� stepcode% � 16 � !4Ȏ step% � !>�0,1:C%=MX-x0%:D%=MY-y0% !H�2,3:C%=MX-x1%:D%=MY-y1% !R�4,5:C%=MX-x3%:D%=MY-y3% !\� !fM� stepcode% � 32 � B%=C%*2:C%=D%:� calc_radius%:C%=!RESULTX/2:E%=2 � E%=0 !p� !zA%=MX:B%=MY:� help% !�+� step%=happenstep% � (AcCODE% � 128) � !�Ȗ !� � liftup% !� � colour% !�2� !pm%>0 � (AcCODE% � &20) � � bit_map_scan_A% !��screen_select !�3� !pm%>0 � (AcCODE% � &20) � � bit_map_pattern% !�#� (AcCODE% � 16) � � show_thru% !�� liftdown% !�� !�� 3,63 Ȝ 192 !��screen_select !�� ".keypress%=�(0):� keypress%>0 � �keypressed "*� inaction<>!Ac% � �process_new_action ",� step%<>oldstep% � F%=step%:� helpstep% "$oldstep%=step% ". � !Ac%=20 "8�reset_action "B � os%=1 � "L� testing � "VS�errorhandle(3,"Where to Boss","Basic Program|Source Code|Don't Exit",selected) "`� "jP�errorhandle(2,"Do you really wish to exit from ATELIER","CONFIRM",selected) "t� "~� selected=1 "�� "�)� testing � � selected=1 � selected=2 "�� � testing � � selected=1 "�7� -------------END OF MAIN LOOP ---------- "�� � testing � os%=2 � � "��tidy_at "�*FX 15,0 "�Ȏ selected � "��1: "�*KEY 4 SAVE|MRUN|M "�*FX 138,0,69 "�*FX 138,0,68 # *FX 138,0,46 # *FX 138,0,46 #*FX 138,0,13 #� #(�2: #2*KEY 4 RUN|M #<K�string_to_buffer("LO. ""<Ateli*$Dir>.Sour*.Sou*"""+�(13)+"ED.."+�(13)) #F� #P� #Z� #d #n��adjustpressed #x� !Ac%=82 � !Ac%=59 � #��reset_action #�� #�R� (MB � 1)=1 � step%>1 � step%=step%-1:�BUTOFF(1):�update:F%=step%:� helpstep% #�� #�� #� #���reset_action #�!Ac%=!oldaction% #�� #� #���mouse_handle #�"ȗ MX,MY,MB:� mgs � �mousegrid #�� !left_handed � Ȏ MB � $�%001:MB=%100 $�%011:MB=%110 $�%100:MB=%001 $"�%110:MB=%011 $,� $6� � �(-97) � � $@2� �(-1) � xrst%=MX:yrst%=MY � ȗ � xrst%,yrst% $J� $T $^� �mousegrid $h1MX=((MX+mousegrid � 2) � mousegrid)*mousegrid $r1MY=((MY+mousegrid � 2) � mousegrid)*mousegrid $|� MX<mrctx1% � MX=mrctx1% $�� MY<mrcty1% � MY=mrcty1% $�� MX>mrctx2% � MX=mrctx2% $�� MY>mrcty2% � MY=mrcty2% $�Ȓ � MX,MY $�� $� $���set_action $� Ȏ !Ac% � $��57,59,82,43 $� $�!oldaction%=!Ac% $�� $�� % %��BUTOFF(M) %� %&ȗ DX,DY,MB %0� !left_handed � Ȏ MB � %:�%001:MB=%100 %D�%011:MB=%110 %N�%100:MB=%001 %X�%110:MB=%011 %b� %l� (MB � M)=0 %v� %� %���keypressed %�*FX 15,0 %�Ȏ �(keypress%) � %��"*":enter%=5 %�� %�� (keypress% � 128)=0 � � %�Ȏ keypress% � %�+�&80,&90,&A0,&B0 :� f0-print key %� � liftup% %�� undosave% %��point(0,0) %��(funcprint$) &!� �<>15 � � 15:� undorestore% &�update &� liftdown% & �&B1 &*� undosave% &4 *FX229 &>� 0 &H�2 &R� !Ac%=0 � 82 &\!rect_brush_mode=(!Ac% � 3) &f�"Function ";!Ac% &p� &z� helptext% &�� &�� &��3 &�� 15 &�� undorestore% &�9�&81,&91,&A1,&B1:� liftup%:� undorestore%:� liftdown% &�0�&82,&92,&A2,&B2:step%=1:�set_action:!Ac%=57 &�`�&83,&93,&A3,&B3:� !Ac%<>82 � step%=1:�set_action:!Ac%=82 � !brushsel%=((!brushsel%+1) � 15) &�:�&84,&94,&A4,&B4:!pm%=0:!pc%=�MX,MY)+Ȝ(MX,MY):�update &��&85,&95,&A5,&B5 &�O� !helpstatus% � � helpon%:�5:� helptext%:F%=step%:� helpstep% � � helpoff% &��&86,&96,&A6,&B6 &�mgs=1-mgs:�update '�&87,&97,&A7,&B7 '� testing � keypress%=&A7 � ' *FX229 '$"� liftup%:�animate:� liftdown% '.� '8 � liftup% 'B� undosave% 'L� liftdown% 'V� '`�&88,&98,&A8,&B8 'jC� (testing � keypress%=&88) � (� testing) � �set_action:!Ac%=20 't-� testing � keypress%=&98 � os%=1:!Ac%=20 '~^� testing � keypress%=&A8 � � liftup%:A%=!presentmenu%:G%=MX:H%=MY:� drawmenu%:� liftdown% '�� '�keyin%=(keypress%�&F)-9 '�� keyin%>4 � keyin%=-1 '�� keyin%>-1 � '�&keylevel%=(((keypress%�&F0)>>4)�4) '�Y� �(-3) � function%(keyin%,keylevel%)=!Ac% � !Ac%=function%(keyin%,keylevel%):�update '�� '�� '� '���process_new_action '�� !Ac%=33 � �reset_action '�3�5:� helptext%:F%=1:� helpstep%:step%=1:�update ( � ( (��menucalled (�set_action ((ȗ ȓ 0,0,1279,1023 (2 � liftup% (<!mousebuts=0 (F.� ?(!actionsave)<255 � ?(!actionsave)=!Ac% (P-� 128+(BACKCOL% � 63) Ȝ (BACKCOL% � 192) (ZȎ enter% � (d!�2:A%=7:� downtree%:� sprites (n �5:A%=28:� downtree%:� oscli (x� (�&� enter%=4 � !Ac%=12 � A%=9 � A%=0 (�G%=MX:H%=MY:� menusystem% (�� !Ac%=33 � �reset_action (�step%=1:�update:�BUTOFF(7) (�� !Ac%<>43 � (�� liftdown% (��5:� helptext% (�F%=step%:� helpstep% (�� (�5� ?(!actionsave)<255 � !oldaction%=?(!actionsave) (�enter%=0 (�� (� )��initerror )� �=15 � � 0 )� 7 )"� �=17 � �"Escaped!":� ),�$;" at line ";� )6� � testing � � )@*FX 15,0 )JA=� )T(�string_to_buffer("ED. "+�(�)+�(13)) )^� )h� )r )|��string_to_buffer(tran$) )�� )� �"FX 138,0,"+�(�(�tran$,1))) )�tran$=�tran$,2) )�� tran$="" )�� )� )� ��tidy_at )��setsoftkeys )��unsetvectors )�� )� )���unsetsoftkeys )�$� R=221 � 228:�"FX "+�(R)+",2":� * *FX 219,9 *� * *&��setsoftkeys *0$� R=221 � 228:�"FX "+�(R)+",1":� *: *FX 219,9 *D� *N *X ��init_at *b � testing � � � � �initerror *l ��DXj *v6PNglass=2:PNbrush=3:PNflood=4:PNpencil=5:PNspray=6 *�MPNnormal=7:PNspriteop=8:PNcalculator=14:PNkeyboard=15:PNA=16:PNstopped=17 *�PNquestion=18:PNhand=19 *�5com_gx1%=0:com_gy1%=0:com_gx2%=1278:com_gy2%=1020 *�� *FX 229,1 *��unsetsoftkeys *� K=1024 *��� BLOW% 1*K,cat% 1*K,STORE% 160*K,brush% 8*K,brpatt% 8*K,cycle% 128,file_icons% 3*K,log_table% 256,log_scale% 1040,formnames% 1*K,fontlist% 1*K *Ə� skel% 1764*10,sqr% &5201,sin% 360*4,tan% 90*4,numbers% &720,screen_str% 256,pattern_str% 256,brush_str% 256,sprite_str% 256,file_str% 256 *Џ� behind% 256,flags% 4,PO% &14DC,sprstr% 30,fontstr% 45,presentfont% 80,xget% 800,yget% 800,BUFF% 1*K,BUFFER% 35328,freetable% 256,abts% 16 *�=� L(640),A%(641,1),B%(256,1),function%(4,3),formulas$(10) *�$�"LOAD "+�dir+"POINTER "+�~(PO%) *�� os%=1 � �point(0,1) *�$s%=�(�dir+"code*"):sz%=�#s%:�#s% +0� code% sz%:�"LOAD "+�dir+"code* "+�~(code%) +pl$="LOAD "+�dir +�pl$+"!Brushes "+�~(brush%) + !�pl$+"!Patterns "+�~(brpatt%) +*#*Com_Open <Atelier$Dir>.Sprites +4�in(file_icons%,"40 8") +>�in(numbers%,"12 8") +H�in(BUFFER%,"384 92") +R*Com_Close +\ �codevars +f� os%=1 � �point(0,0) +p$screen_str%="Screen" +z$pattern_str%="Patterns" +�$brush_str%="Brushes" +�$sprite_str%="SpriteFile" +�$sprstr%="new_sprite" +�g_sprite$="new_sprite" +�cycle%!0=16 +� � R=0 � 3 +�� o% +�� R1=0 � 3 +�!(cycle%+R*16+R1*4+4)=o%+R1 +��:� +�"� R=0 � 255:?(behind%+R)=255:� +�U� R=1 � 256:?(log_table%+R-1)=20+(R^2)/300:�:� R=0 � 5248:!(sqr%+R*4)=�(R*1024):� +�)� R=0 � 359:!(sin%+R*4)=��(R)*65536:� ,(� R=0 � 89:!(tan%+R*4)=��(R)*65536:� ,� 0,44,208,252 ,%� 4,364,408,584,224,584,72,456,72 ,$ � numlist ,.!bolpoint%=numlist ,8� R=0 � !bolpoint%-1 ,B � X,Y ,L#!(xget%+R*4)=X:!(yget%+R*4)=Y+4 ,V� ,`?(flags%)=255 ,j?(flags%+1)=255 ,t?(flags%+2)=255 ,~?(flags%+3)=255 ,�!sprstr=sprstr% ,�!brpatt=brpatt% ,�!flags=flags% ,� !cat=cat% ,�!behind=behind% ,�!brushshapes=brush% ,�!BUFF=BUFF% ,� !FLOB=PO% ,�!bolx=xget% ,�!boly=yget% ,�!fontstr=fontstr% ,�!presentfont=presentfont% - !STORE=STORE% - !freetable=freetable% -!put=BUFFER% -!cycle=cycle% -(!screen_str=screen_str% -2!pattern_str=pattern_str% -<!brush_str=brush_str% -F!sprite_str=sprite_str% -P!file_icons=file_icons% -Z!log_table=log_table% -d!log_scale=log_scale% -n!numbers=numbers% -x !sqr=sqr% -� !sin=sin% -� !tan=tan% -�!file_str=file_str% -�!formnames=formnames% -�!skel=skel% -�!fontlist=fontlist% -�� � -�8� � � $fontlist%="Font Disk Not Present"+�(0):� �d\m -�� initialisation% -�� � -��checkdumper -�xrst%=640:yrst%=512 -�x0%=0:y0%=0:x1%=0:y1%=0 .x2%=0:y2%=0:x3%=0:y3%=0 .x4%=0:y4%=0:x5%=0:y5%=0 . actionflags%=8:actionstep%=3 ."xs%=0:ys%=0:oldstep%=0 .,step%=1:vectors_set%=� .6wedge%=0:col%=0 .@psizex%=292:psizey%=309 .Jxpsize%=-1:ypsize%=-1 .Tmgs=�:mcs=� .^mousegrid=32:select=� .hP%=formnames% .r [OPT 0 .| EQUB 1 .�EQUB 10 .�EQUS "Defineable" .�] .�formula$="SIN(YR)*50" .�$dummy=�build_formula(formula$,0) .�botrad$="1" .�(atext$="Atelier (C) Simon Clay 1989" .��removekeymod .�funcprint$="BYE" .�eval$="" .�!oldaction%=60 .�� .� / /��in(b%,s$) /"�"Com_Sprites $ "+�(b%)+" "+s$ /&� /0 /:��removekeymod /D� � /N� � � � /X!*Unplug InternationalKeyboard /b� /l /v��set_abort_traps /�abts%!0=!&C /�abts%!4=!&10 /�abts%!8=!&14 /�� PASS=0 � 2 � 2 /� P%=&C /� [OPT PASS /�<B abt1% ;sets abort on instuction fetch error trap /�9B abt2% ;sets abort on data transfer error trap /�4B abt3% ;sets address exception error trap /�]� /�� /� /���unset_abort_traps 0!&0C=abts%!0 0!&10=abts%!4 0!&14=abts%!8 0 � 0* 04��codevars 0> 0Hvariablelocate%=code%+4*1 0Rcom_put%=code%+4*2 0\locatesprite%=code%+4*3 0fhelp%=code%+4*4 0phelpon%=code%+4*5 0zhelpoff%=code%+4*6 0�helpstep%=code%+4*7 0�helptext%=code%+4*8 0�liftup%=code%+4*9 0�liftdown%=code%+4*10 0�colour%=code%+4*11 0�undorestore%=code%+4*12 0�undosave%=code%+4*13 0�drawmenu%=code%+4*14 0�menusystem%=code%+4*15 0�mousecolour%=code%+4*16 0�screen_select%=code%+4*17 0�spriteinit%=code%+4*18 0�magnify%=code%+4*19 1uptree%=code%+4*20 1putbackground%=code%+4*21 1com_get%=code%+4*22 1$"putscreenrectangle%=code%+4*23 1.brusheor%=code%+4*24 18brushdraw%=code%+4*25 1Bbrushundo%=code%+4*26 1Lspritepix%=code%+4*27 1Vbrushget%=code%+4*28 1`shapeget%=code%+4*29 1jspriteputerror%=code%+4*30 1t#getspritefromscreen%=code%+4*31 1~priorityin%=code%+4*32 1�undochar%=code%+4*33 1�undobox%=code%+4*34 1�scanscreen%=code%+4*35 1�colourbyte%=code%+4*36 1�calc_intensity%=code%+4*37 1�splodgeread%=code%+4*38 1�setbord%=code%+4*39 1�abt1%=code%+4*40 1�FINDMENU%=code%+4*41 1�SKIPWORD%=code%+4*42 1�drawword%=code%+4*43 1�abt2%=code%+4*44 2 abt3%=code%+4*45 2 COLaverage%=code%+4*46 2COLgcol%=code%+4*47 2"COLmode15_13resize%=code%+4*48 2(show_thru%=code%+4*49 22swap_pixels%=code%+4*50 2<#COLsmooth_rectangle%=code%+4*51 2Fcompactedsave%=code%+4*52 2Pscreensave%=code%+4*53 2Zbit_map_scan_A%=code%+4*54 2dbit_map_scan_B%=code%+4*55 2nbit_map_pattern%=code%+4*56 2xvertical_fill%=code%+4*57 2�copy_fill%=code%+4*58 2�calc_radius%=code%+4*59 2�framedraw%=code%+4*60 2�spin_bottle%=code%+4*61 2�translate_point%=code%+4*62 2�#anti_aliased_squash%=code%+4*63 2�screenload%=code%+4*64 2�initialisation%=code%+4*65 2�formframedraw%=code%+4*66 2�form_translate%=code%+4*67 2�convertmode%=code%+4*68 2�bytecolour%=code%+4*69 2�downtree%=code%+4*70 3checksprites%=code%+4*71 3compactedload%=code%+4*72 3savecheck%=code%+4*73 3"fontlistinit%=code%+4*74 3,duff_call%=code%+4*75 36draw_error_box%=code%+4*76 3@com_update_info%=code%+4*77 3J 3T�variablelocate% 3^ 3hc=!code% 3r 3| Ac%=c+4*0 3�printmenu%=c+4*1 3� pc%=c+4*2 3�brushsel%=c+4*3 3�helpstatus%=c+4*4 3�presentmenu%=c+4*5 3�bolpoint%=c+4*6 3�topscreen%=c+4*7 3�blowcol%=c+4*8 3�YES%=c+4*9 3�putit%=c+4*10 3�sprsel%=c+4*11 3�startx%=c+4*12 3�starty%=c+4*13 4compaction%=c+4*14 4sprpos=c+4*15 4freecol=c+4*16 4&OUT=c+4*17 40limtop=c+4*18 4:limbot=c+4*19 4Dstart=c+4*20 4Nhlength=c+4*21 4XRESULTX=c+4*22 4bRESULTY=c+4*23 4llastmenu=c+4*24 4vr1store=c+4*25 4�r0store=c+4*26 4�left_handed=c+4*27 4�compact3x4=c+4*28 4�inlaysed=c+4*29 4�sprstr=c+4*30 4�brpatt=c+4*31 4�flags=c+4*32 4�cat=c+4*33 4�behind=c+4*34 4�brushshapes=c+4*35 4�BUFF=c+4*36 4�FLOB=c+4*37 4�bolx=c+4*38 5boly=c+4*39 5fontstr=c+4*40 5presentfont=c+4*41 5 STORE=c+4*42 5*freetable=c+4*43 54put=c+4*44 5>cycle=c+4*45 5Hrect_brush=c+4*46 5Rscreen_str=c+4*47 5\pattern_str=c+4*48 5fbrush_str=c+4*49 5psprite_str=c+4*50 5zhelp_text_data=c+4*51 5�file_icons=c+4*52 5�bit_map=c+4*53 5�fillstylepic=c+4*54 5�log_table=c+4*55 5�log_scale=c+4*56 5� 5�numbers=c+4*58 5�magnify_xpos=c+4*59 5�magnify_ypos=c+4*60 5�putpos=c+4*61 5�magputpos=c+4*62 5�sizex=c+4*63 5�sizey=c+4*64 6sprsize=c+4*65 6spritex=c+4*66 6spritey=c+4*67 6$gtspritex=c+4*68 6.gtspritey=c+4*69 68diskfontlistposition=c+4*70 6Bcatpos=c+4*71 6Lfontsel=c+4*72 6Vpattsel=c+4*73 6`treepos=c+4*74 6jmatrixput=c+4*75 6tbarval_red=c+4*76 6~barval_grn=c+4*77 6�barval_blu=c+4*78 6�scaleval_left=c+4*79 6�scaleval_right=c+4*80 6�cycleplace=c+4*81 6�cycledirection=c+4*82 6�cyclemode=c+4*83 6�pm%=c+4*84 6�mixval_red=c+4*85 6�mixval_grn=c+4*86 6�mixval_blu=c+4*87 6�mousex=c+4*88 6�mousey=c+4*89 7 mousebuts=c+4*90 7 magnification=c+4*91 7magnify_xget=c+4*92 7magnify_yget=c+4*93 7(magnify_status=c+4*94 72HANG=c+4*95 7<rect_brush_mode=c+4*96 7Fvacant=c+4*97 7Pcom_x1=c+4*98 7Zcom_y1=c+4*99 7dcom_x2=c+4*100 7ncom_y2=c+4*101 7xsprint_xsize=c+4*102 7�sprint_ysize=c+4*103 7�spritemask=c+4*104 7�fill_style=c+4*105 7�fill_prop=c+4*106 7�fill_logr=c+4*107 7�fill_dith=c+4*108 7�step_codes=c+4*109 7�border=c+4*110 7�sqr=c+4*111 7�actionsave=c+4*112 7�bottle=c+4*113 7�bot_tilt=c+4*114 7�bot_lean=c+4*115 8bot_xout=c+4*116 8bot_yout=c+4*117 8line_selected=c+4*118 8"bot_finish=c+4*119 8,bot_xscale=c+4*120 86bot_yscale=c+4*121 8@hangdelay=c+4*122 8Jsin=c+4*123 8Ttan=c+4*124 8^file_str=c+4*125 8hform=c+4*126 8rtilt=c+4*127 8|lean=c+4*128 8�rotation=c+4*129 8�xscale=c+4*130 8�yscale=c+4*131 8�hscale=c+4*132 8�form_list_pos=c+4*133 8�formnames=c+4*134 8�formula=c+4*135 8�skel=c+4*136 8�shade_range=c+4*137 8�min_shade=c+4*138 8�fontlist=c+4*139 8�oldaction%=c+4*140 8� 9 9BORDSIZE=28 9WEDGESIZE=16 9&textcol%=0 90BACKCOL%=202 9:TITLECOL%=0 9DBORDERCOL%=74 9NBORD1%=207 9X BORD2%=15 9bBORD3%=138 9lBORD4%=197 9vDIRECTORYCOL%=224 9� 9�� 9� 9���screen_select 9� 9�#� (!Ac%=1 � !Ac%=2) � step%=3 � 9�� 9��mouse_handle 9�7D%=!Ac%:E%=step%:F%=MB:G%=MX:H%=MY:� screen_select% 9� � MB=0 9�� !Ac%=1 � x1%=MX:y1%=MY 9�� 9�7D%=!Ac%:E%=step%:F%=MB:G%=MX:H%=MY:� screen_select% :� : � !YES% � :Ȏ step% � : �1:x1%=MX:y1%=MY :*�2:x2%=MX:y2%=MY :4�3:x3%=MX:y3%=MY :>�4:x4%=MX:y4%=MY :H�5:x5%=MX:y5%=MY :R� :\� :f� !YES% � � :p :z :�Ȏ (!Ac%) � :� :� � Magnify :��12:Ȏ step% � :��2:enter%=4 :�!magnify_xpos=MX � 2 :�!magnify_ypos=255-(MY � 4) :�� :� :� � Fill :��13:Ȏ step% � :��2:�point(0,0) :�� 128+�MX,MY) Ȝ Ȝ(MX,MY) ;Ȏ !fill_style � ;�0: ; � !pm%>0 � � bit_map_scan_A% ;$�&85,MX,MY ;.!� !pm%>0 � � bit_map_pattern% ;8�1,2,3: ;B� bit_map_scan_A% ;L�&85,MX,MY ;VȎ !fill_style � ;`�1,2:� vertical_fill% ;j�3:A%=MX �2:B%=255-MY �4 ;t� vertical_fill% ;~� ;�� ;��update ;�� ;� ;�� Sprite Handling ;� �14,16 ;�+� 0,(textcol% � 63) Ȝ (textcol% � 192) ;�/� 0,128+(BACKCOL% � 63) Ȝ (BACKCOL% � 192) ;�ș &2E,8 � ,,,r3 ;�,ș &2E,13,,sprstr%,30,!sprsel% � ,,,leng ;�?(sprstr%+leng+1)=13 ;�errorcheat=!Ac% <