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%
<