Home » Archimedes archive » Zipped Apps » Alps » !ALPS/!RunImage
!ALPS/!RunImage
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
| Tape/disk: | Home » Archimedes archive » Zipped Apps » Alps |
| Filename: | !ALPS/!RunImage |
| Read OK: | ✔ |
| File size: | 1E236 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM >$.!ALPS.!RunImage
20REM LEN Alpine Software/Philip Hawthorne 1989,1990
30REM With modifications by Keith McAlpine
40version$="5.09A, 3-Mar-1991"
50
60DIM block &200,block2 &200,mistake 300,quitblk 100
70
80ON ERROR MODE 0:PRINT REPORT$:PRINT ":";ERL:SYS"Wimp_CloseDown":END
90
100@%=&10:ctr%=0
110mode%=MODE
120testing=FALSE
130resources_ok=FNOS_Var("Alps$Resources") AND FNOS_Var("Alps$Data")
140
150SYS "OS_GetEnv" TO Env$
160I%=INSTR(Env$,CHR$34,INSTR(Env$,CHR$34)+1)
170ef$=MID$(Env$,I%+1)
180WHILE LEFT$(ef$,1)=" "
190ef$=MID$(ef$,2)
200ENDWHILE
210
220theLastMenu = 0 : tick$=""
230
240type$="CF8"
250
260DIM tempBlk 4
270$tempBlk = "TASK"
280SYS "Wimp_Initialise",200,!tempBlk,"ALPS" TO ,task%
290
300IF NOT resources_ok THEN ERROR 1,"The ALPS resources are not available. Open up the directory viewer with !ALPS in it.":SYS "Wimp_CloseDown",task%,!tempBlk:END
310PROCinstall_texted
320PROCinit2
330ON ERROR dialog=FNerrorbox(REPORT$,ERR,1,-99):GOTO 500
340PROCnew
350PROCassemble(armcode%)
360PROCfill(text_block%,text_blocksize%,dummy_spc)
370PROCfill(verb_type,2*(maxvbn+1),0)
380PROCfill(nref+4,nref_size-4,0)
390PROCfill(aref+4,aref_size-4,0)
400PROCclear
410claimpoll$="":claimmenu$="":quit%=FALSE
420
430path$=ef$
440IF ef$<>"" THEN
450$filename%=FNleafname(ef$)
460PROCload_all(ef$)
470PROCopen(ALPSmain,400,800,600,600)
480ENDIF
490
500REPEAT
510SYS Poll,,block TO reason
520CASE reason OF
530 WHEN 1: PROCredraw(!block)
540 WHEN 2: SYS OpenW,,block
550 WHEN 3: PROCclose(!block)
560 WHEN 6: PROCcheckmouse(!block,block!4,block!8,block!12,block!16,block!20)
570 WHEN 7: PROCsave:REM User has dragged 'Alps' file icon to another window
580 WHEN 8: PROCuserkeypressed(!block,block!4,block!24)
590 WHEN 9: PROCmenuselect(!block,block!4)
600 WHEN 17,18: PROCreceive(block)
610 ENDCASE
620UNTIL quit%
630SYS "Wimp_CloseDown",task%,!tempBlk:IF testing THEN OSCLI("FX4"):REPORT:PRINT" at line ";ERL:END
640END
650
660DEF PROCinit2
670PROCgetmodeinfo:oldsize=scrnsize
680data_saved=TRUE:loaded$=""
690DIM a_list$(10)
700small_areasize%=30
710DIM small_area% small_areasize%
720
730DIM D%(3),shade%(15),scale 15,pixtr 15
740REM ---------------------------------
750REM Manifest constants for the system
760
770maxrms=1000:maxobs=255:maxsw%=10:maxtokens=128
780
790listoption=2:REM Default LISTO
800
810DIM pos$(3)
820FOR I%=0 TO 3:READ pos$(I%):NEXT
830DATA T,B,L,R
840
850DIM oldpars 73
860FOR I%=0 TO 72
870READ B%:oldpars?I%=B% AND &F
880NEXT
890
900DATA 0,0,0,0,0,1,161,193
910DATA 161,193,2,1,0,128,128,0
920DATA 128,0,0,128,0,1,1,1
930DATA 1,65,1,0,0,0,65,0
940DATA 130,194,130,194,193,193,129,129
950DATA 193,193,131,195,1,130,128,128
960DATA 2,2,66,0,1,66,3,67
970DATA 0,1,1,65,65,65,3,0
980DATA 1,1,130,130,130,2,130,2
990DATA 2
1000
1010maxlen=10:REM Maximum word length in vocabulary
1020
1030REM Room and object data block lengths (in bytes)
1040r_len=74:o_len=16
1050
1060num_vars=60:REM Number of ALPS variables
1070var_size=num_vars*2:REM 2 bytes per variable
1080
1090maxmsg=65535:maxobn=255:maxvbn=255:maxconst=65535
1100maxadj=255:maxprep=50:maxconj=10:maxspec=30:maxnoise=50:maxpix=50
1110
1120noun_size=3000
1130verb_size=3000
1140adjc_size=2000
1150prep_size=400:REM Size of prepositions list
1160conj_size=50:REM size of conjunctions list
1170spec_size=100:REM size of 'specials' list (IT, THEM, ALL)
1180noise_size=200:REM size of 'noise' list (THE,A,AN)
1190aref_size=2000:REM size of adjective object reference table
1200nref_size=2000:REM size of nouns object reference table
1210pix_size=1000:REM size of pix filename list
1220
1230DIM nouns noun_size,verbs verb_size,adjects adjc_size,preps prep_size,conjs conj_size,specs spec_size,noise noise_size,pixs pix_size
1240
1250DIM aref aref_size,nref nref_size,verb_type 2*(maxvbn+1)
1260
1270noun_end=nouns+noun_size:verb_end=verbs+verb_size
1280adjc_end=adjects+adjc_size:prep_end=preps+prep_size:conj_end=conjs+conj_size:spec_end=specs+spec_size:noise_end=noise+noise_size
1290aref_end=aref+aref_size:nref_end=nref+nref_size:pix_end=pixs+pix_size
1300
1310REM Printer codes etc
1320condensed=15:reset=64
1330pline$=STRING$(132,"-")
1340pline2$=STRING$(79,"-")
1350
1360REM ------- Set up data areas for rooms and objects and clear them ------
1370DIM rdata% (maxrms+1)*r_len,odata% (maxobs+1)*o_len,controom% 12
1380
1390REM Set up the save buffers
1400initareasize=7*(maxobs+1)+22*(maxrms+1)
1410DIM initsave initareasize,ramsave initareasize+var_size+128
1420$controom%="0":cont_room=0:container=FALSE
1430
1440rptr=1:optr=1:last_room=1:last_object=1
1450
1460REM areas to store flag descriptions
1470maxd%=13
1480DIM o_flags% maxd%*8,r_flags% maxd%*8
1490
1500REM Set the flag descriptions
1510FOR I%=7 TO 0 STEP-1
1520READ flag$
1530$(o_flags%+I%*maxd%)=LEFT$(flag$,maxd%-1)
1540NEXT
1550
1560FOR I%=7 TO 0 STEP-1
1570READ flag$
1580$(r_flags%+I%*maxd%)=LEFT$(flag$,maxd%-1)
1590NEXT
1600
1610REM Object Flag descriptions
1620DATA "","",Being worn,Wearable,Scenery,Invisible,Takeable,Light source
1630
1640REM Room flag descriptions
1650DATA "","","","","","",Visited,Light
1660
1670REM Room Exit flag descriptions
1680DATA Invisible,Closed door,Open door,Locked door,Unl'ked door,Blocked,Reserved,Reserved
1690
1700DIM exit_flag$(7)
1710FOR flag=7 TO 0 STEP-1:READ exit_flag$(flag):NEXT
1720
1730DIM proc% 12,exit% 12,def% 12
1740$proc%="":$def%="":$exit%=""
1750
1760REM prg_sel% = Section of program selected for editing
1770REM 2=Main, 3=Proc, 4=Define, 5=Exit
1780REM progval$ = STR$ value of proc or exit number or name of selected verb
1790
1800prg_sel%=2:progval$=""
1810
1820REM voc_sect% = Section of vocabulary selected for editing
1830REM 1=Nouns, 2=Verbs
1840voc_sect%=1
1850
1860DIM voc$(8),prog$(6)
1870voc$()="","Nouns","Verbs","Adjectives","Prepositions","Conjunctions","Specials","Noise"
1880prog$()="","","Main","Procedure","Define","Exit"
1890
1900pbsize=(scrnsize DIV 2)+400:REM size of picture buffer
1910IF pbsize<25*1024 THEN pbsize=25*1024:REM Ensure at least 25k - 12.04.90
1920
1930DIM picbuf pbsize
1940
1950prgbsize=&1000
1960DIM prgbuf% prgbsize
1970
1980REM ------- Some constants for the character designer -------
1990
2000cur_chr%=ASC"A":max_chr%=125
2010DIM charnum 12
2020$charnum=""
2030
2040REM ------- Dimension the other arrays needed -------
2050ucsize=500
2060SYS "OS_File",5,"<ALPS$Resources>.ASIobjcode" TO ftype,,,,codesize
2070pbyte_size=148
2080DIM armcode% 1000,pbytes pbyte_size,work% &1100,asicode% codesize+10
2090DIM usercode% ucsize
2100run=asicode%:printmsg=asicode%+4:search=asicode%+12:findcode=asicode%+16
2110setup=asicode%+20
2120OSCLI("LOAD <ALPS$Resources>.ASIobjcode "+STR$~asicode%)
2130DIM pal%(2)
2140DIM q% &2000,erroraddr%(4)
2150DIM indexdata% 32*24+20
2160maxbuf%=&3000
2170DIM buffer% maxbuf%:curbuff%=buffer%
2180nh%=32:ni%=11
2190DIM handle%(nh%+1),wident$(nh%),wptr%(nh%)
2200FOR I%=0TOnh%:handle%(I%)=I%-1:wident$(I%)="":NEXT:handleSP%=nh%
2210DIM icon%(ni%+1),iconbar$(ni%)
2220FOR I%=0 TO ni%:icon%(I%)=-1:READ iconbar$(I%):NEXT
2230icon%(ni%+1)=-1
2240oldicon%=0:oldrmicon%=0
2250
2260REM ------ Names of icons (sprites) on icon bar ------
2270DATA disk35,arclogo,door,key,quill,info,listing,chardes,vocab,swap,eye,face
2280
2290diskicon=0:texticon=4:progicon=6:staricon=99
2300vocabicon=8:faceicon=99:arcicon=1:swapicon=9
2310alpsicon=5:helpicon=13:eyeicon=10
2320THEkeyicon=3:THEdooricon=2:texticon=4:THEcharicon=7
2330
2340DIM menufree% &1800:menuend%=menufree%+&1800
2350DIM menulist% &100
2360DIM qBlk% 256
2370dx%=2:lsY%=40:ypixel%=4:chX%=16:chY%=32
2380currentwindow%=-1:currenticon%=-1
2390spritef$=""
2400DIM mb_wident% 12,filename% 64,filename2% 64,import% 64
2410IF testing $filename%="demo" ELSE $filename%="starter"
2420$filename2%="charset":$import%=""
2430DIM start(20),sys_b2% &300,os_block 50
2440
2450PROCKeyWordRead
2460PROCErrorMsgRead
2470
2480REM ----- Define the "Wimp" and "OS" SYS numbers ------
2490Wimp=&400C0
2500CreateW=Wimp+1
2510CreateI=Wimp+2
2520DeleteW=Wimp+3
2530DeleteI=Wimp+4
2540OpenW=Wimp+5
2550CloseW=Wimp+6
2560Poll=Wimp+7
2570RedrawW=Wimp+8
2580UpdateW=Wimp+9
2590GetW=Wimp+11
2600GetWI=Wimp+&C
2610SetCaret=Wimp+&12
2620GetCaret=Wimp+&13
2630GetR=Wimp+&A
2640SetI=Wimp+&D
2650GetI=Wimp+&E
2660GetP=Wimp+&F
2670Drag=Wimp+&10
2680ForceR=Wimp+&11
2690CreateM=Wimp+&14
2700SetP=Wimp+&18
2710GetOutline=Wimp+&E0
2720ReadPal=&2F
2730
2740REM ------ Set up our own sprite area and read the sprites in ------
2750SYS "OS_File",5,"<ALPS$Resources>.AlpsSprite" TO ,,,,spritesize
2760spritesize+=4
2770DIM spritearea% spritesize
2780!spritearea%=spritesize
2790SYS "OS_SpriteOp",266,spritearea%,"<Alps$Resources>.AlpsSprite"
2800DIM fontcounts% 255,mb_wident% 24
2810
2820REM ------ Set up the wimps and their handles ------
2830
2840DIMrgb(19,3)
2850PROCloadtemplates("<Alps$Resources>.ALPS")
2860
2870REM ------ Name the window handles ------
2880objhandle=handle%(FNmatchident("objected"))
2890roomhandle=handle%(FNmatchident("roomedit"))
2900texthandle=handle%(FNmatchident("texted"))
2910design=handle%(FNmatchident("chrdesign"))
2920infohandle=handle%(FNmatchident("info"))
2930savehandle=handle%(FNmatchident("saveas"))
2940ALPSmain=handle%(FNmatchident("iconbar")):dialogue%=0
2950setuph=handle%(FNmatchident("Setup"))
2960desticon=47:exitprogicon=48
2970
2980iconbar% = -2
2990windowindex%=nh%+1
3000
3010PROCchangeicon(infohandle,7,version$,dummy)
3020
3030firstIconBarIcon% = FNiconbar(spritearea%, "face",31,19)
3040THEmiscicon=firstIconBarIcon%
3050
3060
3070REM ------ Define the colours ------
3080barfgcol=11:barbgcol=3
3090`wbcol=0:`tbcol=2:`sco=&3:`mbcol=&B
3100`wfcol=7:`tfcol=7:`sci=&D:`tbcol2=&C
3110
3120cur_pal%=7:phys_col%=16
3130
3140first_token=&30:REM Lowest keyword token value
3150PROCfind_token(keyword$(),"INC",var_token,dummy):REM Tokens from here up allow variables
3160PROCfind_token(keyword$(),"DEFINE",def_token,dummy)
3170PROCfind_token(keyword$(),"STOP",stop_token,dummy)
3180PROCfind_token(keyword$(),"END",end_token,dummy)
3190PROCfind_token(keyword$(),"EXIT",exit_token,dummy)
3200PROCfind_token(keyword$(),"DEFPROC",proc_token,dummy)
3210PROCfind_token(keyword$(),"PREP",prep_token,dummy)
3220PROCfind_token(keyword$(),"NOTPREP",notprep_token,dummy)
3230
3240REM ------ Set up the dictionary ------
3250dict_size=1000
3260DIM dict% dict_size,tok$(maxtokens)
3270!dict%=3:dict%?2=&80
3280
3290REM ------ Find the available memory ------
3300memfree=(HIMEM-END)-50000
3310IF memfree<0 THEN null=FNerrorbox("Not enough memory available in 'Next' slot",0,1,-99):SYS "Wimp_CloseDown":END
3320maxtext%=0.83*memfree
3330code_size%=0.17*memfree
3340
3350REM ------ Areas for storing messages, switch info etc; ------
3360DIM text% maxtext%,swdata% 12*maxsw%,switch_vals(maxsw%),m_msg% 12
3370DIM switch_buf% 2*maxsw%+1
3380$swdata%=STRING$(12*maxsw%,CHR$13):$m_msg%=""
3390
3400REM ------ Initialise the text area ------
3410!text%=1:text%!2=&B:text%!6=0:text%!10=0
3420DIM st_msg% 12,end_msg% 12
3430$st_msg%="1":$end_msg%="1"
3440mptr=1:REM The current message number
3450text_owner$="":REM The current owner of any text in the text editor
3460
3470datavalid=TRUE
3480
3490REM ------ Set up the program area ------
3500DIM program% code_size%
3510!program%=0
3520program%!4=0
3530errflag=FALSE
3540
3550REM ------ Set up the menu structure ------
3560m_controom%=FNcrmenu
3570DATA "#Number,$controom%(5)"
3580m_contain=FNcrmenu
3590DATA "Container,Use room>m_controom%"
3600m_chardes%=FNcrmenu
3610DATA "#CHANGE TO?,$charnum(2)"
3620char_fname%=FNcrmenu
3630DATA "#Filename:,$filename2%(11)"
3640menu_fname%=FNcrmenu
3650DATA "#Filename:,$filename%(11)"
3660m_gotomsg%=FNcrmenu
3670DATA "$m_msg%(12)"
3680m_proc%=FNcrmenu
3690DATA "#Number:,$proc%(4)"
3700m_def%=FNcrmenu
3710DATA "#Verb:,$def%(12)"
3720m_exit%=FNcrmenu
3730DATA "#Number:,$exit%(4)"
3740m_listopts=FNcrmenu
3750DATA "#Display:,Vocabulary as numbers,Vocabulary as strings"
3760m_import%=FNcrmenu
3770DATA "#Filename:,$import%(11)"
3780sw1=FNcrmenu:nxtsw=swdata%+12
3790DATA "#Value:,$swdata%(12)"
3800sw2=FNcrmenu:nxtsw=nxtsw+12
3810DATA "#Value:,$nxtsw"
3820sw3=FNcrmenu:nxtsw=nxtsw+12
3830DATA "#Value:,$nxtsw"
3840sw4=FNcrmenu:nxtsw=nxtsw+12
3850DATA "#Value:,$nxtsw"
3860sw5=FNcrmenu:nxtsw=nxtsw+12
3870DATA "#Value:,$nxtsw"
3880sw6=FNcrmenu:nxtsw=nxtsw+12
3890DATA "#Value:,$nxtsw"
3900sw7=FNcrmenu:nxtsw=nxtsw+12
3910DATA "#Value:,$nxtsw"
3920sw8=FNcrmenu:nxtsw=nxtsw+12
3930DATA "#Value:,$nxtsw"
3940sw9=FNcrmenu:nxtsw=nxtsw+12
3950DATA "#Value:,$nxtsw"
3960sw10=FNcrmenu:nxtsw=nxtsw+12
3970DATA "#Value:,$nxtsw"
3980m_switch%=FNcrmenu
3990DATA "#Switch,No switches,1>sw1,2>sw2,3>sw3,4>sw4,5>sw5,6>sw6,7>sw7,8>sw8,9>sw9,10>sw10"
4000m_text%=FNcrmenu
4010DATA "#MESSAGE,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Previous (f5),Next (f6),First (f7),Last (f8),Goto msg#>m_gotomsg%,Edit switch#>m_switch%,Print this"
4020m_prog%=FNcrmenu
4030DATA "#Program Editor,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Main,Procedure>m_proc%,Define>m_def%,Exit routine#>m_exit%,Print this,List options>m_listopts"
4040m_vocab%=FNcrmenu
4050DATA "#Vocabulary,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Nouns,Verbs,Adjectives,Prepositions,Conjunctions,Specials,Noise#,Print this"
4060pixmenu=FNcrmenu
4070DATA "#Pictures,Print"
4080progmenu=FNcrmenu
4090DATA "#Program,Print,Import#>m_import%,Run"
4100charmenu=FNcrmenu
4110DATA "#CharSet,Save>char_fname%,Load>char_fname%"
4120vocabmenu=FNcrmenu
4130DATA "#Vocabulary,Print"
4140diskmenu=FNcrmenu
4150DATA "#Files,Save all>savehandle,Setup disk"
4160facemenu=FNcrmenu
4170DATA "#Actors,Print"
4180miscmenu=FNcrmenu
4190DATA "#ALPS,Info>infohandle,Quit"
4200msg2%=FNcrmenu
4210DATA "$st_msg%(6)"
4220msg3%=FNcrmenu
4230DATA "$end_msg%(6)"
4240msg1%=FNcrmenu
4250DATA "#From/To?,Start msg>msg2%,End msg>msg3%"
4260textmenu=FNcrmenu
4270DATA "#Text,Print>msg1%,Import>m_import%"
4280objmenu=FNcrmenu
4290DATA "#Objects,Print,Import>m_import%"
4300mo_user5=FNcrmenu:ofl%=o_flags%+maxd%*3
4310DATA "#Description:,$o_flags%(13)"
4320mo_user4=FNcrmenu:ofl%=ofl%+maxd%
4330DATA "#Description:,$ofl%(13)"
4340mo_user3=FNcrmenu:ofl%=ofl%+maxd%
4350DATA "#Description:,$ofl%(13)"
4360mo_user2=FNcrmenu:ofl%=ofl%+maxd%
4370DATA "#Description:,$ofl%(13)"
4380mo_user1=FNcrmenu:ofl%=ofl%+maxd%
4390DATA "#Description:,$ofl%(13)"
4400mo_user0=FNcrmenu:ofl%=ofl%+maxd%
4410DATA "#Description:,$ofl%(13)"
4420m_objflag=FNcrmenu
4430DATA "#Flags,7 Light source,6 Takeable,5 Invisible,4 Scenery,3 Wearable,2 Being worn,1 User flag>mo_user1,0 User flag>mo_user0"
4440roommenu=FNcrmenu
4450DATA "#Rooms,Print,Import>m_import%"
4460mr_user6=FNcrmenu:rfl%=r_flags%+maxd%*2
4470DATA "#Description:,$r_flags%(13)"
4480mr_user5=FNcrmenu:rfl%=rfl%+maxd%
4490DATA "#Description:,$rfl%(13)"
4500mr_user4=FNcrmenu:rfl%=rfl%+maxd%
4510DATA "#Description:,$rfl%(13)"
4520mr_user3=FNcrmenu:rfl%=rfl%+maxd%
4530DATA "#Description:,$rfl%(13)"
4540mr_user2=FNcrmenu:rfl%=rfl%+maxd%
4550DATA "#Description:,$rfl%(13)"
4560mr_user1=FNcrmenu:rfl%=rfl%+maxd%
4570DATA "#Description:,$rfl%(13)"
4580mr_user0=FNcrmenu:rfl%=rfl%+maxd%
4590DATA "#Description:,$rfl%(13)"
4600m_rmflag=FNcrmenu
4610DATA "#Flags,7 Light,6 Visited,5 User (Trans)>mr_user5,4 User (Open)>mr_user4,3 User flag>mr_user3,2 User flag>mr_user2,1 User flag>mr_user1,0 User flag>mr_user0"
4620m_exitf=FNcrmenu
4630DATA "#Flags,7 Invisible exit,6 Closed door,5 Open door,4 Locked door,3 Unlocked door,2 Blocked exit,1 Reserved,0 Reserved"
4640
4650ENDPROC
4660
4670REM ------ Now we have the Procedures and Functions!! ------
4680
4690DEF PROCgetmodeinfo
4700LOCAL x,y,xeig,yeig,cols
4710mode=MODE
4720
4730SYS "OS_ReadModeVariable",mode,1 TO ,,textcols%
4740SYS "OS_ReadModeVariable",mode,2 TO ,,textrows%
4750text_maxllen%=textcols%-2
4760SYS "OS_ReadModeVariable",mode,3 TO ,,cols
4770SYS "OS_ReadModeVariable",mode,4 TO ,,xeig
4780SYS "OS_ReadModeVariable",mode,5 TO ,,yeig
4790SYS "OS_ReadModeVariable",mode,7 TO ,,scrnsize
4800SYS "OS_ReadModeVariable",mode,11 TO ,,x
4810SYS "OS_ReadModeVariable",mode,12 TO ,,y
4820scrw=((x+1)<<xeig)-1:scrh=((y+1)<<yeig)-1
4830ENDPROC
4840
4850DEF PROCclear
4860PROCfill(odata%,(maxobs+1)*o_len,0)
4870PROCfill(rdata%,(maxrms+1)*r_len,0)
4880PROCfill(program%+4,code_size%-20,0)
4890REM PROCfill(initsave,initareasize,0)
4900ENDPROC
4910
4920
4930DEF PROCreturn(x%,y%)
4940PROCcol(128+12):PROCcol(7)
4950PROCcentre(" Hit any key/button to return to the editor ",y%)
4960REPEAT
4970MOUSE X%,Y%,B%
4980UNTIL B%=0
4990
5000REPEAT
5010any=INKEY(0)
5020MOUSE X%,Y%,B%
5030UNTIL any>0 OR B%>0
5040ENDPROC
5050
5060DEF PROCcentre(t$,r)
5070PRINTTAB((textcols%-LEN t$+1) DIV 2,r);t$;
5080ENDPROC
5081
5082DEF FNtoUpper(text$)
5083LOCAL I%,A$
5084FOR I%=1 TO LEN text$
5085A$+=CHR$(ASC(MID$(text$,I%,1)) AND &DF)
5086NEXT
5087=A$
5090
5100REM ------ General window handling routines ------
5110
5120DEF PROCdeletewindow(I%)
5130!q%=handle%(I%)
5140handle%(I%)=handleSP%:handleSP%=I%
5150SYS DeleteW,,q%
5160wident$(I%)=""
5170ENDPROC
5180
5190DEF PROCloadtemplates(tfile$)
5200tmp%=0
5210SYS "Wimp_OpenTemplate",,tfile$
5220tf_index%=0:REPEAT
5230$mb_wident%="*"
5240SYS "Wimp_LoadTemplate",,q%+4,curbuff%,buffer%+maxbuf%,fontcounts%,mb_wident%,tf_index% TO ,,curbuff%,,,,tf_index%
5250IF tf_index%<>0 THEN PROCloadtemp($mb_wident%)
5260UNTIL tf_index%=0
5270SYS "Wimp_CloseTemplate"
5280ENDPROC
5290
5300DEF PROCloadtemp(wident$)
5310I%=FNmatchident(wident$):IF I%<>-1 THEN PROCdeletewindow(I%)
5320q%!68=spritearea% : REM user sprite area
5330PROCcrwindow(q%+4,wident$)
5340ENDPROC
5350
5360DEF PROChighlight(I%)
5370ENDPROC
5380SYS SetCaret,handle%(I%),-1,0,0,&2000000,0
5390ENDPROC
5400
5410DEF PROCretitle(handle%,newtitle$,RETURN handle%)
5420index%=windowindex%
5430REPEAT
5440 index%-=1: IFindex%<0 ERROR 255,"Invalid window"
5450UNTIL handle%(index%)=handle%
5460!q%=handle%
5470SYS GetWI,,q%
5480SYS DeleteW,,q%
5490flags%=q%!60
5500IF (flags% AND 256)=0 THEN $(q%+76)=LEFT$(newtitle$,11) ELSE $(!(q%+76))=LEFT$(newtitle$,39)
5510SYS CreateW,,q%+4 TO handle%
5520handle%(index%)=handle%
5530ENDPROC
5540
5550DEF PROCretitle_text(title$)
5560!block=texthandle
5570SYS GetWI,,block
5580$(!(block+76))=LEFT$(title$,39)
5590block!16+=36
5600block!8=block!16 - 36
5610SYS ForceR,-1,block!4,block!8,block!12,block!16
5620ENDPROC
5630
5640DEF PROCcrwindow(q%,wident$)
5650SYS CreateW,,q% TO handle%
5660m%=handleSP%:handleSP%=handle%(handleSP%):handle%(m%)=handle%
5670!q%=handle%
5680SYS GetW,,q%
5690currentwindow%=m%:wident$(m%)=wident$
5700currenticon%=-1
5710PROChighlight(m%)
5720ENDPROC
5730
5740DEF PROCclose(wind)
5750i%=ni%+1
5760CASE wind OF
5770 WHEN objhandle:i%=THEkeyicon:IF icon%(i%)<>-1 PROCstore_obj(optr)
5780 WHEN roomhandle: i%=THEdooricon:IF icon%(i%)<>-1 PROCstore_room(rptr)
5790 WHEN texthandle
5800 i%=texticon
5810 PROCremove_markers
5820 CASE text_owner$ OF
5830 WHEN "texted" : PROCstore_msg
5840 WHEN "program" : IF NOT text_ok THEN PROCstore_prog
5850 WHEN "vocab" : IF NOT text_ok THEN PROCstore_vocab
5860 WHEN "pix" : PROCstore_pix
5870 ENDCASE
5880 IF NOT errflag THEN
5890 text_owner$="":REM release Text Editor window
5900 PROCfill(text_block%,text_blocksize%,dummy_spc)
5910 ENDIF
5920 WHEN design: i%=THEcharicon:SYS ForceR,-1,0,0,scrw+1,scrh+1
5940ENDCASE
5950IF (text_owner$="program" AND errflag AND wind=texthandle) OR (text_owner$="vocab" AND errflag AND wind=texthandle) OR (text_owner$="pix" AND errflag AND wind=texthandle) OR (text_owner$="texted" AND errflag AND wind=texthandle) THEN
5960ELSE
5970 icon%(i%)=-1
5980 !block=wind
5990 SYS CloseW,,block
6000ENDIF
6010ENDPROC
6020
6030DEF PROCopen(handle,x,y,w,d)
6040!block=handle
6050block!4=x:block!8=y-d
6060block!12=x+w:block!16=y
6070block!20=0:block!24=0
6080block!28=-1
6090SYS OpenW,,block
6100ENDPROC
6110
6120DEF PROCredraw(handle)
6130block!0=handle
6140SYS RedrawW,0,block TO more%
6150PROCinfo(block+4)
6160IF handle=texthandle THEN dummy=FNredraw_text(TRUE)
6170ENDPROC
6180
6190DEF PROCforceR(handle)
6200REM Force the given window ONLY to be redrawn
6210PROCgetw(handle)
6220SYS ForceR,handle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%),scy%
6230ENDPROC
6240
6250DEF FNmatchident(A$)
6260IF A$="" THEN =-1
6270LOCAL I%
6280I%=nh%+1:REPEATI%=I%-1:UNTILA$=wident$(I%)ORI%=0
6290IFA$=wident$(I%)THEN=I%ELSE=-1
6300
6310DEF PROCgetw(handle%)
6320IF handle%=iconbar% ENDPROC
6330!block=handle%:SYSGetW,0,block
6340PROCinfo(block+4):bhandle%=block!28:flags%=block!32
6350ontop=flags% AND &20000
6360ENDPROC
6370
6380DEF PROCinfo(b)
6390x0%=!b:y0%=b!4:x1%=b!8:y1%=b!12:scx%=b!16:scy%=b!20
6400bx%=x0%-scx%:by%=y1%-scy%
6410gwxl%=b!24:gwyb%=b!28:gwxr%=b!32:gwyt%=b!36
6420ENDPROC
6430
6440DEF PROCgetpointer
6450SYSGetP,0,block
6460mousex%=!block:mousey%=block!4:b%=block!8:handle%=block!12:icon%=block!16:ob%=block!20
6470ENDPROC
6480
6490DEF PROCsys_claiminputfocus(window%,icon%,xofst%,yofst%,height%,index%)
6500SYSSetCaret, window%,icon%,xofst%,yofst%,height%,index%
6510ENDPROC
6520
6530DEF PROCsys_getcaretposition(RETURN window%,RETURN icon%,RETURN xofst%,RETURN yofst%,RETURN height%,RETURN indx%)
6540SYSGetCaret,0,b
6550window%=!block: icon%=block!4: xofst%=block!8: yofst%=block!12: height%=block!16: indx%=block!20
6560ENDPROC
6570
6580DEF PROCcursor(x%,y%)
6590PROCsys_claiminputfocus(texthandle,-1,(x%-1)*chX%,-y%*lsY%-9*ypixel%,&1000000 OR10*ypixel%,-1)
6600ENDPROC
6610
6620DEF PROCtext_menubox
6630CASE text_owner$ OF
6640WHEN "texted"
6650 tick$="message"
6660 null = FNtick_message
6670 SYS CreateM,0,m_text%,mousex%-64,mousey%:claimmenu$="message"
6680 theLastMenu = m_text%
6690
6700WHEN "program"
6710 tick$="program"
6720 null = FNtick_program
6730 SYS CreateM,0,m_prog%,mousex%-64,mousey%:claimmenu$="program"
6740 theLastMenu = m_prog%
6750
6760WHEN "vocab"
6770 tick$="vocab"
6780 null = FNtick_vocab
6790 SYS CreateM,0,m_vocab%,mousex%-64,mousey%:claimmenu$="vocab"
6800 theLastMenu = m_vocab%
6810
6820ENDCASE
6830
6840ENDPROC
6850
6860DEF PROCcheckmouse(mousex%,mousey%,button%,handle%,icon%,ob%)
6870IFhandle%=-1 THEN ENDPROC
6880PROCgetw(handle%)
6890IFhandle%=ALPSmain THEN
6900 IFicon%<>-1 THEN
6910REM icon% -= firstIconBarIcon%
6920 CASETRUE OF
6930 WHEN(button%AND1)=1 : REM adjust does nothing
6940 WHEN(button%AND2)=2 : void=EVAL("FNmenu_"+iconbar$(icon%))
6950 WHEN(button%AND4)=4 : PROCopenup(icon%)
6960 ENDCASE
6970 ENDIF
6980ELSE
6990 IF handle%=iconbar% THEN
7000 REM The RISC OS icon bar
7010 CASE TRUE OF
7020 WHEN (button%AND2)=2 : void=FNmenu_misc
7030 WHEN (button%AND4)=4
7040 IF icon%=firstIconBarIcon% THEN PROCopen(ALPSmain,400,800,600,600)
7050 ENDCASE
7060 ELSE
7070 index%=windowindex%
7080 REPEAT
7090 index%-=1: IFindex%<0 ERROR 255,"Invalid window"
7100 UNTIL handle%(index%)=handle%
7110 void=EVAL("FNbutton_"+wident$(index%))
7120 ENDIF
7130ENDIF
7140ENDPROC
7150
7160DEF PROCuserkeypressed(handle%,icon%,key%)
7170PROCgetw(handle%)
7180LOCALindex%
7190index%=windowindex%
7200REPEAT
7210index%-=1: IFindex%<0 THEN ENDPROC
7220UNTILhandle%(index%)=handle%
7230void=EVAL("FNkeypress_"+wident$(index%))
7240ENDPROC
7250
7260DEF PROCmenuselect(item0%,item1%)
7270SYS "Wimp_GetPointerInfo",,block
7280buTTon = block!8
7290void=EVAL("FNmenuselect_"+claimmenu$)
7300IF buTTon=1 THEN
7310 REM *** ADJUST pressed so keep the menu structure ***
7320 null = EVAL("FNtick_"+tick$)
7330 SYS CreateM,0,theLastMenu,0,0
7340ELSE
7350 claimmenu$=""
7360ENDIF
7370ENDPROC
7380
7390DEF PROCupdate(handle%,ux0%,uy0%,ux1%,uy1%)
7400!block=handle%:block!4=ux0%:block!8=uy0%:block!12=ux1%:block!16=uy1%
7410SYS UpdateW,0,block TO more%:PROCinfo(block+4)
7420ENDPROC
7430
7440DEF PROCopenup(icon%)
7450IF icon%(icon%)=-1 THEN
7460 IF icon%<>diskicon AND icon%<>texticon AND icon%<>arcicon AND icon%<>swapicon AND icon%<>progicon AND icon%<>vocabicon AND icon%<>eyeicon THEN icon%(icon%)=icon%
7470 CASE icon% OF
7480 WHEN diskicon:
7490 SYS CreateM,0,diskmenu,mousex%-64,mousey%
7500 IF loaded$<>"" THEN f$=path$ ELSE f$="AlpsFile"
7510 PROCchangeicon(savehandle,2,f$,void)
7520 claimmenu$="disk35":theLastMenu=diskmenu:tick$=""
7530 REM WHEN THEmiscicon:
7540 REM *********** do nothing for this icon *******
7550 WHEN texticon:
7560 IF text_owner$="" THEN
7570 PROCretitle(texthandle,"MESSAGE "+STR$mptr,texthandle)
7580 PROCopen(texthandle,0,1000,scrw,400)
7590 text_owner$="texted":text_ok=TRUE
7600 PROCshow_msg(mptr)
7610 ELSE
7620 VDU 7
7630 ENDIF
7640 WHEN THEdooricon:
7650 PROCopen(handle%(FNmatchident("roomedit")),0,720,1280,1040)
7660 PROCrestore_room(rptr)
7670 WHEN THEkeyicon:
7680 PROCopen(handle%(FNmatchident("objected")),850,560,800,680)
7690 PROCrestore_obj(optr)
7700 WHEN progicon:
7710 IF text_owner$="" THEN
7720 PROCretitle(texthandle,"PROGRAM: "+prog$(prg_sel%)+" "+progval$,texthandle)
7730 PROCopen(texthandle,0,1000,scrw,400)
7740 text_owner$="program":text_ok=TRUE
7750 PROClist(prg_sel%,progval$)
7760 ELSE
7770 VDU 7
7780 ENDIF
7790 WHEN THEcharicon:
7800 PROCopen(handle%(FNmatchident("chrdesign")),0,560,1280,860)
7810 PROCdisplay_chr(cur_chr%)
7820 PROCchangeicon(design,64,CHR$(cur_chr%),dummy)
7830 WHEN vocabicon:
7840 IF text_owner$="" THEN
7850 PROCretitle(texthandle,"VOCABULARY: "+voc$(voc_sect%),texthandle)
7860 PROCopen(texthandle,0,1000,scrw,400)
7870 text_owner$="vocab":text_ok=TRUE
7880 PROClist_vocab(voc_sect%)
7890 ELSE
7900 VDU 7
7910 ENDIF
7920 WHEN helpicon:
7930 PROCopen(handle%(FNmatchident("HELP")),0,500,960,400)
7940 WHEN eyeicon:
7950 IF text_owner$="" THEN
7960 PROCretitle(texthandle,"PICTURES",texthandle)
7970 PROCopen(texthandle,0,1000,scrw,400)
7980 text_owner$="pix":text_ok=TRUE
7990 PROClist_pix
8000 ELSE
8010 VDU 7
8020 ENDIF
8030 WHEN arcicon:dummy=FNkeypress_status
8040 WHEN swapicon
8050 datavalid=NOT datavalid:VDU 7:PROCswap_data
8060 IF datavalid THEN
8070 PROCchangeicon(ALPSmain,swapicon,"swap",swapicon)
8080 ELSE
8090 PROCchangeicon(ALPSmain,swapicon,"swap_x",swapicon)
8100 ENDIF
8110 PROCforceR(ALPSmain)
8120 ENDCASE
8130ENDIF
8140ENDPROC
8150
8160
8170REM ------ `button` routines to deal with clicks in given window ------
8180
8190DEF FNbutton_texted
8200LOCALmx%,my%
8210IF button%<>2 THEN
8220PROCgetpointer
8230mx%=(mousex%-bx%+chX%DIV4) AND(NOT(chX%-1))
8240my%=(mousey%-by%) - ((mousey%-by%) MODlsY%)
8250text_col%=1+mx% DIVchX%
8260text_row%=-((mousey%-by%) DIVlsY%)
8270IF text_row%>last_row% text_row%=last_row%
8280IF text_col%>text_rowlen%(text_row%) text_col%=text_rowlen%(text_row%)+1
8290IF text_col%<1 text_col%=1
8300ENDIF
8310
8320CASE button% OF
8330WHEN 2
8340PROCtext_menubox
8350WHEN 4
8360PROClocate_ptr
8370PROCcursor(text_col%,text_row%)
8380WHEN 1
8390PROCinsert_marker
8400ENDCASE
8410=0
8420
8430DEF PROCinsert_marker
8440IF text_owner$<>"pix" THEN
8450PROClocate_ptr
8460IF mrk<2 THEN
8470mark(mrk)=text_ptr%
8480col(mrk)=text_col%:row(mrk)=text_row%
8490asc(mrk)=?text_ptr%
8500IF asc(mrk)=13 THEN VDU23,dummy_cr ELSE VDU23,chr(mrk)
8510?os_block=asc(mrk)
8520SYS "OS_Word",&A,os_block
8530FOR R%=1 TO 8
8540row_value=R%?os_block
8550VDU row_value EOR &FF
8560NEXT
8570IF asc(mrk)=13 THEN ?text_ptr%=dummy_cr ELSE ?text_ptr%=chr(mrk)
8580PROCupdate(texthandle,chX%*(text_col%-1),-(text_row%+1)*lsY%,chX%*(text_col%-1)+chX%,-(text_row%)*lsY%)
8590dummy=FNredraw_text(TRUE)
8600mrk+=1
8610PROCcursor(text_col%,text_row%)
8620ENDIF
8630ENDIF
8640ENDPROC
8650
8660DEF PROClocate_ptr
8670text_ptr%=text_block%
8680IF text_row%>0 THEN
8690 FOR R%=0 TO text_row%-1
8700 text_ptr%+=text_rowlen%(R%)
8710 IF text_rowlen%(R%)<text_maxllen% THEN text_ptr%+=1
8720 NEXT
8730ENDIF
8740text_ptr%+=text_col%-1
8750IF text_ptr%>text_end% THEN text_ptr%=text_end%
8760ENDPROC
8770
8780DEF FNbutton_objected
8790CASE icon% OF
8800WHEN 0:
8810
8820REM First set the 'tick' bits for each menu item
8830null = FNtick_objected
8840SYS CreateM,0,m_objflag,mousex%-64,mousey%:claimmenu$="objected"
8850tick$="objected"
8860theLastMenu = m_objflag
8870
8880WHEN 5:PROCfirst_obj
8890WHEN 6:PROClast_obj
8900WHEN 27:PROCnext_obj
8910WHEN 16:PROCprev_obj
8920WHEN 20:PROCfwd_obj(10)
8930WHEN 21:PROCrewind_obj(10)
8940WHEN 17
8950PROCstore_obj(optr)
8960optr=VAL(FNgeticondata(objhandle,7))
8970IF optr<1 THEN optr=1
8980IF optr>maxobs THEN optr=maxobs
8990PROCrestore_obj(optr)
9000WHEN 22:last_object=optr
9010WHEN 26:
9020SYS CreateM,0,m_contain,mousex%-64,mousey%:claimmenu$="container"
9030tick$=""
9040theLastMenu = m_contain
9050OTHERWISE
9060ENDCASE
9070IF optr>last_object last_object=optr:data_saved=FALSE
9080=0
9090
9100DEF FNbutton_roomedit
9110CASE icon% OF
9120WHEN 1:
9130tick$="roomedit"
9140null = FNtick_roomedit
9150SYS CreateM,0,m_rmflag,mousex%-64,mousey%:claimmenu$="roomedit"
9160theLastMenu = m_rmflag
9170
9180WHEN 5:PROCfirst_room
9190WHEN 6:PROClast_room
9200WHEN 7:PROCnext_room
9210WHEN 8:PROCprev_room
9220WHEN 9:PROCfwd_room(10)
9230WHEN 10:PROCrewind_room(10)
9240WHEN 11
9250PROCstore_room(rptr)
9260rptr=VAL(FNgeticondata(roomhandle,33))
9270IF rptr<1 THEN rptr=1
9280IF rptr>maxrms THEN rptr=maxrms
9290PROCrestore_room(rptr)
9300
9310WHEN 12:last_room=rptr
9320ENDCASE
9330IF rptr>last_room last_room=rptr:data_saved=FALSE
9340
9350REM Now check for clicking menu on selected EXITR icon
9360
9370CASE TRUE OF
9380
9390WHEN icon%>53 AND icon%<70
9400
9410oldrmicon%=icon%
9420null = FNtick_exitedit
9430tick$="exitedit"
9440SYS CreateM,0,m_exitf,mousex%-64,mousey%:claimmenu$="exitedit"
9450theLastMenu = m_exitf
9460OTHERWISE
9470ENDCASE
9480=0
9490
9500DEF FNbutton_chrdesign
9510CASE TRUE OF
9520WHEN icon%>=0 AND icon%<64
9530 PROCset_icon(design,icon%,&50000000,0)
9540 PROCwrite_chr(cur_chr%)
9550 PROCset_icon(design,64,0,0)
9560WHEN icon%=66
9570 cur_chr%+=1
9580 IF cur_chr%>max_chr% cur_chr%=max_chr%
9590 PROCchangeicon(design,64,CHR$(cur_chr%),icon%)
9600 PROCdisplay_chr(cur_chr%)
9610WHEN icon%=67
9620 cur_chr%-=1
9630 IF cur_chr%<32 cur_chr%=32
9640 PROCchangeicon(design,64,CHR$(cur_chr%),icon%)
9650 PROCdisplay_chr(cur_chr%)
9660WHEN icon%=68
9670 SYS CreateM,0,m_chardes%,mousex%-64,mousey%:claimmenu$="chrdef"
9680 theLastMenu = m_chardes%:tick$=""
9690ENDCASE
9700=0
9710
9720
9730DEF FNbutton_info
9740IF icon%=5 THEN
9750PROCclose(infohandle)
9760ENDIF
9770=0
9780
9790DEF FNbutton_saveas
9800CASE icon% OF
9810WHEN 0 : PROCsave_all(FNgeticondata(savehandle,2))
9820WHEN 1 : PROCgetw(savehandle)
9830 dummy$=FNgeticondata(savehandle,1)
9840 block!4=5:block!8=block!8+bx%
9850 block!12=block!12+by%
9860 block!16=block!16+bx%
9870 block!20=block!20+by%
9880 block!24=0:block!28=0:block!32=scrw+1:block!36=scrh+1
9890 SYS "Wimp_DragBox",,block
9900ENDCASE
9910=0
9920
9930DEF FNbutton_Setup
9940CASE icon% OF
9950WHEN 0
9960WHEN 1:PROCcreate_dirs(FNgeticondata(setuph,2),FNgeticondata(setuph,5))
9970ENDCASE
9980PROCclose(setuph)
9990MOUSE RECTANGLE 0,0,scrw,scrh
10000=0
10010
10020REM ------ `keypress` routines deal with pressing key `key%` in a window
10030
10040DEF FNkeypress_texted
10050CASE TRUE OF
10060WHEN key%=13:PROCnewline:data_saved=FALSE:text_ok=FALSE
10070WHEN (key%=&186 AND text_owner$="texted"):PROCnext_msg:PROCforceR(texthandle):text_row%=0:text_col%=1
10080WHEN (key%=&185 AND text_owner$="texted"):PROCprev_msg:PROCforceR(texthandle):text_row%=0:text_col%=1
10090WHEN (key%=&187 AND text_owner$="texted"):PROCfirst_msg:PROCforceR(texthandle):text_row%=0:text_col%=1
10100WHEN (key%=&188 AND text_owner$="texted"):PROClast_msg:PROCforceR(texthandle):text_row%=0:text_col%=1
10110WHEN key%=24:PROCcut(mark(0),mark(1),picbuf):PROCforceR(texthandle)
10120WHEN key%=3:PROCcopy(mark(0),mark(1),picbuf):PROCforceR(texthandle)
10130WHEN key%=22:PROCpaste(text_ptr%,picbuf):PROCforceR(texthandle)
10140WHEN key%=26:PROCremove_markers:PROCforceR(texthandle)
10150WHEN key%=&189:PROCinsert_marker
10160WHEN key%=&18F:PROCup
10170WHEN key%=&18E:PROCdown
10180WHEN key%=&18D:PROCright
10190WHEN key%=&18A:FOR I%=1 TO tab_set:PROCright:NEXT
10200WHEN key%=&19A:FOR I%=1 TO tab_set:PROCleft:NEXT
10210WHEN key%=&18C:PROCleft
10220WHEN key%=&1AB:PROCdelete_line:data_saved=FALSE:text_ok=FALSE
10230WHEN key%=&1ED:PROCinsert_line:data_saved=FALSE:text_ok=FALSE
10240WHEN key%=&1AC:PROCleft_end
10250WHEN key%=&1AD:PROCright_end
10260WHEN key%=&18B:PROCright:PROCdelete_char:data_saved=FALSE:text_ok=FALSE
10270WHEN key%=&1CD:overwrite=NOT overwrite
10280WHEN key%=127:PROCdelete_char:data_saved=FALSE:text_ok=FALSE
10290WHEN (key%>31) AND (key%<126)
10300IF overwrite THEN PROCoverwrite_char(key%) ELSE PROCinsert_char(key%)
10310data_saved=FALSE:text_ok=FALSE
10320OTHERWISE SYS "Wimp_ProcessKey",key%
10330ENDCASE
10340
10350PROCcursor(text_col%,text_row%)
10360=0
10370
10380DEF PROCcheck_scroll_up
10390PROCgetw(texthandle)
10400Ty%= (text_row%+1)*lsY%
10410IF (y1%-Ty%)<(y0%+scy%) THEN block!24 =block!24-lsY%:SYS OpenW,,block
10420ENDPROC
10430
10440DEF PROCcheck_scroll_down
10450PROCgetw(texthandle)
10460Tr%=-scy% DIV lsY%
10470IF text_row%-1<Tr% THEN block!24 =block!24+lsY%:SYS OpenW,,block
10480ENDPROC
10490
10500DEF PROCcheck_scroll_left
10510PROCgetw(texthandle)
10520Rx%=(text_col%-1)*chX%
10530IF (x1%-Rx%)<(x0%-scx%) THEN block!20 =block!20+chX%:SYS OpenW,,block
10540ENDPROC
10550
10560DEF PROCcheck_scroll_right
10570PROCgetw(texthandle)
10580Le%=scx% DIV chX%
10590IF text_col%-1<Le% THEN block!20 =block!20-chX%:SYS OpenW,,block
10600ENDPROC
10610
10620DEF FNkeypress_saveas
10630IF key%=13 THEN PROCsave_all(FNgeticondata(savehandle,2)) ELSE SYS "Wimp_ProcessKey",key%
10640=0
10650
10660DEF FNkeypress_objected
10670IF key%=13 AND icon%=7 THEN
10680 PROCstore_obj(optr)
10690 optr=VAL(FNgeticondata(objhandle,icon%))
10700 IF optr<1 THEN optr=1
10710 IF optr>maxobs THEN optr=maxobs
10720 PROCrestore_obj(optr)
10730ENDIF
10740
10750CASE key% OF
10760WHEN 13,&18E:REM Return or down arrow
10770IF icon%<15 THEN
10780 icon%+=1
10790ELSE
10800 icon%=7
10810ENDIF
10820WHEN &18F:REM Up arrow
10830IF icon%>7 THEN
10840 icon%-=1
10850ELSE
10860 icon%=15
10870ENDIF
10880OTHERWISE SYS "Wimp_ProcessKey",key%
10890ENDCASE
10900PROCsys_claiminputfocus(objhandle,icon%,0,0,-1,LEN(FNgeticondata(objhandle,icon%)))
10910=0
10920
10930DEF FNkeypress_roomedit
10940CASE key% OF
10950WHEN 13,&18E,&18F
10960
10970IF key%=13 AND icon%=33 THEN
10980 PROCstore_room(rptr)
10990 rptr=VAL(FNgeticondata(roomhandle,icon%))
11000 IF rptr<1 THEN rptr=1
11010 IF rptr>maxrms THEN rptr=maxrms
11020 PROCrestore_room(rptr)
11030ENDIF
11040
11050IF key%=13 OR key%=&18E THEN
11060CASE TRUE OF
11070WHEN icon%=37:newicon%=71
11080WHEN icon%=71:newicon%=38
11090WHEN icon%=69:newicon%=33
11100WHEN icon%<37:newicon%=icon%+1
11110WHEN (icon%>37 AND icon%<54):newicon%=icon%+16
11120WHEN (icon%>53 AND icon%<69):newicon%=icon%-15
11130ENDCASE
11140ENDIF
11150
11160IF key%=&18F THEN
11170CASE TRUE OF
11180WHEN icon%=71:newicon%=37
11190WHEN icon%=38:newicon%=71
11200WHEN icon%=33:newicon%=69
11210WHEN icon%>33:newicon%=icon%-1
11220WHEN (icon%>37 AND icon%<54):newicon%=icon%-16
11230WHEN (icon%>53 AND icon%<69):newicon%=icon%+15
11240ENDCASE
11250ENDIF
11260
11270OTHERWISE SYS "Wimp_ProcessKey",key%
11280ENDCASE
11290PROCsys_claiminputfocus(roomhandle,newicon%,0,0,-1,LEN(FNgeticondata(roomhandle,newicon%)))
11300=0
11310
11320DEF FNkeypress_status
11330PROCcol(128+2)
11340VDU 26,4,12
11350PROCcol(9):PROCcol(128+7)
11360PROCcentre(STRING$(27," ")+"System Status Information"+STRING$(28," "),0)
11370PROCcol(128+2):PROCcol(7)
11380PROCstatus
11390PROCcol(128+7):PROCcol(9)
11400PROCcentre(STRING$(31," ")+"Integer Variables"+STRING$(32," "),10)
11410PROCcol(128+2):PROCcol(7)
11420PROClvar
11430OFF:PROCreturn(18,31):ON
11440VDU 26,5
11450SYS ForceR,-1,0,0,scrw+1,scrh+1
11460=0
11470
11480DEF FNkeypress_chrdef
11490IF key%=13 AND icon%=64 THEN
11500cur_chr%=ASC(FNgeticondata(design,icon%))
11510PROCdisplay_chr(cur_chr%)
11520PROCchangeicon(design,64,CHR$(cur_chr%),icon%)
11530ELSE
11540IF key%<>13 THEN SYS "Wimp_ProcessKey",key%
11550ENDIF
11560=0
11570
11580DEF FNkeypress_Setup
11590IF key%=&18E OR key%=13 AND icon%=2 THEN newicon%=5
11600IF key%=13 AND icon%=5 THEN icon%=1:void=FNbutton_Setup:=0
11610IF key%=&18E AND icon%=5 THEN newicon%=2
11620IF key%=&18F AND icon%=5 THEN newicon%=2
11630IF key%=&18F AND icon%=2 THEN newicon%=5
11640IF key%<>13 AND key%<>&18E AND key%<>&18F THEN SYS "Wimp_ProcessKey",key%
11650PROCsys_claiminputfocus(setuph,newicon%,0,0,-1,LEN(FNgeticondata(setuph,newicon%)))
11660=0
11670
11680REM ------ The `menu` routines to open the selected menu ------
11690
11700DEF FNmenu_
11710=0
11720
11730DEF FNmenu_swap
11740=0
11750
11760DEF FNmenu_arclogo
11770=0
11780
11790DEF FNmenu_info
11800=0
11810
11820
11830DEF FNmenu_disk35
11840SYS CreateM,0,diskmenu,mousex%-64,mousey%
11850IF loaded$<>"" THEN f$=path$ ELSE f$="AlpsFile"
11860PROCchangeicon(savehandle,2,f$,void)
11870theLastMenu= diskmenu
11880claimmenu$="disk35":tick$=""
11890=0
11900
11910
11920DEF FNmenu_key
11930SYS CreateM,0,objmenu,mousex%-64,mousey%
11940theLastMenu = objmenu
11950claimmenu$="key":tick$=""
11960=0
11970
11980DEF FNmenu_door
11990SYS CreateM,0,roommenu,mousex%-64,mousey%
12000theLastMenu = roommenu
12010claimmenu$="door":tick$=""
12020=0
12030
12040DEF FNmenu_quill
12050$end_msg%=STR$(FNmaxmsg)
12060SYS CreateM,0,textmenu,mousex%-64,mousey%
12070theLastMenu = textmenu
12080claimmenu$="quill":tick$=""
12090=0
12100
12110
12120DEF FNmenu_listing
12130SYS CreateM,0,progmenu,mousex%-64,mousey%
12140theLastMenu = progmenu
12150claimmenu$="listing":tick$=""
12160=0
12170
12180
12190DEF FNmenu_chardes
12200=0
12210SYS CreateM,0,charmenu,mousex%-64,mousey%
12220theLastMenu = charmenu
12230claimmenu$="chardes":tick$=""
12240=0
12250
12260DEF FNmenu_vocab
12270SYS CreateM,0,vocabmenu,mousex%-64,mousey%
12280theLastMenu = vocabmenu
12290claimmenu$="vocabulary":tick$=""
12300=0
12310
12320DEF FNmenu_face
12330SYS CreateM,0,facemenu,mousex%-64,mousey%
12340theLastMenu = facemenu
12350claimmenu$="actors":tick$=""
12360=0
12370
12380DEF FNmenu_misc
12390null = FNtick_misc
12400SYS CreateM,0,miscmenu,mousex%-64,FNmenuHeight(miscmenu,1)
12410theLastMenu = miscmenu
12420claimmenu$="misc":tick$="misc"
12430=0
12440
12450DEF FNmenu_help
12460=0
12470
12480
12490DEF FNmenu_eye
12500SYS CreateM,0,pixmenu,mousex%-64,mousey%
12510theLastMenu = pixmenu
12520claimmenu$="eye":tick$=""
12530=0
12540
12550
12560REM `menuselect` functions - called when a selection is made from a menu
12570REM `item0%` is the number of selection from first menu (0,1,2...)
12580REM `item1%` is the number of selection from second menu (0,1,2...)
12590
12600DEF FNmenuselect_
12610=0
12620
12630
12640DEF FNmenuselect_message
12650LOCAL changed_msg
12660
12670CASE item0% OF
12680 WHEN -1
12690 WHEN 0,1:overwrite=NOT overwrite
12700 WHEN 2:PROCcut(mark(0),mark(1),picbuf)
12710 WHEN 3:PROCcopy(mark(0),mark(1),picbuf)
12720 WHEN 4:PROCpaste(text_ptr%,picbuf)
12730 WHEN 5:PROCprev_msg
12740 WHEN 6:PROCnext_msg
12750 WHEN 7:PROCfirst_msg
12760 WHEN 8:PROClast_msg
12770 WHEN 9:PROCgoto_msg(VAL($m_msg%))
12780 WHEN 10
12790 IF item1%>-1 THEN
12800 IF item1%=0 THEN
12810 FOR I%=0 TO maxsw%
12820 switch_vals(I%)=0
12830 NEXT I%
12840 ENDIF
12850 switch_vals(item1%)=VAL($(swdata%+12*(item1%-1)))
12860 IF item1%>switch_vals(0) THEN switch_vals(0)=item1%
12870 REM switch_vals(0) stores the number of switches
12880 ENDIF
12890 WHEN 11
12900 *FX3,10
12910 PROCprint_msg(mptr)
12920 *FX3,0
12930ENDCASE
12940PROCforceR(texthandle)
12950IF changed_msg THEN
12960text_row%=0:text_col%=1
12970PROCcursor(1,0)
12980ENDIF
12990REM claimmenu$=""
13000=0
13010
13020DEF PROCcut(start,end,buf)
13030IF mrk<2 THEN ERROR 1,error$(29)
13040IF end<start THEN SWAP start,end:SWAP col(0),col(1):SWAP row(0),row(1):SWAP asc(0),asc(1)
13050cliplen=end-start+1
13060PROCmove(start,buf,cliplen)
13070REM SYS"Wimp_CloseDown":MODE 12:STOP
13080PROCmove(end+1,start,text_end%-end):REM was +1 until 16.6.89
13090?buf=asc(0):buf?(cliplen-1)=asc(1)
13100text_end%=text_end%-cliplen
13110IF asc(1)=0 THEN text_end%+=1
13120REM Restore end marker if it has been cut
13130IF text_end%<text_block% THEN text_end%=text_block%
13140?text_end%=0
13150last_row%=FNfind_lastrow
13160FOR I%=0 TO last_row%
13170text_rowlen%(I%)=LENFNrow(I%)
13180NEXT
13190mrk=0:mark()=+0
13200IF text_row%>last_row% THEN text_row%=last_row%
13210IF text_col%>text_rowlen%(text_row%) THEN text_col%=text_rowlen%(text_row%)+1
13220PROClocate_ptr:PROCcursor(text_col%,text_row%)
13230data_saved=FALSE:text_ok=FALSE
13240ENDPROC
13250
13260DEF PROCcopy(start,end,buf)
13270IF mrk<2 THEN ERROR 1,error$(29)
13280IF end<start THEN SWAP start,end:SWAP col(0),col(1):SWAP row(0),row(1):SWAP asc(0),asc(1)
13290cliplen=end+1-start
13300PROCmove(start,buf,cliplen)
13310?buf=asc(0):buf?(cliplen-1)=asc(1)
13320?start=asc(0):?end=asc(1):mrk=0:mark()=+0
13330ENDPROC
13340
13350DEF PROCpaste(to,from)
13360IF cliplen=0 THEN ERROR 1,error$(30)
13370PROCmove(to,to+cliplen,text_end%-to+1)
13380PROCmove(from,to,cliplen)
13390text_end%+=cliplen
13400last_row%=FNfind_lastrow
13410FOR I%=0 TO last_row%
13420text_rowlen%(I%)=LENFNrow(I%)
13430NEXT
13440PROClocate_ptr:PROCcursor(text_col%,text_row%)
13450data_saved=FALSE:text_ok=FALSE
13460ENDPROC
13470
13480DEF FNmenuselect_program
13490errflag=FALSE
13500IF item0%>4 AND item0%<9 THEN
13510PROCremove_markers
13520IF NOT text_ok THEN PROCstore_prog
13530prg_sel%=item0%-3
13540text_row%=0:text_col%=1
13550PROCcursor(1,0)
13560ENDIF
13570
13580CASE item0% OF
13590WHEN 0,1:overwrite=NOT overwrite
13600WHEN 2:PROCcut(mark(0),mark(1),picbuf)
13610WHEN 3:PROCcopy(mark(0),mark(1),picbuf)
13620WHEN 4:PROCpaste(text_ptr%,picbuf)
13630WHEN 5:progval$=""
13640WHEN 6:progval$=$proc%
13650WHEN 7:progval$=FNtoUpper($def%)
13660WHEN 8:progval$=$exit%
13670WHEN 9:PROCprint_prog_seg
13680WHEN 10:PROClisto
13690ENDCASE
13700
13710IF (item0%>4 AND item0%<9) THEN
13720 IF NOT errflag THEN
13730 PROClist(item0%-3,progval$)
13740 PROCretitle_text("PROGRAM: "+prog$(prg_sel%)+" "+progval$)
13750 PROCforceR(texthandle)
13760 ENDIF
13770ENDIF
13780IF (item0%>1 AND item0%<5) THEN
13790PROCforceR(texthandle)
13800ENDIF
13810IF item0%=10 THEN
13820IF NOT text_ok THEN PROCstore_prog
13830IF NOT errflag THEN
13840text_row%=0:text_col%=1
13850PROCcursor(1,0)
13860PROClist(prg_sel%,progval$)
13870PROCforceR(texthandle)
13880ENDIF
13890ENDIF
13900=0
13910
13920DEF FNmenuselect_vocab
13930REM Make a selection from the vocabulary editor menu
13940CASE item0% OF
13950WHEN 0,1:overwrite=NOT overwrite
13960WHEN 2:PROCcut(mark(0),mark(1),picbuf)
13970WHEN 3:PROCcopy(mark(0),mark(1),picbuf)
13980WHEN 4:PROCpaste(text_ptr%,picbuf)
13990WHEN 5,6,7,8,9,10,11
14000PROCremove_markers:REM Added 23.08.89
14010IF NOT text_ok THEN PROCstore_vocab
14020IF NOT errflag THEN
14030voc_sect%=item0%-4
14040PROClist_vocab(voc_sect%)
14050text_row%=0:text_col%=1
14060PROCcursor(1,0)
14070PROCretitle_text("VOCABULARY: "+voc$(voc_sect%))
14080ENDIF
14090WHEN 12:PROCprint_prog_seg
14100ENDCASE
14110CASE item0% OF
14120WHEN 2,3,4,5,6,7,8,9,10,11
14130PROCforceR(texthandle)
14140ENDCASE
14150REM claimmenu$=""
14160=0
14170
14180DEF FNmenuselect_exitedit
14190xerr%=FALSE
14200IF oldrmicon%<>0 THEN
14210 ptr%=(rdata%+rptr*r_len+oldrmicon%)
14220 flags%=?ptr%
14230 cl_door%=flags% AND &40
14240 op_door%=flags% AND &20
14250 lk_door%=flags% AND &10
14260 unlk_door%=flags% AND &8
14270 IF cl_door% AND item0%=2 THEN xerr%=TRUE
14280 IF op_door% AND item0%=1 THEN xerr%=TRUE
14290 IF op_door% AND item0%=3 THEN xerr%=TRUE
14300 IF unlk_door% AND item0%=3 THEN xerr%=TRUE
14310 IF lk_door% AND item0%=4 THEN xerr%=TRUE
14320 IF lk_door% AND item0%=2 THEN xerr%=TRUE
14330 IF xerr% THEN
14340 VDU 7
14350 ELSE
14360 ?ptr%=?ptr% EOR (&80 >> item0%)
14370 IF NOT lk_door% AND item0%=3 THEN
14380 ?ptr%=?ptr% AND %11011111 OR %01000000
14390 ENDIF
14400 IF lk_door% AND item0%=1 THEN
14410 ?ptr%=?ptr% AND %11101111
14420 ENDIF
14430 ENDIF
14440 data_saved=FALSE
14450ENDIF
14460REM claimmenu$=""
14470=0
14480
14490DEF FNmenuselect_disk35
14500CASE item0% OF
14510 WHEN 0
14520 path$=FNgeticondata(savehandle,2)
14530 SYS "OS_File",5,path$ TO ftype
14540 IF ftype=0 THEN PROCsave_all(path$) ELSE PROCensure(item0%,"This file exists. Do you want to replace it?")
14550 WHEN 1
14560 PROCload_bits(FNgeticondata(setuph,2))
14570 PROCsetup_disk(item0%)
14580ENDCASE
14590icon%(diskicon)=-1:REM claimmenu$=""
14600=0
14610
14620
14630
14640DEF FNmenuselect_objected
14650old_flags%=VAL(FNgeticondata(objhandle,8))
14660new_flags%=old_flags% EOR (&80 >> item0%)
14670PROCchangeicon(objhandle,8,STR$(new_flags%),dummy)
14680REM claimmenu$=""
14690=0
14700
14710DEF FNmenuselect_container
14720CASE item0% OF
14730WHEN 0
14740container=NOT container
14750IF container THEN
14760PROCchangeicon(objhandle,26,"SIZE <C>",dummy)
14770ELSE
14780PROCchangeicon(objhandle,26,"SIZE",dummy)
14790ENDIF
14800WHEN 1
14810cont_room=VAL($controom%)
14820ENDCASE
14830REM data_saved=FALSE
14840REM claimmenu$=""
14850=0
14860
14870DEF FNmenuselect_roomedit
14880old_flags%=VAL(FNgeticondata(roomhandle,34))
14890new_flags%=old_flags% EOR (&80 >> item0%)
14900PROCchangeicon(roomhandle,34,STR$(new_flags%),dummy)
14910REM claimmenu$=""
14920=0
14930
14940DEF FNmenuselect_key
14950CASE item0% OF
14960 WHEN 0:PROCprint_objs
14970 WHEN 1:PROCimport_obj("O."+$import%)
14980ENDCASE
14990REM claimmenu$=""
15000=0
15010
15020DEF FNmenuselect_door
15030CASE item0% OF
15040 WHEN 0:PROCprint_rooms
15050 WHEN 1:PROCimport_rooms("R."+$import%)
15060ENDCASE
15070REM claimmenu$=""
15080=0
15090
15100DEF FNmenuselect_quill
15110CASE item0% OF
15120 WHEN 0:PROCprint_text
15130 WHEN 1:PROCimport_text("T."+$import%)
15140 PROCload_dict("D."+$import%)
15150ENDCASE
15160REM claimmenu$=""
15170=0
15180
15190DEF FNmenuselect_listing
15200CASE item0% OF
15210 WHEN 0:PROCprint_program
15220 WHEN 1:PROCconvert($import%)
15230 WHEN 2:PROCrun
15240ENDCASE
15250REM claimmenu$=""
15260=0
15270
15280DEF FNmenuselect_chardes
15290REM When `menu` is clicked on the `chardes` icon
15300CASE item0% OF
15310WHEN 0:PROCsave_chars("<Users$Resources>."+$filename2%)
15320WHEN 1
15330OSCLI("PRINT <Alps$Resources>."+$filename2%)
15340PROCdisplay_chr(cur_chr%)
15350SYS ForceR,-1,0,0,scrw+1,scrh+1
15360ENDCASE
15370REM claimmenu$=""
15380=0
15390
15400DEF FNmenuselect_chrdef
15410REM When button is clicked on the `SELECT` icon in the char design window
15420chr%=ASC($charnum)
15430IF chr%>31 AND chr%<=max_chr% THEN
15440 cur_chr%=chr%
15450 PROCchangeicon(design,64,CHR$(cur_chr%),icon%)
15460 PROCdisplay_chr(cur_chr%)
15470ENDIF
15480REM claimmenu$=""
15490=0
15500
15510DEF FNmenuselect_vocabulary
15520REM When SELECT pressed in small vocab menu
15530CASE item0% OF
15540WHEN 0:PROCprint_vocab
15550ENDCASE
15560REM claimmenu$=""
15570=0
15580
15590DEF FNmenuselect_actors
15600REM SELECT pressed in small 'face' menu (Actors)
15610CASE item0% OF
15620WHEN 0:PROCprint_actors
15630ENDCASE
15640REM claimmenu$=""
15650=0
15660
15670DEF FNmenuselect_eye
15680REM SELECT pressed in small 'eye' menu (Pictures)
15690CASE item0% OF
15700WHEN 0:PROCprint_pix
15710ENDCASE
15720REM claimmenu$=""
15730=0
15740
15750DEF FNmenuselect_misc
15760CASE item0% OF
15770 WHEN 1: REM quit
15780 PROCquit(4)
15790 ENDCASE
15800icon%(THEmiscicon)=-1
15810=0
15820
15830
15840REM ------ Utility procedures and functions for each editor ------
15850
15860REM ------ Character designer utilities ------
15870
15880DEF PROCwrite_chr(C%)
15890VDU 23,C%
15900FOR row%=0 TO 7
15910row_value=0
15920FOR col%=0 TO 7
15930dummy=VAL(FNgeticondata(design,row%*8+col%))
15940bit=flags% >>> 28
15950IF bit=7 THEN row_value=row_value+2^(7-col%)
15960NEXT col%
15970VDU row_value
15980NEXT row%
15990ENDPROC
16000
16010DEF PROCdisplay_chr(C%)
16020?os_block=C%
16030SYS "OS_Word",&A,os_block
16040FOR R%=1 TO 8
16050row_value=R%?os_block
16060FOR C%=0 TO 7
16070bit=row_value DIV 2^(7-C%)
16080row_value=row_value MOD 2^(7-C%)
16090IF bit>0 PROCset_icon(design,(R%-1)*8+C%,&70000000,&F0000000) ELSE PROCset_icon(design,(R%-1)*8+C%,&20000000,&F0000000)
16100NEXT C%
16110NEXT R%
16120ENDPROC
16130
16140DEF PROCsave_chars(f$)
16150f%=OPENOUT(f$)
16160FOR ch%=32 TO max_chr%
16170BPUT#f%,23:BPUT#f%,ch%
16180?os_block=ch%
16190SYS "OS_Word",&A,os_block
16200FOR I%=1 TO 8
16210BPUT#f%,I%?os_block
16220NEXT I%
16230NEXT ch%
16240CLOSE#f%
16250OSCLI("SETTYPE "+f$+" BBC Font")
16260ENDPROC
16270
16280DEF PROCsave_pal(f$)
16290LOCAL ch%,col1,rgb
16300PROCreadPalette
16310ch%=OPENOUT f$
16320FOR col=0 TO 19
16330FOR rgb=1 TO 3
16340BPUT#ch%,rgb(col,rgb)
16350NEXT rgb
16360NEXT col
16370CLOSE#ch%
16380OSCLI "SETTYPE "+f$+" FED"
16390ENDPROC
16400
16410
16420
16430REM ------ Text editor utilities ------
16440
16450DEF PROCleft
16460IF text_col%<>1 THEN
16470 text_ptr%-=1
16480 text_col%-=1
16490ELSE
16500 IF text_row%<>0 THEN
16510 text_row%-=1
16520 text_col%=text_rowlen%(text_row%)+1
16530 IF text_rowlen%(text_row%)<text_maxllen% THEN text_ptr%-=1
16540 PROCgetw(texthandle)
16550 block!20=(text_col%-1)*chX%-(x1%-x0%):SYS OpenW,,block
16560 ELSE
16570 VDU 7
16580 ENDIF
16590ENDIF
16600PROCcheck_scroll_right
16610ENDPROC
16620
16630DEF PROCleft_end
16640text_ptr%-=(text_col%-1)
16650text_col%=1
16660PROCgetw(texthandle)
16670block!20=0:SYS OpenW,,block
16680ENDPROC
16690
16700DEF PROCright
16710IF text_row%=last_row% AND text_col%=text_rowlen%(text_row%)+1 THEN
16720 VDU 7
16730ELSE
16740 REM This '<' was changed to '<=' on 23.08.89
16750 IF text_col%<=text_maxllen% THEN text_ptr%+=1
16760 text_col%+=1
16770 IF text_col%>text_rowlen%(text_row%)+1 AND text_row%<>last_row% THEN
16780 text_col%=1:text_row%+=1
16790 PROCgetw(texthandle)
16800 block!20=0:SYS OpenW,,block
16810 ENDIF
16820ENDIF
16830PROCcheck_scroll_left
16840ENDPROC
16850
16860DEF PROCright_end
16870text_ptr%+=(text_rowlen%(text_row%)-text_col%)+1
16880text_col%=text_rowlen%(text_row%)+1
16890PROCgetw(texthandle)
16900block!20=(text_col%-1)*chX%-(x1%-x0%)+chX% DIV 2:SYS OpenW,,block
16910REM IF text_col%>text_maxllen% text_col%=text_maxllen%
16920ENDPROC
16930
16940DEF PROCdown
16950IF text_row%=text_maxrows% OR text_row%=last_row% THEN
16960 VDU 7
16970ELSE
16980 text_row%+=1
16990 old_col%=text_col%
17000 IF text_rowlen%(text_row%)<text_col% THEN
17010 text_col%=text_rowlen%(text_row%)+1
17020 ENDIF
17030 text_ptr%+=(text_rowlen%(text_row%-1)-old_col%+text_col%)
17040 IF text_rowlen%(text_row%-1)<text_maxllen% text_ptr%+=1
17050ENDIF
17060PROCcheck_scroll_up
17070ENDPROC
17080
17090DEF PROCup
17100IF text_row%<>0 THEN
17110 text_row%-=1
17120 old_col%=text_col%
17130 IF text_rowlen%(text_row%)<text_col% THEN
17140 text_col%=text_rowlen%(text_row%)+1
17150 ENDIF
17160 text_ptr%-=(old_col%+(text_rowlen%(text_row%)-text_col%))
17170 IF text_rowlen%(text_row%)<text_maxllen% text_ptr%-=1
17180ELSE
17190 VDU 7
17200ENDIF
17210PROCcheck_scroll_down
17220ENDPROC
17230
17240DEF PROCnewline
17250old_col%=text_col%
17260PROCinsert_char(13)
17270text_row%+=1
17280text_col%=1
17290PROCupdate(texthandle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%)+chX%,scy%)
17300dummy=FNredraw_text(TRUE)
17310PROCcheck_scroll_up
17320ENDPROC
17330
17340DEF PROCinsert_char(chr%)
17350LOCAL flag1,flag2
17360IF text_ptr%>text_end% THEN FOR I%=text_end% TO text_ptr%:?I%=32:NEXT:text_end%=text_ptr%
17370IF text_ptr%=text_end% OR text_rowlen%(text_row%)<text_maxllen%-1 THEN
17380 redraw_all%=FALSE
17390ELSE
17400 redraw_all%=TRUE
17410ENDIF
17420
17430PROCmove(text_ptr%,text_ptr%+1,text_end%-text_ptr%)
17440IF text_ptr%<mark(0) THEN mark(0)+=1
17450IF text_ptr%<mark(1) THEN mark(1)+=1
17460?text_ptr%=chr%:text_ptr%+=1:text_end%+=1:?text_end%=0
17470
17480IF text_rowlen%(text_row%)<text_maxllen%-1 AND chr%<>13 THEN
17490REM The '-1' above added 29.08.89 to fix bug 8a.
17500text_rowlen%(text_row%)+=1
17510ELSE
17520last_row%=FNfind_lastrow
17530FOR R%=text_row% TO last_row%
17540 text_rowlen%(R%)=LEN FNrow(R%)
17550NEXT
17560ENDIF
17570
17580IF redraw_all% THEN
17590PROCupdate(texthandle,0,-(last_row%+1)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%)*lsY%)
17600ELSE
17610IF text_col%>text_maxllen% THEN
17620PROCupdate(texthandle,0,-(text_row%)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%-1)*lsY%)
17630ELSE
17640PROCupdate(texthandle,chX%*(text_col%-1),-(text_row%+1)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%)*lsY%)
17650ENDIF
17660ENDIF
17670
17680IF text_col%>text_maxllen% THEN
17690 text_col%=2:text_row%+=1
17700 IF text_row%>last_row% last_row%=text_row%
17710 flag1=TRUE
17720ELSE
17730 text_col%+=1
17740 IF text_col%>text_maxllen% THEN
17750 text_col%=1:text_row%+=1
17760 IF text_row%>last_row% last_row%=text_row%
17770 flag1=TRUE
17780 ENDIF
17790ENDIF
17800
17810dummy=FNredraw_text(redraw_all%)
17820PROCcheck_scroll_left:PROCcheck_scroll_up
17830IF flag1 THEN
17840 PROCgetw(texthandle)
17850 block!20=0:SYS OpenW,,block
17860ENDIF
17870ENDPROC
17880
17890DEF PROCoverwrite_char(chr%)
17900IF text_col%>text_rowlen%(text_row%) THEN PROCinsert_char(chr%):ENDPROC
17910IF text_ptr%=mark(0) THEN SWAP mark(0),mark(1):SWAP asc(0),asc(1):SWAP chr(0),chr(1):mrk-=1:mark(1)=0 ELSE IF text_ptr%=mark(1) THEN mrk-=1:mark(1)=0
17920?text_ptr%=chr%
17930text_ptr%+=1
17940IF text_ptr%>text_end% text_end%=text_ptr%
17950?text_end%=0
17960PROCupdate(texthandle,chX%*(text_col%-1),-(text_row%+1)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%)*lsY%)
17970dummy=FNredraw_text(TRUE)
17980text_col%+=1
17990IF text_col%>text_maxllen% THEN text_col%=1:text_row%+=1
18000
18010last_row%=FNfind_lastrow
18020
18030FOR R%=text_row% TO last_row%
18040 text_rowlen%(R%)=LEN FNrow(R%)
18050NEXT
18060ENDPROC
18070
18080DEF PROCdelete_char
18090IF text_col%=1 AND text_row%=0 VDU 7:ENDPROC
18100IF text_ptr%<mark(0) THEN mark(0)-=1
18110IF text_ptr%<mark(1) THEN mark(1)-=1
18120text_ptr%-=1:text_end%-=1
18130IF text_ptr%=mark(0) THEN SWAP mark(0),mark(1):SWAP asc(0),asc(1):SWAP chr(0),chr(1):mrk-=1:mark(1)=0 ELSE IF text_ptr%=mark(1) THEN mrk-=1:mark(1)=0
18140text_col%-=1:this_row%=text_row%:REM text_rowlen%(text_row%)-=1
18150cr%=FALSE
18160IF text_col%<1 THEN
18170 cr%=TRUE
18180 text_col%=text_rowlen%(text_row%-1)
18190 IF ?text_ptr%=13 text_col%+=1
18200 text_row%-=1
18210ENDIF
18220PROCmove(text_ptr%+1,text_ptr%,text_end%-text_ptr%+1)
18230
18240IF text_rowlen%(this_row%)<text_maxllen% AND NOT cr% THEN
18250text_rowlen%(this_row%)-=1
18260ELSE
18270last_row%=FNfind_lastrow
18280FOR R%=text_row% TO last_row%
18290 text_rowlen%(R%)=LEN FNrow(R%)
18300NEXT
18310ENDIF
18320PROCgetw(texthandle)
18330IF (text_ptr%=text_end% OR text_rowlen%(text_row%)<text_maxllen%-1) AND NOT cr% THEN
18340PROCupdate(texthandle,chX%*(text_col%-1),-(text_row%+1)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%)*lsY%)
18350 C%=text_col%
18360ELSE
18370PROCupdate(texthandle,0,-(last_row%+2)*lsY%,scx%+(x1%-x0%)+chX%,-(text_row%)*lsY%)
18380REM PROCupdate(texthandle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%)+chX%,scy%)
18390ENDIF
18400
18410dummy=FNredraw_text(TRUE)
18420IF cr% THEN
18430PROCgetw(texthandle)
18440block!20=(text_col%-1)*chX%-(x1%-x0%):SYS OpenW,,block
18450ENDIF
18460ENDPROC
18470
18480DEF PROCinsert_line
18490IF last_row%=text_maxrows% THEN VDU7:ENDPROC
18500from%=text_ptr%-text_col%+1
18510IF from%<mark(0) THEN mark(0)+=1
18520IF from%<mark(1) THEN mark(1)+=1
18530PROCmove(from%,from%+1,text_end%-from%+1)
18540?from%=13
18550FOR R%=last_row%+1 TO text_row%+1 STEP -1
18560text_rowlen%(R%)=text_rowlen%(R%-1)
18570NEXT
18580text_rowlen%(text_row%)=0
18590text_end%+=1:last_row%+=1
18600text_ptr%-=text_col%-1
18610text_col%=1
18620PROCupdate(texthandle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%)+chX%,scy%-(text_row%)*lsY%)
18630dummy=FNredraw_text(TRUE)
18640ENDPROC
18650
18660DEF PROCdelete_line
18670LOCAL cr%,to%
18680PROCremove_markers
18690next_line%=text_ptr%+text_rowlen%(text_row%)-text_col%+1
18700text_ptr%-=(text_col%-1):to%=text_ptr%
18710IF ?(text_ptr%+text_rowlen%(text_row%))=13 next_line%+=1:cr%=TRUE
18720PROCmove(next_line%,to%,text_end%-next_line%)
18730text_end%-=text_rowlen%(text_row%)
18740IF cr% text_end%-=1
18750IF text_end%<text_block% text_end%=text_block%
18760?text_end%=0
18770text_col%=1
18780last_row%=FNfind_lastrow
18790
18800FOR R%=text_row% TO last_row%
18810 text_rowlen%(R%)=LEN FNrow(R%)
18820NEXT
18830
18840REM PROCupdate(texthandle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%)+chX%,scy%-(text_row%)*lsY%)
18850PROCupdate(texthandle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%)+chX%,scy%)
18860dummy=FNredraw_text(TRUE)
18870ENDPROC
18880
18890DEF PROCinstall_texted
18900text_maxrows%=500
18910text_blocksize%=20000
18920text_original%=TRUE
18930DIM text_rowlen%(text_maxrows%)
18940DIM default_text_block% text_blocksize%+300
18950text_block%=default_text_block%
18960dummy_spc=27:dummy_cr=253
18970VDU23,dummy_spc,0,0,0,0,0,0,0,0
18980VDU23,dummy_cr,0,0,0,0,0,0,0,0
18990text_row%=0
19000text_col%=1
19010last_row%=0
19020text_cur%=TRUE
19030overwrite=FALSE
19040tab_set=5
19050text_ptr%=text_block%
19060text_end%=text_block%
19070?text_block%=0
19080mrk=0:DIM mark(1),row(1),col(1),chr(1),asc(1):chr(0)=254:chr(1)=255:cliplen=0
19090ENDPROC
19100
19110DEF PROCremove_markers
19120LOCAL I%
19130IF mrk>0 THEN
19140mrk-=1
19150FOR I%=0 TO mrk
19160?mark(I%)=asc(I%):mark(I%)=0
19170NEXT
19180mrk=0
19190ENDIF
19200ENDPROC
19210
19220DEF FNfind_lastrow
19230LOCAL A%,B%
19240A%=text_block%:B%=text_end%
19250CALL lastrow
19260=!rowcount
19270
19280DEF FNrow(row%)
19290LOCAL A%,B%
19300A%=text_block%:B%=row%
19310CALL row
19320=$linebuffer
19330
19340
19350REM ------ Object editor utilities ------
19360
19370DEF PROCfirst_obj
19380PROCstore_obj(optr)
19390optr=1
19400PROCrestore_obj(1)
19410ENDPROC
19420
19430DEF PROClast_obj
19440PROCstore_obj(optr)
19450optr=last_object
19460PROCrestore_obj(optr)
19470ENDPROC
19480
19490DEF PROCnext_obj
19500PROCstore_obj(optr)
19510optr+=1
19520IF optr>maxobs optr=maxobs
19530PROCrestore_obj(optr)
19540ENDPROC
19550
19560DEF PROCprev_obj
19570PROCstore_obj(optr)
19580optr-=1
19590IF optr<1 optr=1
19600PROCrestore_obj(optr)
19610ENDPROC
19620
19630DEF PROCfwd_obj(times%)
19640PROCstore_obj(optr)
19650optr+=times%:IF optr>maxobs THEN optr=maxobs
19660PROCrestore_obj(optr)
19670ENDPROC
19680
19690DEF PROCrewind_obj(times%)
19700PROCstore_obj(optr)
19710optr-=times%:IF optr<1 THEN optr=1
19720PROCrestore_obj(optr)
19730ENDPROC
19740
19750DEF PROCstore_obj(o%)
19760REM This reads the object data from the writeable icons in the window
19770REM and stores it in the object data area (odata%...)
19780LOCAL olddata
19790ptr=o%*o_len
19800
19810FOR I%=8 TO 15
19820 icondata=VAL(FNgeticondata(objhandle,I%))
19830 CASE I% OF
19840 WHEN 10,11,12,13
19850 REM The double-byte values
19860 olddata=?(odata%+ptr)+?(odata%+ptr+1)*256
19870 IF icondata<>olddata THEN data_saved=FALSE
19880 ?(odata%+ptr)=icondata MOD 256
19890 ?(odata%+ptr+1)=icondata DIV 256
19900 ptr+=2
19910 WHEN 8,9,14,15
19920 REM The single-byte values
19930 olddata=?(odata%+ptr)
19940 IF olddata<>icondata MOD 256 THEN data_saved=FALSE
19950 ?(odata%+ptr)=icondata MOD 256:ptr+=1
19960 ENDCASE
19970NEXT
19980IF container THEN
19990?(odata%+ptr)=?(odata%+ptr) OR %10000000:ptr+=1:?(odata%+ptr)=cont_room
20000ELSE
20010?(odata%+ptr)=?(odata%+ptr) AND %01111111:ptr+=1:?(odata%+ptr)=0
20020ENDIF
20030ENDPROC
20040
20050DEF PROCrestore_obj(o%)
20060REM This reads the data for object o% from memory and updates the icon
20070REM contents, ensuring the window reflects the new values
20080
20090ptr=o%*o_len
20100PROCchangeicon(objhandle,7,STR$(o%),icon%)
20110FOR I%=8 TO 15
20120 CASE I% OF
20130 WHEN 10,11,12,13:data$=STR$(?(odata%+ptr)+256*?(odata%+ptr+1)):ptr+=2
20140 WHEN 8,9,14,15:data$=STR$(?(odata%+ptr)):ptr+=1
20150 ENDCASE
20160 IF data$="" THEN data$="0"
20170 PROCchangeicon(objhandle,I%,data$,newicon%)
20180NEXT I%
20190
20200store=small_area%:col%=1:row%=0
20210PROCfill(small_area%,small_areasize%,13)
20220print=FALSE
20230PROCpvok(FNfindnoun(o%,void),1,FALSE)
20240PROCchangeicon(objhandle,19,$small_area%,newicon%)
20250IF ((?(odata%+ptr) AND %10000000) DIV 128)>0 THEN container=TRUE ELSE container=FALSE
20260ptr+=1
20270cont_room=?(odata%+ptr):$controom%=STR$(cont_room)
20280IF container PROCchangeicon(objhandle,26,"SIZE <C>",newicon%) ELSE PROCchangeicon(objhandle,26,"SIZE",newicon%)
20290ENDPROC
20300
20310
20320REM ------ Room editor utilities ------
20330
20340DEF PROCfirst_room
20350PROCstore_room(rptr)
20360rptr=1
20370PROCrestore_room(1)
20380ENDPROC
20390
20400DEF PROClast_room
20410PROCstore_room(rptr)
20420rptr=last_room
20430PROCrestore_room(rptr)
20440ENDPROC
20450
20460DEF PROCnext_room
20470PROCstore_room(rptr)
20480rptr+=1
20490IF rptr>maxrms rptr=maxrms
20500PROCrestore_room(rptr)
20510ENDPROC
20520
20530DEF PROCprev_room
20540PROCstore_room(rptr)
20550rptr-=1
20560IF rptr<1 rptr=1
20570PROCrestore_room(rptr)
20580ENDPROC
20590
20600DEF PROCfwd_room(times%)
20610PROCstore_room(rptr)
20620rptr+=times%:IF rptr>maxrms THEN rptr=maxrms
20630PROCrestore_room(rptr)
20640ENDPROC
20650
20660DEF PROCrewind_room(times%)
20670PROCstore_room(rptr)
20680rptr-=times%:IF rptr<1 THEN rptr=1
20690PROCrestore_room(rptr)
20700ENDPROC
20710
20720DEF PROCstore_room(r%)
20730ptr=r%*r_len
20740FOR I%=34 TO 69
20750 icondata=VAL(FNgeticondata(roomhandle,I%))
20760 CASE TRUE OF
20770 WHEN I%>35 AND I%<54
20780 olddata=?(rdata%+ptr)+?(rdata%+ptr+1)*256
20790 IF icondata<>olddata THEN data_saved=FALSE
20800 ?(rdata%+ptr)=icondata MOD 256
20810 ?(rdata%+ptr+1)=icondata DIV 256
20820 ptr+=2
20830 WHEN I%<36 OR I%>53
20840 olddata=?(rdata%+ptr)
20850 IF olddata<>icondata MOD 256 THEN data_saved=FALSE
20860 ?(rdata%+ptr)=icondata MOD 256
20870 ptr+=1
20880 ENDCASE
20890NEXT I%
20900icondata=VAL(FNgeticondata(roomhandle,71))
20910?(rdata%+ptr+16)=icondata MOD 256
20920?(rdata%+ptr+17)=icondata DIV 256
20930ENDPROC
20940
20950DEF PROCrestore_room(r%)
20960ptr=r%*r_len
20970PROCchangeicon(roomhandle,33,STR$(r%),icon%)
20980FOR I%=34 TO 69
20990 CASE TRUE OF
21000 WHEN I%>35 AND I%<54
21010 data$=STR$(?(rdata%+ptr)+256*?(rdata%+ptr+1)):ptr+=2
21020 WHEN I%<36 OR I%>53
21030 data$=STR$(?(rdata%+ptr)):ptr+=1
21040 ENDCASE
21050 IF data$="" THEN data$="0"
21060 PROCchangeicon(roomhandle,I%,data$,newicon%)
21070NEXT I%
21080data$=STR$(?(rdata%+ptr+16)+256*?(rdata%+ptr+17))
21090IF data$="" THEN data$="0"
21100PROCchangeicon(roomhandle,71,data$,newicon%)
21110ENDPROC
21120
21130
21140REM ------ Message editor utilities ------
21150
21160DEF PROCstore_msg
21170errflag=FALSE:PROCremove_markers
21180newlen=text_end%-text_block%
21190diff=newlen-oldlen
21200IF diff+text%!2>maxtext% THEN
21210 PROCerror(13,error$(36))
21220 errflag=TRUE
21230ELSE
21240 to=mstart+newlen-1
21250 from=mend-1
21260 text_end%=text_block%:text_ptr%=text_block%
21270 bytes_to_move=FNtext_end-mend+1
21280 PROCmove(from,to,bytes_to_move)
21290 PROCmove(text_block%,mstart,newlen)
21300 PROCincmsglen(diff)
21310 ns%=switch_vals(0)
21320 IF ns%>0 THEN
21330 ?switch_buf%=ns%:ptr%=1
21340 FOR I%=1 TO ns%
21350 switch_buf%?ptr%=switch_vals(I%)
21360 switch_buf%?(ptr%+1)=switch_vals(I%) DIV 256
21370 ptr%+=2
21380 NEXT
21390 ELSE
21400 PROCfill(switch_buf%,maxsw%*2+1,0)
21410 ENDIF
21420 PROCmove(mstart,swloc+2*ns%+1,FNtext_end-mstart)
21430 PROCmove(switch_buf%,swloc,2*ns%+1)
21440 PROCincmsglen(2*ns%-2*oldsw)
21450ENDIF
21460ENDPROC
21470
21480DEF PROCincmsglen(bytes_to_add)
21490text%!2=text%!2+bytes_to_add
21500ENDPROC
21510
21520DEF FNtext_end
21530=text%+text%!2
21540
21550DEF FNmaxmsg
21560=?text%+256*text%?1
21570
21580DEF PROCincmaxmsg
21590?text%+=1:IF ?text%=0 ?(text%+1)+=1
21600ENDPROC
21610
21620DEF PROCshow_msg(ms%)
21630IF ms%>FNmaxmsg THEN ERROR 4,error$(31)
21640IF ms%<1 ENDPROC
21650PROCfill(text_block%,text_blocksize%,dummy_spc)
21660text_rowlen%()=+0:switch_vals()=+0
21670changed_msg=TRUE
21680A%=ms%:C%=text%+7:ptr%=USR findmsg
21690chr%=?ptr%:ptr%+=1
21700switch_vals(0)=chr%:oldsw=chr%:swloc=ptr%-1
21710IF chr%>0 THEN
21720 FOR I%=1 TO chr%
21730 switch_vals(I%)=?ptr%+256*ptr%?1
21740 ptr%+=2
21750 NEXT
21760ENDIF
21770mstart=ptr%
21780chr%=?ptr%
21790row%=0:text_ptr%=text_block%
21800WHILE chr%>0
21810 col%=1:line$=""
21820 WHILE chr%<>13 AND chr%<>0 AND col%<=text_maxllen%
21830 IF chr%>&7F THEN
21840 tokptr=chr%-&7F
21850 line$+=tok$(tokptr):L%=LEN tok$(tokptr)
21860 FOR I%=1 TO L%
21870 ?(text_ptr%+I%-1)=ASC(MID$(tok$(tokptr),I%,1))
21880 NEXT
21890 text_ptr%+=(L%-1)
21900 ELSE
21910 ?text_ptr%=chr%:line$+=CHR$ chr%
21920 ENDIF
21930 ptr%+=1:text_ptr%+=1:chr%=?ptr%:col%+=1
21940 ENDWHILE
21950 text_rowlen%(row%)=LEN line$
21960 IF col%>text_maxllen% OR chr%=13 row%+=1:col%=1
21970 IF chr%=13 ?text_ptr%=13:text_ptr%+=1:ptr%+=1
21980 chr%=?ptr%:REM ptr%+=1
21990ENDWHILE
22000mend=ptr%:?text_ptr%=chr%
22010text_end%=text_ptr%
22020oldlen=mend-mstart
22030IF oldlen<0 oldlen=0
22040text_ptr%=text_block%
22050last_row%=FNfind_lastrow
22060FOR I%=0 TO last_row%:text_rowlen%(I%)=LEN FNrow(I%):NEXT
22070ENDPROC
22080
22090DEF PROCnext_msg
22100mptr+=1
22110PROCstore_msg:REM save this one first
22120IF mptr>FNmaxmsg THEN ptr=FNtext_end:ptr?0=0:ptr?1=0:PROCincmaxmsg:PROCincmsglen(2)
22130PROCshow_msg(mptr):REM Now load the next one into `texted`
22140PROCretitle_text("MESSAGE "+STR$mptr):REM PROCforceR(texthandle)
22150ENDPROC
22160
22170DEF PROCprev_msg
22180IF mptr>1 THEN
22190mptr-=1
22200PROCstore_msg
22210PROCshow_msg(mptr)
22220PROCretitle_text("MESSAGE "+STR$mptr)
22230ENDIF
22240ENDPROC
22250
22260DEF PROCgoto_msg(ms%)
22270IF ms%>FNmaxmsg ms%=FNmaxmsg:VDU 7
22280IF ms%<1 ms%=1:VDU 7
22290PROCstore_msg
22300PROCshow_msg(ms%)
22310mptr=ms%
22320PROCretitle_text("MESSAGE "+STR$mptr)
22330ENDPROC
22340
22350DEF PROClast_msg
22360PROCstore_msg
22370mptr=FNmaxmsg
22380PROCshow_msg(mptr)
22390PROCretitle_text("MESSAGE "+STR$mptr)
22400ENDPROC
22410
22420DEF PROCfirst_msg
22430PROCstore_msg
22440mptr=1
22450PROCshow_msg(mptr)
22460PROCretitle_text("MESSAGE "+STR$mptr)
22470ENDPROC
22480
22490
22500REM ------ Program Editor utilities ------
22510
22520DEF PROCstore_prog
22530LOCAL sp_ptr%,line$,chr%
22540REM Use `hourglass` pointer
22550SYS "Hourglass_On"
22560errflag=FALSE:PROCremove_markers
22570sp_ptr%=text_block%
22580chr%=?sp_ptr%
22590prgptr=prgbuf%
22600WHILE sp_ptr%<text_end% AND NOT errflag
22610 line$=""
22620 WHILE (chr%<>13) AND (chr%<>0) AND (chr%<>dummy_spc)
22630 chr%=?sp_ptr%
22640 sp_ptr%+=1
22650 line$+=CHR$(chr%)
22660 ENDWHILE
22670 PROCscan
22680 chr%=?sp_ptr%
22690 WHILE (chr%=13 OR chr%=dummy_spc OR chr%=0) AND (sp_ptr%<text_end%)
22700 sp_ptr%+=1:chr%=?sp_ptr%
22710 ENDWHILE
22720ENDWHILE
22730IF NOT errflag THEN
22740 oldlen%=prgend-pstart:IF oldlen%<>0 oldlen%+=1
22750 bytes_to_move=FNprglen-oldlen%
22760 PROCincprglen(-oldlen%)
22770 newlen%=prgptr-prgbuf%
22780 REM This check for 'No room' was added 2.6.89
22790 IF FNprglen+newlen%>code_size%-4 THEN
22800 PROCincprglen(oldlen%)
22810 PROCerror(13,error$(35))
22820 ELSE
22830 PROCmove(prgend+1,pstart+newlen%,bytes_to_move)
22840 PROCmove(prgbuf%,pstart,newlen%)
22850 PROCincprglen(newlen%)
22860 ?(program%+4+FNprglen)=0:REM restore end of program marker (9/4/89)
22870 text_ok=TRUE
22880 ENDIF
22890ENDIF
22900SYS "Hourglass_Off"
22910ENDPROC
22920
22930DEF FNprglen
22940=!program%
22950
22960DEF PROCincprglen(bytes)
22970!program%=!program%+bytes
22980ENDPROC
22990
23000
23010REM ------ Window `redraw` functions ------
23020
23030
23040DEF FNredraw_text(flag%)
23050REM flag%=TRUE -> redraw WHOLE text window
23060REM else only redraw from the cursor line
23070
23080WHILE more%
23090BR%=(by%-block!32-ypixel%) DIV lsY%
23100IF BR%>last_row% BR%=last_row%
23110TR%=(by%-block!40-ypixel%) DIV lsY%
23120IF TR%>last_row% TR%=last_row%
23130ptr_end%=BR%*text_maxllen%+text_block%
23140CLG
23150FOR I%=TR% TO BR%
23160 MOVE bx%,by%-lsY%*I%-ypixel%
23170 PRINT FNrow(I%);
23180NEXT
23190SYSGetR,0,block TO more%
23200ENDWHILE
23210=0
23220
23230
23240REM ------ General icon handling routines ------
23250
23260DEF PROCht(handle%,icon%,fl$,fc%,bc%)
23270LOCALmask%
23280IFfl$="*"THENfl%=0:mask%=&FF000000 ELSEfl%=EVALfl$:mask%=-1
23290!block=handle%:block!4=icon%:block!8=fl%:block?11=fc%+(bc%<<4):block!12=mask%:SYS SetI,0,block
23300ENDPROC
23310
23320DEF FNgeticondata(handle%,icon%)
23330!block=handle%:block!4=icon%
23340SYS GetI,0,block
23350flags%=block!24
23360IF (flags% AND 256)<>0 THEN data$=$(!(block+28)) ELSE data$=$(block+28)
23370=data$
23380
23390DEF PROCchangeicon(handle%,icon%,new$,RETURN icon%)
23400LOCAL J%
23410dummy$=FNgeticondata(handle%,icon%)
23420IF (flags% AND 256)<>0 THEN $(!(block+28))=new$ ELSE $(block+28)=new$
23430SYS DeleteI,0,block
23440FOR J%=4 TO 28 STEP 4
23450 block!J%=block!(J%+4)
23460NEXT J%
23470!block=handle%:SYS CreateI,0,block TO icon%
23480PROCset_icon(handle%,icon%,0,0):REM ensure it appears updated on screen
23490ENDPROC
23500
23510DEF PROCset_icon(handle%,icon%,eor%,mask%)
23520!block=handle%:block!4=icon%:block!8=eor%:block!12=mask%
23530SYS SetI,0,block
23540ENDPROC
23550
23560
23570REM ------ Menu creation procedures ------
23580
23590REM **** onIconBar = 1 if yes, otherwise 0 **********
23600DEF FNmenuHeight(theMenu%, onIconBar%)
23610= ((96 * onIconBar%) + (theMenu%?30 * 44) + (theMenu%?31 * 24))
23620
23630
23640DEF FNcrmenu
23650IF menufree%+28 > menuend% THEN ERROR 1,error$(32)
23660LOCAL m%,menu$:READ menu$
23670
23680
23690REM ************** the bodge to store the menu height ****************
23700LOCAL menuHiAddr%
23710menuHiAddr% = menufree% + 28 + 2 :REM 2nd last byte in 1st menuitem flags
23720menuItemNum% = 0
23730dashItemNum% = 0
23740
23750
23760IF LEFT$(menu$,1)="=" THEN menu$=EVALMID$(menu$,2)
23770menuptr%=menufree%
23780i%=0:ctr%=0
23790IF LEFT$(menu$,1)="#" THEN i%=1:menutitle$=FNpar(",") ELSE menutitle$=""
23800I%=INSTR(menutitle$,">")
23810IF I%>0 THEN
23820 menuptr%!20=EVAL(MID$(menutitle$,I%+1))
23830 menutitle$=LEFT$(menutitle$,I%-1)
23840ELSE menuptr%!20=44
23850ENDIF
23860$menuptr%=menutitle$
23870menuptr%?12=`tfcol:menuptr%?13=`tbcol:menuptr%?14=`wfcol:menuptr%?15=`wbcol
23880menuptr%!16=196-24:menuptr%!24=0
23890menuptr%+=28:maxx%=LENmenutitle$-3
23900WHILE RIGHT$(menu$,1)="~"
23910 menu$=LEFT$(menu$,LENmenu$-1)
23920 REPEAT item$=FNpar(","):PROCmenuitem(item$):UNTIL item$=""
23930 READ menu$
23940ENDWHILE
23950REPEAT item$=FNpar(","):PROCmenuitem(item$):UNTIL item$=""
23960menuptr%!-24=(menuptr%!-24)OR&80
23970m%=menufree%:m%!16=(maxx%*8+6)*dx%
23980menufree%=menuptr%
23990?menuHiAddr% = menuItemNum% : REM the number of items
24000?(menuHiAddr% +1) = dashItemNum% : REM the number of dashes
24010=m%
24020
24030DEF PROCmenuitem(text$)
24040IF text$="" THEN ENDPROC
24050IF menuptr%+24 > menuend% THEN ERROR 1,error$(32)
24060IF text$="&" THEN
24070 SYS "Font_ListFonts",,q%,ctr% TO ,,ctr%
24080 IF ctr%>=0 THEN text$=$q%+">m_fsize%":i%-=2 ELSE ENDPROC
24090ENDIF
24100LOCALi%,flg%
24110
24120menuItemNum% += 1
24130
24140flg%=&00
24150i%=INSTR(text$,">")
24160IFi%>0THENsubptr%=EVALMID$(text$,i%+1):text$=LEFT$(text$,i%-1)ELSEsubptr%=-1
24170IF RIGHT$(text$,1)="#" THEN text$=LEFT$(text$,LENtext$-1):flg%+=&02:dashItemNum% += 1
24180menuptr%!0=flg%
24190menuptr%!4=subptr%
24200menuptr%!8=&07000021
24210IF LEFT$(text$,1)="?" THEN
24220 menuptr%!8=&0700011A
24230 I%=FNworkspace(LENtext$):$I%=MID$(text$,2)
24240 menuptr%!12=I%:menuptr%!16=systemsprites%:menuptr%!20=LENtext$
24250ELSE
24260 IF LEFT$(text$,1)="$" THEN
24270 !menuptr%+=&04
24280 menuptr%!8+=&100
24290 i%=INSTR(text$,"(")
24300 IFi%>0THENL%=VALMID$(text$,i%+1):text$=LEFT$(text$,i%-1)ELSEL%=12
24310 menuptr%!12=EVAL(MID$(text$,2)):menuptr%!16=-1:menuptr%!20=L%
24320 text$=STRING$(L%," ")
24330 ELSE
24340 IFLENtext$<=12THEN
24350 $(menuptr%+12)=text$
24360 ELSE I%=FNworkspace(LENtext$+1):$I%=text$
24370 menuptr%!12=I%:menuptr%!16=-1:menuptr%!20=LENtext$+1
24380 menuptr%!8=menuptr%!8 OR &100
24390 ENDIF
24400 ENDIF
24410 IFLENtext$>maxx%THENmaxx%=LENtext$
24420ENDIF
24430menuptr%+=24
24440ENDPROC
24450
24460DEF FNpar(sep$)
24470i1%=i%+1:i%=INSTR(menu$+sep$,sep$,i1%)
24480=MID$(menu$,i1%,i%-i1%)
24490
24500DEF FNworkspace(L%)
24510IF curbuff%+L%>buffer%+maxbuf% THEN ERROR 1,error$(33)
24520curbuff%+=L%:=curbuff%-L%
24530
24540
24550REM ------ Procedures to interface with ARM code ------
24560
24570DEF PROCmove(from,to,bytes_to_move)
24580IF bytes_to_move=0 THEN ENDPROC
24590A%=from:B%=to:C%=bytes_to_move
24600CALL move
24610ENDPROC
24620
24630DEF PROCfill(start,bytes,filler)
24640A%=start:B%=bytes:C%=filler
24650CALLfill
24660ENDPROC
24670
24680
24690REM ------ ARM source code ------
24700
24710DEF PROCassemble(addr%)
24720LOCAL pass
24730sp=13:link=14
24740FOR pass=0 TO 2 STEP 2
24750P%=addr%
24760[OPT pass
24770.fill b fill2
24780.move b blockmove
24790
24800.fill2
24810\ r0=start address r1=number of bytes r2=value to fill with
24820\ all registers are preserved
24830stmfd (sp)!,{r0-r3,link}
24840mov r3,r0
24850add r3,r3,r1
24860.fillloop
24870strb r2,[r0],#1
24880cmp r0,r3
24890blt fillloop
24900ldmfd (sp)!,{r0-r3,PC}
24910
24920\ General purpose block move routine (up or down and overlapping)
24930\ r0 = `from` address, r1 = `to` address, r2 = number of bytes to move
24940.blockmove
24950cmp r0,r1
24960blt moveup
24970bal movedown
24980
24990.movedown
25000\ Move memory block down
25010\ r0 = `from` address, r1= `to` address, r2 = number of bytes to move
25020stmfd (sp)!,{r0-r3,link}
25030
25040.movdloop
25050ldrb r3,[r0],#1
25060strb r3,[r1],#1
25070subs r2,r2,#1
25080bne movdloop
25090
25100ldmfd (sp)!,{r0-r3,PC}
25110
25120.moveup
25130\ Move memory block up
25140\ r0 = `from` address, r1= `to` address, r2 = number of bytes to move
25150
25160stmfd (sp)!,{r0-r3,link}
25170sub r2,r2,#1
25180add r0,r0,r2
25190add r1,r1,r2
25200\ Call here if r2 = end address
25210.moveuploop
25220ldrb r3,[r0],#-1
25230strb r3,[r1],#-1
25240subs r2,r2,#1
25250bpl moveuploop
25260ldmfd (sp)!,{r0-r3,PC}
25270
25280.lastrow
25290\ Find last row of text
25300\ Entry - r0 = start address of text (text_block%)
25310\ r1 = end address of text (text_end%)
25320\ Exit - number of last row is in 'rowcount' (rows numbered 0,1,2...)
25330stmfd (sp)!,{r0-r4,link}
25340mov r2,#0
25350mov r3,#0
25360mov r4,#0
25370
25380.while
25390cmp r0,r1
25400beq endwhile
25410ldrb r3,[r0],#1
25420add r4,r4,#1
25430cmp r4,#text_maxllen%
25440addeq r2,r2,#1
25450moveq r4,#0
25460beq while
25470cmp r3,#13
25480addeq r2,r2,#1
25490moveq r4,#0
25500cmp r3,#dummy_cr
25510addeq r2,r2,#1
25520moveq r4,#0
25530bal while
25540
25550.endwhile
25560str r2,rowcount
25570ldmfd (sp)!,{r0-r4,PC}
25580
25590.rowcount EQUD 0
25600
25610.row
25620\ Returns the string of text in the specified row of the text block
25630\ Entry - r0 = start address of text (text_block%)
25640\ r1 = row wanted (0,1,2...)
25650\ Exit - the string is returned in 'linebuffer', terminated by <cr>
25660\ r2 is the current row
25670\ r3 is the current character
25680\ r4 is the length of the current row
25690
25700stmfd (sp)!,{r0-r4,link}
25710mov r2,#0
25720mov r4,#0
25730
25740.while2
25750cmp r2,r1
25760beq endwhile2
25770ldrb r3,[r0],#1
25780add r4,r4,#1
25790cmp r4,#text_maxllen%
25800moveq r4,#0
25810addeq r2,r2,#1
25820beq while2
25830cmp r3,#13
25840moveq r4,#0
25850addeq r2,r2,#1
25860cmp r3,#dummy_cr
25870moveq r4,#0
25880addeq r2,r2,#1
25890bal while2
25900
25910.endwhile2
25920adr r1,linebuffer
25930mov r4,#0
25940
25950.strloop
25960ldrb r3,[r0],#1
25970add r4,r4,#1
25980cmp r3,#0
25990beq lineend
26000cmp r3,#dummy_spc
26010beq lineend
26020cmp r3,#13
26030beq lineend
26040cmp r3,#dummy_cr
26050streqb r3,[r1],#1
26060beq lineend
26070strb r3,[r1],#1
26080cmp r4,#text_maxllen%
26090bne strloop
26100
26110.lineend
26120cmp r3,#0
26130moveq r3,#13
26140cmp r3,#dummy_spc
26150moveq r3,#13
26160cmp r3,#dummy_cr
26170moveq r3,#13
26180cmp r4,#text_maxllen%
26190moveq r3,#13
26200strb r3,[r1],#1
26210ldmfd (sp)!,{r0-r4,PC}
26220
26230.linebuffer EQUS STRING$(text_maxllen%+1,CHR$ dummy_spc)
26240 align
26250
26260.findmsg
26270\Finds start of specified message
26280\Entry - r0 = message number
26290\ - r2 = text start address (MSG#0)
26300\Exit - r0 = start address of message (switches)
26310stmfd (sp)!,{r1-r3,link}
26320cmp r0,#0
26330beq startm
26340
26350.nxtmsg
26360ldrb r1,[r2],#1
26370add r2,r2,r1, lsl #1 \ r2 = r2 + r1*2
26380
26390.readch
26400ldrb r1,[r2],#1
26410cmp r1,#0
26420bne readch
26430subs r0,r0,#1
26440bne nxtmsg
26450
26460.startm
26470mov r0,r2
26480ldmfd (sp)!,{r1-r3,pc}
26490
26500.pvok
26510;Print Verb, Object or Keyword (returns the word string)
26520;Entry - r0 = Number of word to print
26530; r1 = address of required word table
26540;Exit - word is in 'atext' terminated by <cr>
26550stmfd (sp)!,{r0-r5,link}
26560mov r3,r0 \Word number is now in r3
26570mov r4,r2 \r4 is 'all' flag
26580mov r5,#0 \r5 is 'ctr'
26590
26600.LLL1
26610adr r2,atext \r2 points to 'atext'
26620
26630.LLL2
26640ldrb r0,[r1] \Get character from list
26650\orr r0,r0,#32 \Convert to lower case
26660strb r0,[r2] \Put it in 'text'
26670tst r0,#&80 \Is bit 7 set (end of the word)
26680bne endofw \Yes
26690add r2,r2,#1
26700add r1,r1,#1
26710b LLL2
26720
26730.endofw
26740cmp r0,#&FF
26750adreq r2,pvokflag
26760streqb r0,[r2]
26770beq endtbl
26780and r0,r0,#%01111111 ;Clear bit 7
26790strb r0,[r2],#1
26800mov r0,#13
26810strb r0,[r2]
26820add r1,r1,#1
26830ldrb r0,[r1] ;Get the verb/object number from table
26840add r1,r1,#1 ;Skip the number
26850cmp r0,r3 ;Is it the one we want?
26860bne LLL1 ;No - try the next one
26870
26880.endtbl
26890adr r2,address
26900str r1,[r2]
26910ldmfd (sp)!,{r0-r5,pc}
26920
26930.atext EQUS STRING$(80,"*")
26940align
26950.address equd 0
26960.pvokflag equb 0
26970align
26980]
26990NEXT pass
27000ENDPROC
27010
27020
27030REM ------ Some general utility routines ------
27040
27050DEF PROCErrorMsgRead
27060in%=OPENIN("<Alps$Resources>.Errormsgs")
27070INPUT#in%,errors
27080DIM error$(errors)
27090FOR error=0 TO errors-1
27100 INPUT#in%,error$(error)
27110NEXT error
27120CLOSE#in%
27130ENDPROC
27140
27150DEF PROCKeyWordRead
27160REM Reads file of keywords/info bytes
27170REM Keywords are in alphabetical order
27180LOCAL CHN%,I%,J%
27190first_token=&60
27200maxmsg=65535:maxobn=255:maxvbn=255:maxconst=65535
27210chn%=OPENIN "<Alps$Resources>.keywrdlist"
27220INPUT#chn%,keywords
27230DIM keyword$(keywords),info%(keywords,5)
27240
27250REM Set up keyword tables
27260REM keyword$ | token | type/No. params | Max values param 1,2,3 |
27270REM type/No. params gives number of parameters and bit 7 is set if its
27280REM a function, bit 6 set for object keywords, bit 5 for verb keywords
27290
27300FOR I%=1 TO keywords
27310INPUT#chn%,keyword$(I%)
27320FOR J%=0 TO 5
27330INPUT#chn%,info%(I%,J%)
27340NEXT J%
27350NEXT I%
27360CLOSE#chn%
27370
27380FOR I%=1 TO keywords
27390params=info%(info%(I%,2),1) AND %00011111
27400bytes=0
27410IF params>0 THEN
27420FOR K%=3 TO 5
27430maxval=info%(info%(I%,2),K%)
27440IF maxval<256 AND maxval>0 THEN bytes+=1
27450IF maxval>255 AND maxval<65536 THEN bytes+=2
27460IF maxval>65535 THEN bytes+=3
27470NEXT K%
27480ENDIF
27490parambyte=info%(info%(I%,2),1) AND %10000000
27500pbytes?(I%-1)=bytes OR parambyte
27510NEXT
27520ENDPROC
27530
27540
27550REM ------ Printing procedures ------
27560
27570DEF PROCprint_prog_seg
27580LOCAL R%
27590LOCAL ERROR
27600ON ERROR LOCAL:OSCLI("FX3,0"):SYS "Hourglass_Off":ENDPROC
27610*FX3,10
27620FOR R%=0 TO last_row%
27630 PRINT FNrow(R%)
27640NEXT R%
27650*FX3,0
27660ENDPROC
27670
27680DEF PROCprint_program
27690LOCAL ERROR
27700ON ERROR LOCAL:OSCLI("FX3,0"):SYS "Hourglass_Off":ENDPROC
27710PROClist(1,"")
27720ENDPROC
27730
27740DEF PROCprint_text
27750LOCAL st%,end%,M%
27760LOCAL ERROR
27770ON ERROR LOCAL:OSCLI("FX3,0"):SYS "Hourglass_Off":ENDPROC
27780PROCclose(texthandle)
27790*FX3,10
27800st%=VAL $st_msg%
27810end%=VAL $end_msg%
27820IF end%>FNmaxmsg end%=FNmaxmsg
27830FOR M%=st% TO end%
27840 PROCshow_msg(M%)
27850 PROCprint_msg(M%)
27860NEXT M%
27870*FX3,0
27880ENDPROC
27890
27900DEF PROCprint_msg(M%)
27910LOCAL S%,R%
27920PRINT"Message: ";M%;" Switches: ";
27930IF switch_vals(0)=0 THEN
27940 PRINT"None";
27950ELSE
27960 FOR S%=1 TO switch_vals(0)
27970 PRINT"<";switch_vals(S%);">";
27980 NEXT
27990ENDIF
28000PRINT
28010FOR R%=0 TO last_row%
28020 PRINT FNrow(R%)
28030NEXT R%
28040PRINT STRING$(text_maxllen%,"-")
28050ENDPROC
28060
28070DEF PROCprint_objs
28080LOCAL O%,F%,I%,ptr%
28090*FX3,10
28100VDU condensed
28110PRINTpline$
28120PROCprint_flags(o_flags%)
28130PRINTpline$
28140PRINT"Obj Noun Flags 7 6 5 4 3 2 1 0 State Start Describe Short Examine Weight Size Cont. 'Store' Trans. Open"
28150PRINTpline$
28160FOR O%=1 TO last_object
28170PRINT;O%;
28180store=small_area%:col%=1:row%=0
28190PROCfill(small_area%,small_areasize%,13)
28200print=FALSE
28210PROCpvok(FNfindnoun(O%,void),1,FALSE):PRINTTAB(4)$small_area%;TAB(21);
28220ptr%=odata%+O%*o_len
28230FOR F%=7 TO 0 STEP-1
28240IF ?ptr% AND (2^F%) THEN PRINT"* "; ELSE PRINT". ";
28250NEXT
28260PRINTTAB(39);ptr%?1;TAB(43);ptr%?2+256*ptr%?3;TAB(50)ptr%?4+256*ptr%?5;TAB(58);ptr%?6+256*ptr%?7;TAB(65);ptr%?8+256*ptr%?9;TAB(73);ptr%?10;TAB(80);ptr%?11;
28270IF (ptr%?12 AND &80)<>0 THEN PRINTTAB(85)"<C>";TAB(92);ptr%?13;
28280IF (ptr%?12 AND &80)<>0 THEN
28290store_room=ptr%?13
28300rmflags=?(rdata%+store_room*r_len)
28310tr_flag=(rmflags AND %100000)>0
28320op_flag=(rmflags AND %10000)>0
28330IF tr_flag PRINTTAB(100);"Y"; ELSE PRINTTAB(100);"N";
28340IF op_flag PRINTTAB(106);"Y" ELSE PRINTTAB(106);"N"
28350ELSE
28360PRINT
28370ENDIF
28380NEXT
28390PRINTpline$
28400VDU 27,reset
28410*FX3,0
28420ENDPROC
28430
28440DEF PROCprint_rooms
28450LOCAL R%,F%,I%,ptr%
28460*FX3,10
28470VDU condensed
28480PRINTpline$
28490PROCprint_flags(r_flags%)
28500PRINTpline$:PRINTTAB(70);" * DESTINATIONS *"
28510PRINT"Room Flags 76543210 State Desc. Short Pict. N S E W NE NW SE SW Up Down In Out Back Left Righ Jump"
28520PRINTpline$
28530FOR R%=1 TO last_room
28540PRINT;R%;TAB(11);
28550ptr%=rdata%+R%*r_len
28560FOR F%=7 TO 0 STEP-1
28570IF ?ptr% AND (2^F%) THEN PRINT"*"; ELSE PRINT".";
28580NEXT
28590PRINTTAB(20);ptr%?1;TAB(26);ptr%?2+256*ptr%?3;TAB(32);ptr%?4+256*ptr%?5;TAB(38);ptr%?70+256*ptr%?71;
28600FOR I%=6 TO 36 STEP 2
28610PRINTTAB(5*(I% DIV 2-3)+44);ptr%?I%+256*ptr%?(I%+1);
28620NEXT I%
28630PRINT
28640NEXT R%
28650
28660PRINTpline$:PRINTTAB(30);" * EXIT ROUTINES *"
28670PRINT"Room N S E W NE NW SE SW Up Down In Out Back Left Righ Jump"
28680PRINTpline$
28690FOR R%=1 TO last_room
28700PRINT;R%;
28710ptr%=rdata%+R%*r_len
28720FOR I%=38 TO 53
28730PRINTTAB(5*(I%-38)+6);ptr%?I%;
28740NEXT I%
28750PRINT
28760NEXT R%
28770PRINTpline$
28780PRINTTAB(59)"* EXIT FLAGS *"
28790PRINTpline$
28800PRINT"Exit Flag: ";
28810FOR flag=7 TO 0 STEP-1
28820PRINTTAB(11+(7-flag)*15);"|"TAB(20+(7-flag)*15);flag;
28830NEXT
28840PRINTTAB(11+8*15);"|"
28850PRINT"Descript'n";
28860FOR flag=7 TO 0 STEP-1
28870PRINTTAB(10+(7-flag)*15);" | ";exit_flag$(flag);
28880NEXT
28890PRINTTAB(10+8*15);" |"
28900PRINTpline$
28910PRINTTAB(4);" North South East West No'east No'west So'east So'west Up Down In Out Back Left Right Jump "
28920FOR R%=1 TO last_room
28930IF R%=1 OR R% MOD 10=0 THEN PRINTTAB(4)STRING$(16,"|-------")
28940PRINT;R%;
28950ptr%=rdata%+R%*r_len
28960PRINTTAB(4);
28970FOR I%=54 TO 69
28980FOR F%=7 TO 0 STEP-1
28990IF ?(ptr%+I%) AND (2^F%) THEN PRINT"*"; ELSE PRINT".";
29000NEXT F%
29010NEXT I%
29020PRINT
29030NEXT R%
29040PRINTpline$
29050VDU 27,reset
29060*FX3,0
29070ENDPROC
29080
29090DEF PROCprint_flags(mem%)
29100PRINT"Flag: ";
29110FOR flag=7 TO 0 STEP-1
29120PRINTTAB(11+(7-flag)*15);"|"TAB(20+(7-flag)*15);flag;
29130NEXT
29140PRINTTAB(11+8*15);"|"
29150PRINT"Descript'n";
29160FOR flag=7 TO 0 STEP-1
29170PRINTTAB(10+(7-flag)*(maxd%-1+3));" | ";$mem%;
29180mem%+=maxd%
29190NEXT
29200PRINTTAB(10+8*(maxd%-1+3));" |"
29210ENDPROC
29220
29230DEF PROCprint_vocab
29240print=TRUE
29250PROCput(pline2$+CHR$13)
29260PROCput(STRING$(37," ")+"Nouns:"+CHR$13):PROClistnouns
29270PROCput(pline2$+CHR$13)
29280PROCput(STRING$(37," ")+"Verbs:"+CHR$13):PROClistverbs
29290PROCput(pline2$+CHR$13)
29300PROCput(STRING$(34," ")+"Adjectives:"+CHR$13):PROClistadjs
29310PROCput(pline2$+CHR$13)
29320PROCput(STRING$(33," ")+"Conjunctions:"+CHR$13):PROClistconjs
29330PROCput(pline2$+CHR$13)
29340PROCput(STRING$(33," ")+"Prepositions:"+CHR$13):PROClistpreps
29350PROCput(pline2$+CHR$13)
29360PROCput(STRING$(35," ")+"Specials:"+CHR$13):PROClistspecs
29370PROCput(pline2$+CHR$13)
29380PROCput(STRING$(37," ")+"Noise:"+CHR$13):PROClistnoise
29390PROCput(pline2$+CHR$13)
29400print=FALSE
29410ENDPROC
29420
29430DEF PROCprint_pix
29440LOCAL mptr
29450print=TRUE:SYS "Hourglass_On"
29460
29470IF pxn>1 THEN
29480mptr=pixs+3
29490FOR I%=1 TO pxn-1
29500 PROCput(STR$(I%)+"= ")
29510 PROCput($mptr)
29520 mptr+=LEN$mptr+1
29530 PROCput(",<"+pos$(?mptr)+">"+CHR$13)
29540 mptr+=5
29550NEXT
29560ENDIF
29570
29580print=FALSE:SYS "Hourglass_Off"
29590ENDPROC
29600
29610DEF PROCscan
29620oldptr=prgptr:numflag=0
29630ptr=1:len=LEN line$:IF len=0 THEN GOTO 30040
29640REPEAT
29650temp$=""
29660WHILE MID$(line$,ptr,1)<"A" AND ptr<len
29670ptr+=1
29680ENDWHILE
29690vptr=ptr
29700WHILE MID$(line$,ptr,1)>"@" AND ptr<len
29710temp$=temp$+MID$(line$,ptr,1):ptr+=1
29720ENDWHILE
29730IF temp$<>"" THEN
29740PROClookup(temp$,token,info_ptr)
29750IF token=0 PROCerror(0,": "+MID$(line$,vptr,30)):prgptr=oldptr:GOTO 30020
29760IF token=def_token THEN PROCdodefn:GOTO30020
29770?prgptr=token:tokptr=prgptr:prgptr+=1
29780p_info=info%(info%(token-first_token+1,2),1):params=p_info AND %1111
29790ptr+=1
29800IF params <>0 THEN
29810FOR I%=1 TO params
29820 WHILE INSTR(", ",MID$(line$,ptr,1))<>0 AND ptr<len
29830 ptr+=1
29840 ENDWHILE
29850 IF token>=var_token AND I%=1 THEN PROCget_var(ptr,ptr,paramvalue,vptr)
29860 IF token>=var_token AND I%>1 THEN PROCget_num_or_var(ptr,ptr,paramvalue,varflag):IF varflag THEN ?tokptr=?tokptr+&10
29870 IF token<var_token THEN
29880 IF MID$(line$,ptr,1)=CHR$34 PROCdecode_string(line$,ptr,ptr,paramvalue,FNfntype(p_info)) ELSE PROCdecode_parameter(line$,ptr,ptr,paramvalue,vptr)
29890 ENDIF
29900 IF errflag THEN 30020
29910 IF paramvalue>info%(info_ptr,I%+2) PROCerror(2,STR$(info%(info_ptr,I%+2))+" ("+temp$+")"):GOTO30020
29920 IF info%(info_ptr,I%+2)<256 THEN bytes=1
29930 IF info%(info_ptr,I%+2)>255 AND info%(info_ptr,I%+2)<65536 THEN bytes=2
29940 IF info%(info_ptr,I%+2)>65535 THEN bytes=3
29950 FOR J%=0 TO bytes-1
29960 J%?prgptr=paramvalue DIV 256^J%
29970 NEXT J%
29980 prgptr+=bytes
29990NEXT I%
30000ENDIF
30010ENDIF
30020UNTIL ptr>=(len-1) OR token=0 OR errflag
30030IF token=0 OR errflag THEN PROCrestore_end:GOTO30050
30040?prgptr=13:prgptr+=1
30050ENDPROC
30060
30070DEF PROCrestore_end
30080prgptr=oldptr:?prgptr=0
30090ENDPROC
30100
30110DEF PROCerror(err_num,err$)
30120errflag=TRUE
30130null =FNerrorbox(error$(err_num)+" "+err$,err_num,1,-99)
30140ENDPROC
30150
30160DEF PROCfind_token(A$(),search$,RETURN token,RETURN mid)
30170LOCAL first,last,stop_search,found,len
30180len=LEN search$
30190first=1
30200last=DIM(A$(),1)
30210stop_search=FALSE:found=FALSE
30220REPEAT
30230PROCchop
30240UNTIL stop_search
30250IF found THEN token=info%(mid,0) ELSE token=0
30260ENDPROC
30270
30280DEF PROCchop
30290mid=(first+last) DIV 2
30300A$=A$(mid)
30310IF A$=search$ THEN stop_search=TRUE:found=TRUE:ENDPROC
30320IF A$>search$ THEN
30330last=mid-1
30340ELSE
30350first=mid+1
30360ENDIF
30370IF first>last THEN stop_search=TRUE
30380ENDPROC
30390
30400DEF PROClookup(search$,RETURN token,RETURN index)
30410LOCAL I%,found
30420token=0
30430IF search$="" THEN ENDPROC
30440PROCfind_token(keyword$(),search$,token,index)
30450ENDPROC
30460
30470I%=1
30480REPEAT
30490IF INSTR(LEFT$(keyword$(I%),LEN(search$)),search$)<>0 THEN token=info%(I%,0):found=TRUE:index=I%
30500I%+=1
30510UNTIL found OR I%=keywords+1
30520ENDPROC
30530
30540DEF PROCdecode_parameter(line$,place,RETURN place,RETURN value,vptr)
30550LOCAL temp1$
30560WHILE INSTR(" (,",MID$(line$,place,1))<>0 place+=1
30570ENDWHILE
30580WHILE INSTR("0123456789",MID$(line$,place,1))<>0 AND place<=LEN(line$) temp1$=temp1$+MID$(line$,place,1):place+=1
30590ENDWHILE
30600IF INSTR(") ,"+CHR$13,MID$(line$,place,1))=0 THEN
30610PROCerror(1,": "+MID$(line$,vptr,30)):errflag=TRUE
30620ELSE
30630value=VAL(temp1$)
30640ENDIF
30650ENDPROC
30660
30670DEF PROCdecode_string(line$,place,RETURN place,RETURN value,type)
30680LOCAL temp1$,dummy$,vptr
30690vptr=place-1
30700place+=1
30710temp1$=""
30720WHILE (INSTR(CHR$34,MID$(line$,place,1))=0 AND place<LENline$)
30730temp1$+=MID$(line$,place,1)
30740place+=1
30750ENDWHILE
30760IF INSTR(CHR$34,MID$(line$,place,1))<>0 THEN place+=1:REM added 31.5.89
30770IF temp1$="" THEN
30780value=0
30790ELSE
30800CASE type OF
30810WHEN 1
30820PROCgetobn(temp1$,value,dummy$):REM Find the noun number
30830IF value=0 THEN
30840temp1$=": "+temp1$
30850ERROR 1,"Badly formed/Non-existent noun: "+MID$(line$,vptr-LENtemp$,20)
30860ELSE
30870PROCwhich_obj(value,val$,refs):REM Find which object/s it references
30880IF refs=1 THEN value=VAL(val$) ELSE PROCerror(27,temp1$+error$(37))
30890ENDIF
30900WHEN 2:PROCgetvbn(temp1$,value,dummy$)
30910WHEN 3:PROCgetprn(temp1$,value,dummy$)
30920ENDCASE
30930ENDIF
30940ENDPROC
30950
30960DEF PROCget_var(place,RETURN place,RETURN value,vptr)
30970WHILE INSTR(" (,",MID$(line$,place,1))<>0 place+=1
30980ENDWHILE
30990chr$=MID$(line$,place,1)
31000IF chr$<"A" OR chr$>"|" THEN PROCerror(3,": "+MID$(line$,vptr,30)):ENDPROC
31010value=ASC chr$ - ASC"A"
31020place+=1:IF MID$(line$,place,1)<>"%" THEN PROCerror(3,": "+MID$(line$,vptr,30)) ELSE place+=1
31030ENDPROC
31040
31050DEF PROCget_num_or_var(place,RETURN place,RETURN value,RETURN flag)
31060WHILE INSTR(" (,",MID$(line$,place,1))<>0 place+=1
31070ENDWHILE
31080chr$=MID$(line$,place,1)
31090IF INSTR("0123456789",chr$) THEN flag=FALSE:PROCdecode_parameter(line$,place,place,value,vptr):ENDPROC
31100PROCget_var(place,place,value,vptr):flag=TRUE
31110ENDPROC
31120
31130DEF PROCrun
31140LOCAL ERROR
31150SYS "OS_Byte",229,0,0 TO ,oldstate%
31160err_col=11:PROCcol(130):PROCcol(7):SYS "Wimp_SetColour",128+2
31170ON ERROR LOCAL:PROCcol(err_col):IF ERR<>17 PRINT'"Interpreter reports a run-time error: "REPORT$:GOTO 31530 ELSE PRINT'REPORT$:GOTO 31530
31180REM PROCclose(texthandle):PROCclose(objhandle):PROCclose(roomhandle)
31190PROCupdate_data
31200IF NOT errflag THEN
31210!work%=rdata%
31220work%!4=verbs+3
31230work%!8=nouns+3
31240work%!12=program%+4
31250work%!16=text%+7
31260work%!20=dict%+3
31270work%!24=odata%
31280work%!28=adjects+3
31290work%!32=preps+3
31300work%!36=conjs+3
31310work%!40=specs+3
31320work%!44=noise+3
31330work%!48=pixs+3
31340REM work%!52 is reserved
31350work%!56=initsave
31360work%!60=last_room
31370work%!64=last_object+1
31380VDU26,4,12
31390PROCcentre("PLEASE WAIT",0):OFF
31400IF datavalid THEN PROCcopy_from_editor ELSE PROCcopy_to_editor
31410!picbuf=pbsize
31420OSCLI("LOAD <Users$Resources>.Buttons "+STR$~(picbuf+4))
31430REM Read the scale factors and pixel translation table
31440SYS "Wimp_ReadPixTrans",&200,picbuf,picbuf+16,0,0,0,scale,pixtr
31450REM Now PutSpriteScaled
31460SYS "OS_SpriteOp",&234,picbuf,picbuf+16,0,0,8,scale,pixtr
31470VDU 28,0,textrows%-5,textcols%,0,24,0;148;scrw;scrh;
31480PROCcentre(STRING$(11," "),0):PRINT:ON
31490A%=verb_type:B%=nref:C%=aref:D%=ramsave
31500E%=pbytes:F%=work%:G%=picbuf:H%=pbsize
31510cliplen=0
31520CALL run
31530VDU 26:PROCcentre("PLEASE WAIT",26):OFF:PROCswap_data:datavalid=TRUE:PROCcentre(STRING$(11," "),26):PROCreturn(18,0):ON
31540PROCchangeicon(ALPSmain,swapicon,"swap",swapicon)
31550REM The copy/swap routines as used above ensure the data in the editor is
31560REM ALWAYS valid after running a game, even if it wasn't before running it
31570VDU 5
31580SYS ForceR,-1,0,0,scrw+1,scrh+1
31590ENDIF
31600RESTORE ERROR
31610SYS "OS_Byte",229,oldstate%,0
31620SYS "OS_Byte",124
31630ENDPROC
31640
31650DEF PROCcol(color)
31660SYS "Wimp_TextColour",color
31670ENDPROC
31680
31690DEF PROCfind_section(code%,value%,RETURN found)
31700REM Searches program for a match with code%,value%
31710REM eg DEFPROC(3) --> &86,&03
31720REM Sets `listptr` to the address of the `code%` byte, if found
31730ptr=listptr
31740LOCAL byte1,byte2
31750found=FALSE
31760E%=pbytes:F%=work%:CALL setup:G%=ptr
31770REPEAT
31780A%=code%:ptr=USR findcode
31790IF ?ptr=value% THEN found=TRUE ELSE G%=ptr+1
31800UNTIL found OR ptr=0
31810IF found THEN listptr=ptr-1 ELSE listptr=program%+4+FNprglen+1
31820ENDPROC
31830
31840DEF PROClist(prg_part%,val$)
31850LOCAL col%,row%
31860PROCfill(text_block%,text_blocksize%,dummy_spc)
31870text_rowlen%()=+0
31880SYS "Hourglass_On"
31890listptr=program%+4:line=1:last=65535:first=1
31900col%=1:row%=0
31910store=text_block%
31920existing_verb=FALSE
31930print=FALSE
31940errflag=FALSE
31950
31960CASE prg_part% OF
31970WHEN 1:found=TRUE:end1%=0:end2%=0:print=TRUE:REM Print whole program
31980WHEN 2:found=TRUE:end1%=stop_token:end2%=def_token
31990WHEN 3,4,5:end1%=end_token:end2%=0
32000ENDCASE
32010
32020CASE prg_part% OF
32030WHEN 3
32040PROCfind_section(proc_token,VAL val$,found)
32050token=proc_token
32060WHEN 4
32070existing_verb=TRUE
32080PROCgetvbn(val$,verb,dummy$)
32090PROCfind_section(def_token,verb,found)
32100token=def_token
32110WHEN 5
32120PROCfind_section(exit_token,VAL val$,found)
32130token=exit_token
32140ENDCASE
32150
32160IF NOT found THEN
32170 PROCerror(10,""+FNtoken_to_keyword(token)+"("+val$+")")
32180 listptr-=1:REM Point to end of program
32190 IF token=def_token THEN existing_verb=FALSE
32200ENDIF
32210
32220pstart=listptr:REM Start address of program section
32230byte1=?listptr:found_end=FALSE
32240WHILE byte1<>0 AND NOT found_end
32250eol%=FALSE
32260 WHILE byte1=13
32270 listptr+=1:PROCput(CHR$13):eol%=TRUE
32280 row%+=1
32290 byte1=?listptr
32300 ENDWHILE
32310 IF byte1=0 THEN PROCput(CHR$(0)):GOTO32700
32320 IF (byte1=end1% AND eol%) OR byte1=end2% THEN found_end=TRUE
32330 IF byte1>&BF THEN byte2=byte1-&10 ELSE byte2=byte1
32340 token=byte2:listptr+=1
32350 word$=FNtoken_to_keyword(token)
32360 PROCput(word$)
32370 IF byte2=def_token THEN PROCprtdef:listptr+=1:GOTO32700
32380 p_info=info%(info%(token-first_token+1,2),1):params=p_info AND %1111
32390 IF params=0 AND ?listptr<>13 PROCput(" ")
32400 IF params<>0 THEN
32410 PROCput("(")
32420 FOR I%=1 TO params
32430 maxvalue=info%(info%(token-first_token+1,2),I%+2)
32440 IF maxvalue<256 THEN bytes=1
32450 IF maxvalue>255 AND maxvalue<65536 THEN bytes=2
32460 IF maxvalue>65535 THEN bytes=3
32470 value=0
32480 FOR J%=0 TO bytes-1
32490 value=value+(J%?listptr)*256^J%
32500 NEXT J%
32510 doneit=FALSE
32520 IF I%=1 AND (listoption AND %10)<>0 AND FNfntype(p_info)=1 THEN
32530 PROCprntobj
32540 ELSE
32550 IF I%=1 AND (listoption AND %10)<>0 AND FNfntype(p_info)=2 THEN
32560 PROCprntvrb
32570 ENDIF
32580 ENDIF
32590 IF I%=1 AND (word$="PREP" OR word$="NOTPREP") AND (listoption AND %10)<>0 THEN PROCprintprep
32600 IF I%=2 AND (word$="PUTIN" OR word$="TAKEOUT") AND (listoption AND %10)<>0 THEN PROCprntobj
32610 IF NOT doneit THEN
32620 IF byte1<var_token OR (I%>1 AND byte1<&C0) PROCput(STR$(value)) ELSE PROCput(CHR$(value+ASC"A")+"%")
32630 ENDIF
32640 listptr+=bytes
32650 IF I%<>params THEN PROCput(",")
32660 NEXT I%
32670 PROCput(")")
32680 IF ?listptr<>13 PROCput(" ")
32690 ENDIF
32700 byte1=?listptr
32710ENDWHILE
32720IF found_end PROCput(CHR$13+CHR$0)
32730text_end%=store-1:text_ptr%=text_block%
32740IF text_end%<text_block% text_end%=text_block%
32750prgend=listptr:REM End address of program section
32760last_row%=FNfind_lastrow
32770
32780FOR R%=0 TO last_row%
32790text_rowlen%(R%)=LEN FNrow(R%)
32800NEXT
32810
32820SYS "Hourglass_Off"
32830ENDPROC
32840
32850DEF PROCput(text$)
32860LOCAL I%
32870IF NOT print THEN
32880IF text$<>"" THEN
32890$store=text$
32900store+=LEN text$
32910ENDIF
32920ELSE
32930*FX3,10
32940PRINTtext$;
32950*FX3,0
32960ENDIF
32970ENDPROC
32980
32990DEF PROClist_vocab(voc%)
33000SYS "Hourglass_On"
33010print=FALSE:store=text_block%
33020PROCfill(text_block%,text_blocksize%,dummy_spc)
33030col%=1:row%=0
33040
33050CASE voc% OF
33060WHEN 1: PROClistnouns
33070WHEN 2: PROClistverbs
33080WHEN 3: PROClistadjs
33090WHEN 4: PROClistpreps
33100WHEN 5: PROClistconjs
33110WHEN 6: PROClistspecs
33120WHEN 7: PROClistnoise
33130ENDCASE
33140
33150text_end%=store-1:text_ptr%=text_block%
33160IF text_end%<text_block% text_end%=text_block%
33170last_row%=FNfind_lastrow
33180FOR R%=0 TO last_row%
33190 text_rowlen%(R%)=LEN FNrow(R%)
33200NEXT
33210SYS "Hourglass_Off"
33220ENDPROC
33230
33240DEF PROClist_pix
33250LOCAL mptr
33260SYS "Hourglass_On"
33270print=FALSE:store=text_block%
33280PROCfill(text_block%,text_blocksize%,dummy_spc)
33290col%=1:row%=0
33300
33310IF pxn>1 THEN
33320mptr=pixs+3
33330FOR I%=1 TO pxn-1
33340 PROCput(STR$(I%)+"= ")
33350 PROCput($mptr)
33360 mptr+=LEN$mptr+1
33370 PROCput(",<"+pos$(?mptr)+">"+CHR$13)
33380 mptr+=5
33390NEXT
33400PROCput(CHR$0)
33410ENDIF
33420
33430text_end%=store-1:text_ptr%=text_block%
33440IF text_end%<text_block% text_end%=text_block%
33450last_row%=FNfind_lastrow
33460
33470FOR R%=0 TO last_row%
33480text_rowlen%(R%)=LEN FNrow(R%)
33490NEXT
33500
33510SYS "Hourglass_Off"
33520ENDPROC
33530
33540DEF FNtoken_to_keyword(token)
33550=keyword$(info%(token-first_token+1,2))
33560
33570DEF PROCnew
33580obn=1:vbn=1:adn=1:prn=1:cjn=1:spn=1:nsn=1:pxn=1
33590nxtobj=nouns:?nxtobj=obn:nxtobj?1=3:nxtobj?2=0:nxtobj+=3:?nxtobj=&FF
33600nxtvrb=verbs:?nxtvrb=vbn:nxtvrb?1=3:nxtvrb?2=0:nxtvrb+=3:?nxtvrb=&FF
33610nxtadj=adjects:?nxtadj=adn:nxtadj?1=3:nxtadj?2=0:nxtadj+=3:?nxtadj=&FF
33620nxtprp=preps:?nxtprp=prn:nxtprp?1=3:nxtprp?2=0:nxtprp+=3:?nxtprp=&FF
33630nxtcjn=conjs:?nxtcjn=cjn:nxtcjn?1=3:nxtcjn?2=0:nxtcjn+=3:?nxtcjn=&FF
33640nxtspn=specs:?nxtspn=spn:nxtspn?1=3:nxtspn?2=0:nxtspn+=3:?nxtspn=&FF
33650nxtnsn=noise:?nxtnsn=nsn:nxtnsn?1=3:nxtnsn?2=0:nxtnsn+=3:?nxtnsn=&FF
33660nxtpxn=pixs:?nxtpxn=pxn:nxtpxn?1=3:nxtpxn?2=0:nxtpxn+=3:?nxtpxn=&FF
33670!aref=4:aref?4=0:!nref=4:nref?4=0
33680prev_file$=""
33690ENDPROC
33700
33710DEF PROClvar
33720vars=work%+&88
33730FOR I%=1 TO 2*num_vars STEP 8
33740PRINTTAB(8)CHR$(I% DIV 2 +ASC"A");"% = ";vars?(I%-1)+vars?I%*256;
33750PRINTTAB(24)CHR$(I% DIV 2 +ASC"B");"% = ";vars?(I%+1)+vars?(I%+2)*256;
33760PRINTTAB(40)CHR$(I% DIV 2 +ASC"C");"% = ";vars?(I%+3)+vars?(I%+4)*256;
33770PRINTTAB(56)CHR$(I% DIV 2 +ASC"D");"% = ";vars?(I%+5)+vars?(I%+6)*256
33780NEXT
33790ENDPROC
33800
33810DEF PROClisto
33820LOCAL bitmask$,op$
33830CASE item1% OF
33840WHEN 0: bitmask$="%11111101":op$=" AND "
33850WHEN 1: bitmask$="%00000010":op$=" OR "
33860WHEN 2: bitmask$="%11111011":op$=" AND "
33870WHEN 3: bitmask$="%00000100":op$=" OR "
33880ENDCASE
33890listoption=EVAL(STR$listoption+op$+bitmask$)
33900ENDPROC
33910
33920DEF PROCstatus
33930PRINTTAB(1);"User code address = &";~usercode%;" (";usercode%;" decimal)"
33940PRINTTAB(1);"Program bytes: ";TAB(21);FNprglen;TAB(28);code_size%-FNprglen;" bytes free."
33950PRINTTAB(1)"Messages defined: "TAB(21);FNmaxmsg;TAB(28);(FNtext_end-text%);" characters used. ";maxtext%-(FNtext_end-text%);" characters free."
33960PRINTTAB(1)"Verbs defined: "TAB(21);vbn-1;TAB(28);verb_size-(nxtvrb-verbs);" characters free."
33970PRINTTAB(1)"Nouns defined: "TAB(21);obn-1;TAB(28);noun_size-(nxtobj-nouns);" characters free."
33980PRINTTAB(1)"Adjectives defined: "TAB(21);adn-1;TAB(28);adjc_size-(nxtadj-adjects);" characters free."
33990PRINTTAB(1)"Objects defined: "TAB(21);last_object;TAB(28);maxobs-last_object" object(s) remaining."
34000PRINTTAB(1)"Rooms defined: "TAB(21);last_room;TAB(28);maxrms-last_room" room(s) remaining."
34010PRINTTAB(1)"Screen mode: ";mode%;", File: "CHR$34+loaded$+CHR$34", Data: ";:PROCcol(11):IF data_saved PRINT"Saved" ELSE PRINT"NOT Saved"
34020ENDPROC
34030
34040
34050REM ------ Various Disk Operations ------
34060
34070DEF PROCcreate_dirs(app$,root$)
34080LOCAL t$,l$,r$,I%,rd$,out%
34090SYS "Hourglass_On"
34100IF RIGHT$(root$,1)<>"." THEN root$+="."
34110t$=root$:l$="":I%=0
34120 WHILE INSTR(t$,".")<>0
34130 r$=LEFT$(t$,INSTR(t$,".")-1)
34140 IF I%>0 l$=l$+"."+r$ ELSE l$=r$
34150 I%+=1
34160 OSCLI("CDIR "+l$)
34170 t$=MID$(t$,INSTR(t$,".")+1)
34180 ENDWHILE
34190 IF LEFT$(app$,1)<>"!" THEN app$="!"+app$
34200 app$=LEFT$(app$,10)
34210 ra$=root$+app$:REM path to users 'Alps' file
34220 OSCLI("CDIR "+ra$)
34230 OSCLI("CDIR "+ra$+".ALPS")
34240 OSCLI("CDIR "+ra$+".PICTURES")
34250 OSCLI("CDIR "+ra$+".Resources")
34260 rd$=ra$+".Resources.":REM Resources dir path
34270 OSCLI "SAVE "+rd$+"pbytes "+STR$~pbytes+"+"+STR$~pbyte_size
34280 OSCLI("SAVE "+rd$+"ASIobjcode "+STR$~asicode%+"+"+STR$~codesize)
34290 OSCLI "SAVE "+rd$+"buttons "+STR$~picbuf+"+"+STR$~butlen
34300 OSCLI "SETTYPE "+rd$+"buttons Sprite"
34310 OSCLI "SETTYPE "+rd$+"pbytes Data"
34320 OSCLI "SETTYPE "+rd$+"ASIobjcode Absolute"
34330 OSCLI "SAVE "+ra$+".!RunImage "+STR$~(picbuf+butlen)+"+"+STR$~ldlen
34340 OSCLI "SETTYPE "+ra$+".!RunImage BASIC"
34350 SYS "OS_SpriteOp",256+26,sprld,"!alpsgames",app$:REM Rename Sprite
34360 SYS "OS_SpriteOp",256+12,sprld,ra$+".!Sprites":REM Save it
34370 out%=OPENOUT(ra$+".!Run")
34380 out2%=OPENOUT(ra$+".!Boot")
34390 BPUT#out%,"| !Run file for ALPS games"
34400 BPUT#out2%,"| !Boot file for ALPS games"
34410 BPUT#out%,"|"
34420 BPUT#out%,"SET Alps$NoMouseInput 0"
34430 BPUT#out%,"|"
34440 BPUT#out%,"SET Alps$ShowAddress 0"
34450 BPUT#out%,"|"
34460 BPUT#out2%,"|"
34470 BPUT#out%,"IconSprites <Obey$Dir>.!Sprites"
34480 BPUT#out2%,"IconSprites <Obey$Dir>.!Sprites"
34490 BPUT#out%,"SET AlpsGame$Dir <Obey$Dir>"
34500 BPUT#out%,"SET AlpsGame$Resources <AlpsGame$Dir>.Resources."
34510 BPUT#out%,"SET AlpsGame$Data <AlpsGame$Dir>.Alps"
34520 BPUT#out%,"SET Alps$Pictures <AlpsGame$Dir>.Pictures."
34530 BPUT#out2%,"SET AlpsGame$Dir <Obey$Dir>"
34540 BPUT#out2%,"SET AlpsGame$Resources <AlpsGame$Dir>.Resources."
34550 BPUT#out2%,"SET AlpsGame$Data <AlpsGame$Dir>.Alps"
34560 BPUT#out2%,"SET Alps$Pictures <AlpsGame$Dir>.Pictures."
34570 BPUT#out%,"Run <AlpsGame$Dir>.!RunImage"
34580 CLOSE#out%:CLOSE#out2%
34590 OSCLI "*SETTYPE "+ra$+".!Run Obey"
34600 OSCLI "*SETTYPE "+ra$+".!Boot Obey"
34610SYS "Hourglass_Off"
34620ENDPROC
34630
34640DEF PROCload_bits(app$)
34650REM Loads 'buttons' sprite and 'Loader' program into picture buffer
34660REM They will then be saved to the user's data disk by PROCcreate_dirs
34670IF LEFT$(app$,1)<>"!" THEN app$="!"+app$
34680bit$="<Alps$Resources>.buttons"
34690SYS "OS_File",5,bit$ TO ftype,,,,butlen
34700OSCLI "LOAD "+bit$+" "+STR$~picbuf
34710SYS "OS_File",5,"<Alps$Resources>.!Runimage" TO ftype,,,,ldlen
34720OSCLI "LOAD <Alps$Resources>.!Runimage "+STR$~(picbuf+butlen)
34730SYS "OS_File",5,"<Alps$Resources>.!Sprites" TO ftype,,,,sprlen
34740DIM sprld sprlen+4:!sprld=sprlen+4
34750sprld!4=0:sprld!8=16:sprld!12=16
34760SYS "OS_SpriteOp",266,sprld,"<Alps$Resources>.!Sprites"
34770cliplen=0
34780ENDPROC
34790
34800DEF PROCconvert(import$)
34810LOCAL in%,I%,V%,ptr,T%
34820SYS "Hourglass_On"
34830!program%=0
34840program%!4=0
34850PROCfill(nref+4,nref_size-4,0)
34860in%=OPENIN import$
34870
34880FOR I%=0 TO &57F
34890 V%=BGET#in%
34900 verbs?I%=V%
34910NEXT I%
34920vbn=?verbs
34930nxtvrb=verbs+(verbs?1+256*(verbs?2))
34940
34950FOR I%=0 TO &57F
34960 V%=BGET#in%
34970 nouns?I%=V%
34980NEXT I%
34990obn=?nouns
35000nxtobj=nouns+(nouns?1+256*(nouns?2))
35010
35020V%=BGET#in%
35030V%=BGET#in%
35040ptr=program%+4
35050
35060REPEAT
35070 T%=BGET#in%
35080 ?ptr=T%:ptr+=1
35090 IF T%>=&C0 THEN T%-=&10
35100 IF T%>=&70 THEN
35110 pb=oldpars?(T%-&70)
35120 IF pb>0 THEN
35130 FOR I%=1 TO pb
35140 V%=BGET#in%
35150 ?ptr=V%:ptr+=1
35160 CASE T% OF
35170 WHEN &A4,&A1,&92,&90,&96,&97,&A6,&9A,&AA,&87,&88,&7B
35180 IF I%=1 THEN ?ptr=0:ptr+=1
35190 WHEN &7A,&A5,&B2,&B3,&B4,&B5,&B6,&B7,&B8
35200 IF I%=2 THEN ?ptr=0:ptr+=1
35210 ENDCASE
35220 NEXT I%
35230 ENDIF
35240ENDIF
35250UNTIL EOF#in%
35260CLOSE#in%
35270PROCincprglen(ptr-5-program%)
35280SYS "Hourglass_Off"
35290ENDPROC
35300
35310DEF PROCimport_text(import$)
35320IF import$="" THEN
35330PROCerror(16,"")
35340ELSE
35350OSCLI "LOAD "+import$+" "+STR$~(text%+2)
35360mptr=1
35370?text%=text%?2:text%?1=text%?3
35380text%!2=(text%?4+256*text%?5)+2
35390text%!6=text%?6
35400ENDIF
35410ENDPROC
35420
35430DEF PROCimport_obj(import$)
35440LOCAL in%,O%,M%,J%,flags,state,room,mlo,mhi
35450M%=odata%
35460in%=OPENIN(import$)
35470IF in%=0 PROCerror(10,""):ENDPROC
35480O%=BGET#in%
35490PTR#in%=0
35500FOR I%=0 TO O%
35510flags=BGET#in%:state=BGET#in%:room=BGET#in%
35520mlo=BGET#in%:mhi=BGET#in%
35530M%?0=flags:M%?1=state
35540M%?2=room:M%?3=0
35550M%?4=mlo:M%?5=mhi
35560FOR J%=6 TO o_len-1
35570M%?J%=0
35580NEXT J%
35590M%+=o_len
35600NEXT I%
35610last_object=O%
35620CLOSE#in%
35630ENDPROC
35640
35650DEF PROCimport_rooms(import$)
35660LOCAL in%,R%,M%,J%
35670M%=rdata%
35680in%=OPENIN(import$)
35690IF in%=0 PROCerror(10,""):ENDPROC
35700R%=BGET#in%
35710PTR#in%=0
35720FOR I%=0 TO R%
35730FOR J%=0 TO 3
35740M%?J%=BGET#in%
35750NEXT J%
35760M%?4=0:M%?5=0
35770FOR J%=6 TO 13 STEP2
35780M%?J%=BGET#in%:M%?(J%+1)=0
35790NEXT J%
35800FOR J%=14 TO 37
35810M%?J%=0
35820NEXT J%
35830M%?22=BGET#in%
35840M%?24=BGET#in%
35850FOR J%=38 TO 73
35860IF (J%<42 OR J%=46 OR J%=47) THEN M%?J%=BGET#in% ELSE M%?J%=0
35870NEXT J%
35880M%+=r_len
35890NEXT I%
35900last_room=R%
35910ENDPROC
35920
35930DEF PROCupdate_data
35940 PROCremove_markers
35950 CASE text_owner$ OF
35960 WHEN "texted" : PROCstore_msg
35970 WHEN "program" : IF NOT text_ok THEN PROCstore_prog
35980 WHEN "vocab" : IF NOT text_ok THEN PROCstore_vocab
35990 WHEN "pix" : PROCstore_pix
36000 ENDCASE
36010 i%=THEkeyicon:IF icon%(i%)<>-1 PROCstore_obj(optr)
36020 i%=THEdooricon:IF icon%(i%)<>-1 PROCstore_room(rptr)
36030 ENDPROC
36040
36050DEF PROCsave_all(f$)
36060REM f$=full path name
36070IF INSTR(f$,".")=0 THEN ERROR 1,"To save, drag the file icon to a directory viewer in which there is an ALPS directory.":ENDPROC
36080SYS "Hourglass_On"
36090
36100REM Changes to prevent 'Input focus' bug - 12.04.90
36110REM PROCclose(texthandle):PROCclose(objhandle):PROCclose(roomhandle)
36120PROCupdate_data
36130REM ------------------------
36140IF NOT errflag THEN
36150p$=f$:f$=FNleafname(p$)
36160p$=LEFT$(p$,LEN(p$)-LEN(f$))
36170d$=p$+"Alps."
36180OSCLI("SET Alps$Data "+d$)
36190PROCsave_objs("<Alps$Data>Objects")
36200PROCsave_rooms("<Alps$Data>Rooms")
36210PROCsave_flags("<Alps$Data>Flags")
36220PROCsave_pix("<Alps$Data>Pictures")
36230PROCsave_vocab(f$)
36240PROCsave_program("<Alps$Data>Program")
36250PROCsave_text("<Alps$Data>Text")
36260PROCsave_dict("<Alps$Data>Dict")
36270PROCsave_pal("<Alps$Data>!Palette")
36280PROCsave_chars("<Alps$Data>charset")
36290OSCLI("CREATE "+p$+f$+" 100")
36300OSCLI("SETTYPE "+p$+f$+" "+type$)
36310OSCLI("CREATE <Alps$Data>GameData 100")
36320out%=OPENUP("<Alps$Data>GameData")
36330BPUT#out%,mode%
36340CLOSE#out%
36350data_saved=TRUE:loaded$=f$:$filename%=f$
36360ENDIF
36370SYS CreateM,,-1:REM Close the 'Save as' menu/dbox
36380SYS "Hourglass_Off"
36390ENDPROC
36400
36410DEF PROCsave_vocab(fi$)
36420IF fi$="" THEN
36430PROCerror(16,"")
36440ELSE
36450PROCsave_nouns("<Alps$Data>Nouns")
36460PROCsave_verbs("<Alps$Data>Verbs")
36470PROCsave_adjects("<Alps$Data>Adjectives")
36480PROCsave_preps("<Alps$Data>Prepos")
36490PROCsave_conj("<Alps$Data>Conjunc")
36500PROCsave_spec("<Alps$Data>Specials")
36510PROCsave_noise("<Alps$Data>Noise")
36520PROCsave_nrefs("<Alps$Data>Nref")
36530PROCsave_arefs("<Alps$Data>Aref")
36540PROCsave_vtypes("<Alps$Data>VerbType")
36550ENDIF
36560ENDPROC
36570
36580DEF PROCsave_nouns(fi$)
36590IF fi$="" THEN
36600PROCerror(16,"")
36610ELSE
36620OSCLI "SAVE "+fi$+" "+STR$~nouns+" "+STR$~(nxtobj+1)
36630OSCLI "SETTYPE "+fi$+" Data"
36640ENDIF
36650ENDPROC
36660
36670DEF PROCsave_verbs(fi$)
36680IF fi$="" THEN
36690PROCerror(16,"")
36700ELSE
36710OSCLI "SAVE "+fi$+" "+STR$~verbs+" "+STR$~(nxtvrb+1)
36720OSCLI "SETTYPE "+fi$+" Data"
36730ENDIF
36740ENDPROC
36750
36760DEF PROCsave_adjects(fi$)
36770IF fi$="" THEN
36780PROCerror(16,"")
36790ELSE
36800OSCLI "SAVE "+fi$+" "+STR$~adjects+" "+STR$~(nxtadj+1)
36810OSCLI "SETTYPE "+fi$+" Data"
36820ENDIF
36830ENDPROC
36840
36850DEF PROCsave_preps(fi$)
36860IF fi$="" THEN
36870PROCerror(16,"")
36880ELSE
36890OSCLI "SAVE "+fi$+" "+STR$~preps+" "+STR$~(nxtprp+1)
36900OSCLI "SETTYPE "+fi$+" Data"
36910ENDIF
36920ENDPROC
36930
36940DEF PROCsave_conj(fi$)
36950IF fi$="" THEN
36960PROCerror(16,"")
36970ELSE
36980OSCLI "SAVE "+fi$+" "+STR$~conjs+" "+STR$~(nxtcjn+1)
36990OSCLI "SETTYPE "+fi$+" Data"
37000ENDIF
37010ENDPROC
37020
37030DEF PROCsave_spec(fi$)
37040IF fi$="" THEN
37050PROCerror(16,"")
37060ELSE
37070OSCLI "SAVE "+fi$+" "+STR$~specs+" "+STR$~(nxtspn+1)
37080OSCLI "SETTYPE "+fi$+" Data"
37090ENDIF
37100ENDPROC
37110
37120DEF PROCsave_noise(fi$)
37130IF fi$="" THEN
37140PROCerror(16,"")
37150ELSE
37160OSCLI "SAVE "+fi$+" "+STR$~noise+" "+STR$~(nxtnsn+1)
37170OSCLI "SETTYPE "+fi$+" Data"
37180ENDIF
37190ENDPROC
37200
37210DEF PROCsave_vtypes(fi$)
37220IF fi$="" THEN
37230PROCerror(16,"")
37240ELSE
37250OSCLI "SAVE "+fi$+" "+STR$~verb_type+"+"+STR$~(2*(maxvbn+1))
37260OSCLI "SETTYPE "+fi$+" Data"
37270ENDIF
37280ENDPROC
37290
37300DEF PROCsave_arefs(fi$)
37310IF fi$="" THEN
37320PROCerror(16,"")
37330ELSE
37340OSCLI "SAVE "+fi$+" "+STR$~aref+"+"+STR$~(!aref+1)
37350OSCLI "SETTYPE "+fi$+" Data"
37360ENDIF
37370ENDPROC
37380
37390DEF PROCsave_nrefs(fi$)
37400IF fi$="" THEN
37410PROCerror(16,"")
37420ELSE
37430OSCLI "SAVE "+fi$+" "+STR$~nref+"+"+STR$~(!nref+1)
37440OSCLI "SETTYPE "+fi$+" Data"
37450ENDIF
37460ENDPROC
37470
37480DEF PROCsave_objs(fi$)
37490IF fi$="" THEN
37500PROCerror(16,"")
37510ELSE
37520IF NOT datavalid PROCswap_data:datavalid=TRUE
37530odata%?14=optr:odata%?15=last_object
37540OSCLI "SAVE "+fi$+" "+STR$~odata%+"+"+STR$~(o_len*(last_object+1))
37550OSCLI "SETTYPE "+fi$+" Data"
37560ENDIF
37570ENDPROC
37580
37590DEF PROCsave_rooms(fi$)
37600IF fi$="" THEN
37610PROCerror(16,"")
37620ELSE
37630IF NOT datavalid PROCswap_data:datavalid=TRUE
37640!rdata%=rptr+(last_room<<16)
37650OSCLI "SAVE "+fi$+" "+STR$~rdata%+"+"+STR$~(r_len*(last_room+1))
37660OSCLI "SETTYPE "+fi$+" Data"
37670ENDIF
37680ENDPROC
37690
37700DEF PROCsave_flags(fi$)
37710IF fi$="" THEN
37720PROCerror(16,"")
37730ELSE
37740chn%=OPENOUT fi$
37750FOR f%=0 TO 7
37760flag$=$(o_flags%+f%*maxd%)
37770PRINT#chn%,flag$
37780NEXT
37790FOR f%=0 TO 7
37800flag$=$(r_flags%+f%*maxd%)
37810PRINT#chn%,flag$
37820NEXT
37830CLOSE#chn%
37840ENDIF
37850ENDPROC
37860
37870DEF PROCsave_pix(fi$)
37880IF fi$="" THEN
37890PROCerror(16,"")
37900ELSE
37910OSCLI "SAVE "+fi$+" "+STR$~pixs+" "+STR$~(nxtpxn+1)
37920OSCLI "SETTYPE "+fi$+" Data"
37930ENDIF
37940ENDPROC
37950
37960DEF PROCsave_program(fi$)
37970IF fi$="" THEN
37980PROCerror(16,"")
37990ELSE
38000OSCLI "SAVE "+fi$+" "+STR$~program%+"+"+STR$~(FNprglen+4+1)
38010OSCLI "SETTYPE "+fi$+" Data"
38020ENDIF
38030ENDPROC
38040
38050DEF PROCsave_text(fi$)
38060IF fi$="" THEN
38070PROCerror(16,"")
38080ELSE
38090OSCLI "SAVE "+fi$+" "+STR$~text%+" "+STR$~FNtext_end
38100OSCLI "SETTYPE "+fi$+" Data"
38110ENDIF
38120ENDPROC
38130
38140DEF PROCsave_dict(fi$)
38150IF fi$="" THEN
38160PROCerror(16,"")
38170ELSE
38180OSCLI "SAVE "+fi$+" "+STR$~dict%+" "+STR$~(dict%+?dict%+256*dict%?1)
38190OSCLI "SETTYPE "+fi$+" Data"
38200ENDIF
38210ENDPROC
38220
38230DEF PROCload_all(f$)
38240REM f$ is the full pathname
38250SYS "Hourglass_On"
38260PROCclose(texthandle):PROCclose(objhandle):PROCclose(roomhandle)
38270p$=f$:f$=FNleafname(p$)
38280p$=LEFT$(p$,LEN(p$)-LEN(f$))
38290d$=p$+"Alps."
38300r$=p$+"Resources"
38310OSCLI("SET Users$Resources "+r$)
38320OSCLI("SET Alps$Pictures "+p$+"Pictures.")
38330OSCLI("SET Alps$Data "+d$)
38340PROCload_objs("<Alps$Data>Objects")
38350PROCload_rooms("<Alps$Data>Rooms")
38360PROCload_flags("<Alps$Data>Flags")
38370PROCload_pix("<Alps$Data>Pictures")
38380PROCload_vocab(f$)
38390PROCload_program("<Alps$Data>Program")
38400PROCload_text("<Alps$Data>Text")
38410PROCload_dict("<Alps$Data>Dict")
38420OSCLI("PRINT <Alps$Data>charset")
38430data_saved=TRUE:loaded$=f$:$filename%=f$
38440SYS "Hourglass_Off"
38450ENDPROC
38460
38470DEF PROCload_vocab(f$)
38480IF f$="" THEN
38490PROCerror(16,"")
38500ELSE
38510PROCload_nouns("<Alps$Data>Nouns")
38520PROCload_verbs("<Alps$Data>Verbs")
38530PROCload_adjects("<Alps$Data>Adjectives")
38540PROCload_preps("<Alps$Data>Prepos")
38550PROCload_conj("<Alps$Data>Conjunc")
38560PROCload_spec("<Alps$Data>Specials")
38570PROCload_noise("<Alps$Data>Noise")
38580PROCload_vtypes("<Alps$Data>VerbType")
38590PROCload_nrefs("<Alps$Data>Nref")
38600PROCload_arefs("<Alps$Data>Aref")
38610ENDIF
38620ENDPROC
38630
38640DEF PROCload_nouns(fi$)
38650IF fi$="" THEN
38660PROCerror(16,"")
38670ELSE
38680OSCLI "LOAD "+fi$+" "+STR$~nouns
38690obn=?nouns
38700nxtobj=nouns+(nouns?1+256*(nouns?2))
38710ENDIF
38720ENDPROC
38730
38740DEF PROCload_verbs(fi$)
38750IF fi$="" THEN
38760PROCerror(16,"")
38770ELSE
38780OSCLI "LOAD "+fi$+" "+STR$~verbs
38790vbn=?verbs
38800nxtvrb=verbs+(verbs?1+256*(verbs?2))
38810ENDIF
38820ENDPROC
38830
38840DEF PROCload_adjects(fi$)
38850IF fi$="" THEN
38860PROCerror(16,"")
38870ELSE
38880OSCLI "LOAD "+fi$+" "+STR$~adjects
38890adn=?adjects
38900nxtadj=adjects+(adjects?1+256*(adjects?2))
38910ENDIF
38920ENDPROC
38930
38940DEF PROCload_preps(fi$)
38950IF fi$="" THEN
38960PROCerror(16,"")
38970ELSE
38980OSCLI "LOAD "+fi$+" "+STR$~preps
38990prn=?preps
39000nxtprp=preps+(preps?1+256*(preps?2))
39010ENDIF
39020ENDPROC
39030
39040DEF PROCload_conj(fi$)
39050IF fi$="" THEN
39060PROCerror(16,"")
39070ELSE
39080OSCLI "LOAD "+fi$+" "+STR$~conjs
39090cjn=?conjs
39100nxtcjn=conjs+(conjs?1+256*(conjs?2))
39110ENDIF
39120ENDPROC
39130
39140DEF PROCload_spec(fi$)
39150IF fi$="" THEN
39160PROCerror(16,"")
39170ELSE
39180OSCLI "LOAD "+fi$+" "+STR$~specs
39190spn=?specs
39200nxtspn=specs+(specs?1+256*(specs?2))
39210ENDIF
39220ENDPROC
39230
39240DEF PROCload_noise(fi$)
39250IF fi$="" THEN
39260PROCerror(16,"")
39270ELSE
39280OSCLI "LOAD "+fi$+" "+STR$~noise
39290nsn=?noise
39300nxtnsn=noise+(noise?1+256*(noise?2))
39310ENDIF
39320ENDPROC
39330
39340DEF PROCload_vtypes(fi$)
39350IF fi$="" THEN
39360PROCerror(16,"")
39370ELSE
39380OSCLI "LOAD "+fi$+" "+STR$~verb_type
39390ENDIF
39400ENDPROC
39410
39420DEF PROCload_arefs(fi$)
39430IF fi$="" THEN
39440PROCerror(16,"")
39450ELSE
39460OSCLI "LOAD "+fi$+" "+STR$~aref
39470ENDIF
39480ENDPROC
39490
39500DEF PROCload_nrefs(fi$)
39510IF fi$="" THEN
39520PROCerror(16,"")
39530ELSE
39540OSCLI "LOAD "+fi$+" "+STR$~nref
39550ENDIF
39560ENDPROC
39570
39580DEF PROCload_objs(fi$)
39590IF fi$="" THEN
39600PROCerror(16,"")
39610ELSE
39620OSCLI "LOAD "+fi$+" "+STR$~odata%
39630optr=odata%?14
39640last_object=odata%?15
39650ENDIF
39660ENDPROC
39670
39680DEF PROCload_rooms(fi$)
39690IF fi$="" THEN
39700PROCerror(16,"")
39710ELSE
39720OSCLI "LOAD "+fi$+" "+STR$~rdata%
39730rptr=!rdata% AND &FFFF
39740last_room=(!rdata% AND &FFFF0000)>>16
39750ENDIF
39760ENDPROC
39770
39780DEF PROCload_flags(fi$)
39790IF fi$="" THEN
39800PROCerror(16,"")
39810ELSE
39820chn%=OPENIN fi$
39830FOR f%=0 TO 7
39840INPUT#chn%,flag$
39850$(o_flags%+f%*maxd%)=flag$
39860NEXT
39870
39880FOR f%=0 TO 7
39890INPUT#chn%,flag$
39900$(r_flags%+f%*maxd%)=flag$
39910NEXT
39920CLOSE#chn%
39930ENDIF
39940ENDPROC
39950
39960DEF PROCload_pix(fi$)
39970IF fi$="" THEN
39980PROCerror(16,"")
39990ELSE
40000OSCLI "LOAD "+fi$+" "+STR$~pixs
40010pxn=?pixs
40020nxtpxn=pixs+(pixs?1+256*(pixs?2))
40030ENDIF
40040ENDPROC
40050
40060DEF PROCload_program(fi$)
40070IF fi$="" THEN
40080PROCerror(16,"")
40090ELSE
40100OSCLI "LOAD "+fi$+" "+STR$~program%
40110ENDIF
40120ENDPROC
40130
40140DEF PROCload_text(fi$)
40150IF fi$="" THEN
40160PROCerror(16,"")
40170ELSE
40180OSCLI "LOAD "+fi$+" "+STR$~text%
40190mptr=1
40200ENDIF
40210ENDPROC
40220
40230DEF PROCload_dict(fi$)
40240LOCAL I%,L%
40250IF fi$="" THEN
40260PROCerror(16,"")
40270ELSE
40280OSCLI "LOAD "+fi$+" "+STR$~dict%
40290tok%=dict%?2:L%=0
40300IF tok%=0 tok%=128 ELSE tok%-=128
40310FOR I%=1 TO tok%
40320tok$(I%)=$(dict%+3+L%)
40330L%+=LENtok$(I%)+1
40340NEXT
40350ENDIF
40360ENDPROC
40370
40380DEF PROCsetup_disk(S%)
40390PROCgetw(setuph):PROCgetpointer
40400PROCopen(setuph,mousex%-64,mousey%,x1%-x0%,y1%-y0%)
40410PROCsys_claiminputfocus(setuph,2,0,0,-1,LEN(FNgeticondata(setuph,2)))
40420PROCgetw(setuph)
40430MOUSE RECTANGLE x0%,y0%,x1%-x0%,y1%-y0%
40440dialogue%=S%
40450ENDPROC
40460
40470DEF PROCquit(S%)
40480IF NOT data_saved THEN
40490ans = FNerrorbox("There is unsaved data in the memory. Do you really want to quit?",0,3,S%)
40500ELSE
40510quit%=TRUE
40520ENDIF
40530ENDPROC
40540
40550DEF PROCensure(S%,T$)
40560dialogue%=FNerrorbox(T$,0,3,S%)
40570ENDPROC
40580
40590
40600REM ------ Vocabulary routines ------
40610
40620DEF PROCgetobn(text$,RETURN num,RETURN found$)
40630sptr=nouns+3:PROCsearch(sptr,text$,num,found$)
40640ENDPROC
40650
40660DEF PROCgetvbn(text$,RETURN num,RETURN found$)
40670sptr=verbs+3:PROCsearch(sptr,text$,num,found$)
40680ENDPROC
40690
40700DEF PROCgetadn(text$,RETURN num,RETURN found$)
40710sptr=adjects+3:PROCsearch(sptr,text$,num,found$)
40720ENDPROC
40730
40740DEF PROCgetprn(text$,RETURN num,RETURN found$)
40750sptr=preps+3:PROCsearch(sptr,text$,num,found$)
40760ENDPROC
40770
40780DEF PROCgetcjn(text$,RETURN num,RETURN found$)
40790sptr=conjs+3:PROCsearch(sptr,text$,num,found$)
40800ENDPROC
40810
40820DEF PROCgetspn(text$,RETURN num,RETURN found$)
40830sptr=specs+3:PROCsearch(sptr,text$,num,found$)
40840ENDPROC
40850
40860DEF PROCgetnsn(text$,RETURN num,RETURN found$)
40870sptr=noise+3:PROCsearch(sptr,text$,num,found$)
40880ENDPROC
40890
40900DEF PROCsearch(sptr,search$,RETURN number,RETURN temp$)
40910LOCAL temp$,found
40920number=0
40930F%=work%:B%=sptr:$(work%+&128)=search$:REM put search string in 'text'
40940CALL search
40950number=!(work%+&148)
40960ENDPROC
40970
40980DEF PROCword(type,line$)
40990REM Add words to the vocabulary or picture list
41000REM word types are - nouns = 1, verbs = 2, adjectives = 3
41010REM prepositions = 4, conjunctions = 5, specials = 6
41020REM picture names = 10
41030LOCAL index,ptr,I%,len,len2,temp$
41040
41050IF line$="" THEN ENDPROC
41060
41070WHILE INSTR("0123456789=",LEFT$(line$,1))<>0
41080line$=MID$(line$,2)
41090ENDWHILE
41100
41110WHILE LEFT$(line$,1)=" "
41120line$=MID$(line$,2)
41130ENDWHILE
41140
41150IF type<4 OR type=10 THEN
41160end=INSTR(line$,"<"):IF end=0 THEN PROCerror(22,""):errflag=TRUE:ENDPROC
41170number$=MID$(line$,end+1):line$=LEFT$(line$,end-1)
41180IF RIGHT$(number$,1)=">" THEN number$=LEFT$(number$,LENnumber$-1)
41190ELSE
41200number$=""
41210ENDIF
41220
41230IF number$="" THEN
41240CASE type OF
41250WHEN 1,3
41260number$=STR$(obn)
41270WHEN 2
41280number$="0":REM Default verb type is zero
41290OTHERWISE
41300number$=""
41310ENDCASE
41320ENDIF
41330
41340index=0
41350ptr=INSTR(line$,",")
41360IF ptr=0 THEN
41370a_list$(index)=LEFT$(line$,maxlen)
41380ELSE
41390WHILE ptr<>0 AND index<11
41400temp$=LEFT$(line$,ptr-1)
41410len=LEN(line$)
41420line$=RIGHT$(line$,len-ptr)
41430a_list$(index)=LEFT$(temp$,maxlen)
41440index+=1
41450ptr=INSTR(line$,",")
41460ENDWHILE
41470a_list$(index)=LEFT$(line$,maxlen)
41480ENDIF
41490
41500CASE type OF
41510
41520WHEN 1
41530IF obn=maxobn THEN
41540PROCerror(17,"at "+a_list$(0)):errflag=TRUE
41550ELSE
41560FOR I%=0 TO index
41570 len2=LEN a_list$(I%)
41580 IF len2>0 THEN
41590 PROCgetobn(a_list$(I%),num,fnd$)
41600 IF num<>0 PROCerror(5,a_list$(I%)):errflag=TRUE
41610 IF nxtobj+len2>noun_end-2 PROCerror(13,error$(38)):errflag=TRUE
41620 IF NOT errflag THEN
41630 $nxtobj=a_list$(I%):?(nxtobj+len2-1)=?(nxtobj+len2-1) OR 128
41640 nxtobj+=len2:?nxtobj=obn:nxtobj+=1:?nxtobj=&FF
41650 ENDIF
41660 ENDIF
41670NEXT I%
41680 IF NOT errflag THEN
41690 obn+=1
41700 ?nouns=obn:nouns?1=(nxtobj-nouns) MOD 256:nouns?2=(nxtobj-nouns) DIV 256
41710 ptr=1:memptr=nref+!nref:svmptr=memptr:refs=0:memptr+=1
41720 REPEAT
41730 PROCdecode_parameter(number$,ptr,ptr,val,0)
41740 IF NOT errflag THEN ?memptr=val:memptr+=1:refs+=1
41750 UNTIL ptr>LENnumber$ OR errflag
41760 ?memptr=0:!nref=!nref+refs+1
41770 ?svmptr=refs
41780 ENDIF
41790ENDIF
41800WHEN 2
41810IF vbn=maxvbn THEN
41820PROCerror(18,"at "+a_list$(0)):errflag=TRUE
41830ELSE
41840FOR I%=0 TO index
41850 len2=LEN a_list$(I%)
41860 IF len2>0 THEN
41870 PROCgetvbn(a_list$(I%),num,fnd$)
41880 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
41890 IF nxtvrb+len2>verb_end-2 PROCerror(13,error$(39)):errflag=TRUE
41900 IF NOT errflag THEN
41910 $nxtvrb=a_list$(I%):?(nxtvrb+len2-1)=?(nxtvrb+len2-1) OR 128
41920 nxtvrb+=len2:?nxtvrb=vbn:nxtvrb+=1:?nxtvrb=&FF
41930 ENDIF
41940 ENDIF
41950NEXT I%
41960IF NOT errflag THEN
41970ptr=1
41980PROCdecode_parameter(number$,ptr,ptr,val,0)
41990IF NOT errflag THEN
42000verb_type?(2*vbn)=val
42010oloc$=MID$(number$,ptr+1):olocflg=0
42020IF INSTR(oloc$,"C")<>0 THEN olocflg=1
42030IF INSTR(oloc$,"P")<>0 THEN olocflg=olocflg OR 2
42040verb_type?(2*vbn+1)=olocflg
42050vbn+=1
42060?verbs=vbn:verbs?1=(nxtvrb-verbs) MOD 256:verbs?2=(nxtvrb-verbs) DIV 256
42070ENDIF
42080ENDIF
42090ENDIF
42100WHEN 3
42110IF adn=maxadj THEN
42120PROCerror(19,"at "+a_list$(0)):errflag=TRUE
42130ELSE
42140FOR I%=0 TO index
42150 len2=LEN a_list$(I%)
42160 IF len2>0 THEN
42170 PROCgetadn(a_list$(I%),num,fnd$)
42180 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
42190 IF nxtadj+len2>adjc_end-2 PROCerror(13,error$(40)):errflag=TRUE
42200 IF NOT errflag THEN
42210 $nxtadj=a_list$(I%):?(nxtadj+len2-1)=?(nxtadj+len2-1) OR 128
42220 nxtadj+=len2:?nxtadj=adn:nxtadj+=1:?nxtadj=&FF
42230 ENDIF
42240 ENDIF
42250NEXT I%
42260 IF NOT errflag THEN
42270adn+=1
42280?adjects=adn:adjects?1=(nxtadj-adjects) MOD 256:adjects?2=(nxtadj-adjects) DIV 256
42290 ptr=1:memptr=aref+!aref:svmptr=memptr:refs=0:memptr+=1
42300 REPEAT
42310 PROCdecode_parameter(number$,ptr,ptr,val,0)
42320 IF NOT errflag THEN ?memptr=val:memptr+=1:refs+=1
42330 UNTIL ptr>LENnumber$ OR errflag
42340 ?memptr=0:!aref=!aref+refs+1
42350 ?svmptr=refs
42360 ENDIF
42370ENDIF
42380WHEN 4
42390IF prn=maxprep THEN
42400PROCerror(20,"at "+a_list$(0)):errflag=TRUE
42410ELSE
42420FOR I%=0 TO index
42430 len2=LEN a_list$(I%)
42440 IF len2>0 THEN
42450 PROCgetprn(a_list$(I%),num,fnd$)
42460 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
42470 IF nxtprp+len2>prep_end-2 PROCerror(13,error$(41)):errflag=TRUE
42480 IF NOT errflag THEN
42490 $nxtprp=a_list$(I%):?(nxtprp+len2-1)=?(nxtprp+len2-1) OR 128
42500 nxtprp+=len2:?nxtprp=prn:nxtprp+=1:?nxtprp=&FF
42510 ENDIF
42520 ENDIF
42530NEXT I%
42540 IF NOT errflag THEN
42550 prn+=1
42560 ?preps=prn:preps?1=(nxtprp-preps) MOD 256:preps?2=(nxtprp-preps) DIV 256
42570 ENDIF
42580ENDIF
42590WHEN 5
42600IF cjn=maxconj THEN
42610PROCerror(21,"at "+a_list$(0)):errflag=TRUE
42620ELSE
42630FOR I%=0 TO index
42640 len2=LEN a_list$(I%)
42650 IF len2>0 THEN
42660 PROCgetcjn(a_list$(I%),num,fnd$)
42670 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
42680 IF nxtcjn+len2>conj_end-2 PROCerror(13,error$(42)):errflag=TRUE
42690 IF NOT errflag THEN
42700 $nxtcjn=a_list$(I%):?(nxtcjn+len2-1)=?(nxtcjn+len2-1) OR 128
42710 nxtcjn+=len2:?nxtcjn=cjn:nxtcjn+=1:?nxtcjn=&FF
42720 ENDIF
42730 ENDIF
42740NEXT I%
42750 IF NOT errflag THEN
42760 cjn+=1
42770 ?conjs=cjn:conjs?1=(nxtcjn-conjs) MOD 256:conjs?2=(nxtcjn-conjs) DIV 256
42780 ENDIF
42790ENDIF
42800WHEN 6
42810IF spn=maxspec THEN
42820PROCerror(24,"at "+a_list$(0)):errflag=TRUE
42830ELSE
42840FOR I%=0 TO index
42850 len2=LEN a_list$(I%)
42860 IF len2>0 THEN
42870 PROCgetspn(a_list$(I%),num,fnd$)
42880 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
42890 IF nxtspn+len2>spec_end-2 PROCerror(13,error$(43)):errflag=TRUE
42900 IF NOT errflag THEN
42910 $nxtspn=a_list$(I%):?(nxtspn+len2-1)=?(nxtspn+len2-1) OR 128
42920 nxtspn+=len2:?nxtspn=spn:nxtspn+=1:?nxtspn=&FF
42930 ENDIF
42940 ENDIF
42950NEXT I%
42960 IF NOT errflag THEN
42970 spn+=1
42980 ?specs=spn:specs?1=(nxtspn-specs) MOD 256:specs?2=(nxtspn-specs) DIV 256
42990 ENDIF
43000ENDIF
43010WHEN 7
43020IF nsn=maxnoise THEN
43030PROCerror(25,"at "+a_list$(0)):errflag=TRUE
43040ELSE
43050FOR I%=0 TO index
43060 len2=LEN a_list$(I%)
43070 IF len2>0 THEN
43080 PROCgetnsn(a_list$(I%),num,fnd$)
43090 IF num<>0 PROCerror(8,a_list$(I%)):errflag=TRUE
43100 IF nxtnsn+len2>noise_end-2 PROCerror(13,error$(44)):errflag=TRUE
43110 IF NOT errflag THEN
43120 $nxtnsn=a_list$(I%):?(nxtnsn+len2-1)=?(nxtnsn+len2-1) OR 128
43130 nxtnsn+=len2:?nxtnsn=nsn:nxtnsn+=1:?nxtnsn=&FF
43140 ENDIF
43150 ENDIF
43160NEXT I%
43170 IF NOT errflag THEN
43180 nsn+=1
43190 ?noise=nsn:noise?1=(nxtnsn-noise) MOD 256:noise?2=(nxtnsn-noise) DIV 256
43200 ENDIF
43210ENDIF
43220WHEN 10
43230IF pxn=maxpix THEN
43240PROCerror(26,"at "+a_list$(0)):errflag=TRUE
43250ELSE
43260FOR I%=0 TO index
43270 len2=LEN a_list$(I%)
43280 IF len2>0 THEN
43290 IF nxtpxn+len2>pix_end-2 PROCerror(13,error$(45)):errflag=TRUE
43300 IF NOT errflag THEN
43310 $nxtpxn=a_list$(I%):REM ?(nxtpxn+len2-1)=?(nxtpxn+len2-1) OR 128
43320 nxtpxn+=len2+1
43330 ENDIF
43340 ENDIF
43350NEXT I%
43360 IF NOT errflag THEN
43370 loc$=MID$(number$,1)
43380 IF loc$<>"" THEN
43390 IF INSTR("TBLR",loc$)<>0 THEN val=INSTR("TBLR",loc$)-1 ELSE val=0
43400 ELSE val=0
43410 ENDIF
43420 ?nxtpxn=val:nxtpxn+=5:?nxtpxn=&FF
43430 pxn+=1
43440 ?pixs=pxn:pixs?1=(nxtpxn-pixs) MOD 256:pixs?2=(nxtpxn-pixs) DIV 256
43450 ENDIF
43460ENDIF
43470ENDCASE
43480ENDPROC
43490
43500DEF PROCgetstr(test$,place,RETURN place,RETURN result$)
43510chr$=MID$(test$,place,1)
43520IF chr$=CHR$13 THEN result$="":ENDPROC
43530WHILE chr$=" " OR chr$="," place+=1
43540chr$=MID$(test$,place,1)
43550ENDWHILE
43560
43570IF chr$<>CHR$ 34 PROCerror(6," : "+line$):result$="":ENDPROC
43580place+=1
43590place2=INSTR(line$,CHR$34,place):IF place2<place PROCerror(6," : "+line$):result$="":ENDPROC
43600
43610result$=MID$(line$,place,place2-place)
43620place=place2+1
43630ENDPROC
43640
43650DEF PROClistnouns
43660LOCAL mptr,I%,J%,refs
43670IF obn=1 THEN ENDPROC
43680mptr=nref+4
43690FOR I%=1 TO obn-1
43700PROCput(STR$(I%)+"= ")
43710PROCpvok(I%,1,TRUE):PROCput(",<")
43720refs=?mptr
43730IF refs>0 THEN
43740FOR J%=1 TO refs
43750PROCput(STR$(J%?mptr))
43760IF J%<refs PROCput(",")
43770NEXT
43780ENDIF
43790mptr+=refs+1
43800PROCput(">"+CHR$13)
43810NEXT
43820PROCput(CHR$0)
43830ENDPROC
43840
43850DEF PROClistverbs
43860IF vbn=1 THEN ENDPROC
43870FOR I%=1 TO vbn-1
43880PROCput(STR$(I%)+"= ")
43890vtype=verb_type?(2*I%)
43900PROCpvok(I%,0,TRUE):PROCput(",<"+STR$(vtype))
43910olflg=verb_type?(2*I%+1):oloc$=""
43920IF vtype>0 THEN
43930IF (olflg AND 1)<>0 THEN oloc$+="C"
43940IF (olflg AND 2)<>0 THEN oloc$+="P"
43950PROCput(",")
43960ENDIF
43970PROCput(oloc$+">"+CHR$13)
43980NEXT
43990PROCput(CHR$0)
44000ENDPROC
44010
44020DEF PROClistadjs
44030LOCAL mptr,I%,J%,refs
44040IF adn=1 THEN ENDPROC
44050mptr=aref+4
44060FOR I%=1 TO adn-1
44070PROCput(STR$(I%)+"= ")
44080PROCpvok(I%,2,TRUE):PROCput(",<")
44090refs=?mptr
44100IF refs>0 THEN
44110FOR J%=1 TO refs
44120PROCput(STR$(J%?mptr))
44130IF J%<refs PROCput(",")
44140NEXT
44150ENDIF
44160mptr+=refs+1
44170PROCput(">"+CHR$13)
44180NEXT
44190PROCput(CHR$0)
44200ENDPROC
44210
44220DEF PROClistpreps
44230LOCAL I%,J%
44240IF prn=1 THEN ENDPROC
44250FOR I%=1 TO prn-1
44260PROCput(STR$(I%)+"= ")
44270PROCpvok(I%,3,TRUE):PROCput(CHR$13)
44280NEXT
44290PROCput(CHR$0)
44300ENDPROC
44310
44320DEF PROClistconjs
44330LOCAL I%,J%
44340IF cjn=1 THEN ENDPROC
44350FOR I%=1 TO cjn-1
44360PROCput(STR$(I%)+"= ")
44370PROCpvok(I%,4,TRUE):PROCput(CHR$13)
44380NEXT
44390PROCput(CHR$0)
44400ENDPROC
44410
44420DEF PROClistspecs
44430LOCAL I%,J%
44440IF spn=1 THEN ENDPROC
44450FOR I%=1 TO spn-1
44460PROCput(STR$(I%)+"= ")
44470PROCpvok(I%,5,TRUE):PROCput(CHR$13)
44480NEXT
44490PROCput(CHR$0)
44500ENDPROC
44510
44520DEF PROClistnoise
44530LOCAL I%,J%
44540IF nsn=1 THEN ENDPROC
44550FOR I%=1 TO nsn-1
44560PROCput(STR$(I%)+"= ")
44570PROCpvok(I%,6,TRUE):PROCput(CHR$13)
44580NEXT
44590PROCput(CHR$0)
44600ENDPROC
44610
44620DEF PROCstore_pix
44630SYS "Hourglass_On"
44640errflag=FALSE
44650pxn=1
44660nxtpxn=pixs:?nxtpxn=pxn:nxtpxn?1=3:nxtpxn?2=0:nxtpxn+=3:?nxtpxn=&FF
44670last%=FNfind_lastrow
44680FOR I%=0 TO last%
44690IF NOT errflag PROCword(10,FNrow(I%))
44700NEXT
44710SYS "Hourglass_Off"
44720
44730ENDPROC
44740
44750DEF PROCstore_vocab
44760SYS "Hourglass_On"
44770errflag=FALSE:PROCremove_markers
44780
44790CASE voc_sect% OF
44800WHEN 1
44810obn=1
44820nxtobj=nouns:?nxtobj=obn:nxtobj?1=3:nxtobj?2=0:nxtobj+=3:?nxtobj=&FF
44830!nref=4
44840WHEN 2
44850vbn=1
44860nxtvrb=verbs:?nxtvrb=vbn:nxtvrb?1=3:nxtvrb?2=0:nxtvrb+=3:?nxtvrb=&FF
44870WHEN 3
44880adn=1
44890nxtadj=adjects:?nxtadj=adn:nxtadj?1=3:nxtadj?2=0:nxtadj+=3:?nxtadj=&FF
44900!aref=4
44910WHEN 4
44920prn=1
44930nxtprp=preps:?nxtprp=prn:nxtprp?1=3:nxtprp?2=0:nxtprp+=3:?nxtprp=&FF
44940WHEN 5
44950cjn=1
44960nxtcjn=conjs:?nxtcjn=cjn:nxtcjn?1=3:nxtcjn?2=0:nxtcjn+=3:?nxtcjn=&FF
44970WHEN 6
44980spn=1
44990nxtspn=specs:?nxtspn=spn:nxtspn?1=3:nxtspn?2=0:nxtspn+=3:?nxtspn=&FF
45000WHEN 7
45010nsn=1
45020nxtnsn=noise:?nxtnsn=nsn:nxtnsn?1=3:nxtnsn?2=0:nxtnsn+=3:?nxtnsn=&FF
45030ENDCASE
45040last%=FNfind_lastrow
45050
45060FOR I%=0 TO last%
45070 IF NOT errflag PROCword(voc_sect%,FNrow(I%))
45080NEXT
45090IF NOT errflag text_ok=TRUE
45100SYS "Hourglass_Off"
45110ENDPROC
45120
45130DEF FNfindnoun(obj,RETURN J%)
45140REM Finds the number of the noun referring to a specified object
45150LOCAL M%,I%,N%,found
45160M%=nref+4
45170WHILE N%<last_object AND NOT found
45180J%=?M%
45190IF J%>0 THEN
45200FOR I%=1 TO J%
45210IF M%?I%=obj THEN found=TRUE
45220NEXT
45230ENDIF
45240M%+=J%+1
45250N%+=1
45260ENDWHILE
45270IF found THEN=N% ELSE=0
45280
45290
45300DEF PROCwhich_obj(N%,RETURN V$,RETURN R%)
45310REM Returns a string containing the objects referenced by noun N%
45320REM R%=number of objects referenced
45330LOCAL M%,found,I%,J%,K%
45340
45350M%=nref+4
45360IF N%>1 THEN
45370FOR K%=1 TO N%-1
45380 J%=?M%
45390 M%+=J%+1
45400NEXT
45410ENDIF
45420J%=?M%
45430R%=J%:V$=""
45440IF J%>0 THEN
45450FOR I%=1 TO J%
45460 V$+=STR$(I%?M%)+","
45470NEXT
45480ENDIF
45490ENDPROC
45500
45510DEF PROCpvok(num,type,all)
45520LOCAL temp$,found,ctr
45530IF num=0 THEN ENDPROC
45540
45550CASE type OF
45560WHEN 0: sptr=verbs+3
45570WHEN 1: sptr=nouns+3
45580WHEN 2: sptr=adjects+3
45590WHEN 3: sptr=preps+3
45600WHEN 4: sptr=conjs+3
45610WHEN 5: sptr=specs+3
45620WHEN 6: sptr=noise+3
45630WHEN 10: sptr=pixs+3
45640ENDCASE
45650
45660A%=num:B%=sptr
45670IF NOT all THEN
45680CALL pvok:temp$=$atext:IF temp$<>"" PROCput(temp$)
45690ELSE
45700?pvokflag=0
45710REPEAT
45720CALL pvok
45730IF ?pvokflag=0 THEN
45740IF ctr>0 THEN PROCput(",")
45750temp$=$atext:IF temp$<>"" PROCput(temp$)
45760ctr+=1:B%=!address
45770ENDIF
45780UNTIL ?pvokflag>0
45790ENDIF
45800ENDPROC
45810
45820DEF PROCnonspc(str$,place,RETURN place,RETURN chr$)
45830WHILE MID$(str$,place,1)=" "
45840 place+=1
45850ENDWHILE
45860chr$=MID$(str$,place,1)
45870ENDPROC
45880
45890DEF PROCdodefn
45900IF vbn=maxvbn PROCerror(11,": "+STR$(maxvbn)+" "+error$(46)):ENDPROC
45910?prgptr=def_token:prgptr+=1
45920
45930PROCgetstr(line$,ptr,ptr,vrb$):index=0
45940IF errflag THEN ENDPROC
45950REM WHILE vrb$<>"" AND index<11
45960a_list$(index)=vrb$:index+=1
45970REM PROCgetstr(line$,ptr,ptr,vrb$)
45980REM ENDWHILE
45990
46000IF vrb$="" PROCerror(1,error$(47)):ENDPROC
46010
46020IF errflag THEN ENDPROC
46030
46040flag=FALSE:index-=1
46050FOR I%=0 TO index
46060 PROCgetvbn(a_list$(I%),num,fnd$)
46070 IF num<>0 AND NOT existing_verb PROCerror(8,a_list$(I%)):flag=TRUE
46080 oldvbn=num
46090NEXT I%
46100
46110IF NOT flag AND NOT existing_verb THEN
46120 FOR I%=0 TO index
46130 len2=LEN a_list$(I%)
46140 $nxtvrb=a_list$(I%):?(nxtvrb+len2-1)=?(nxtvrb+len2-1) OR 128
46150 nxtvrb+=len2:?nxtvrb=vbn:nxtvrb+=1
46160 NEXT I%
46170 ?prgptr=vbn:prgptr+=1:?nxtvrb=&FF:vbn+=1
46180 ?verbs=vbn:verbs?1=(nxtvrb-verbs) MOD 256:verbs?2=(nxtvrb-verbs) DIV 256
46190
46200ELSE
46210IF existing_verb THEN ?prgptr=oldvbn:prgptr+=1
46220ENDIF
46230
46240existing_verb=TRUE
46250ENDPROC
46260
46270DEF PROCprtdef
46280vrbnum=?listptr
46290PROCput(CHR$32+CHR$34):PROCpvok(vrbnum,0,FALSE):PROCput(CHR$34)
46300ENDPROC
46310
46320DEF FNfntype(parm)
46330LOCAL temp
46340IF token=prep_token OR token=notprep_token THEN =3
46350temp=parm AND %01000000:REM check if `object` function
46360IF temp<>0 THEN=1
46370temp=parm AND %00100000:REM check if `verb` function
46380IF temp<>0 THEN=2 ELSE =0
46390
46400DEF PROCprntobj
46410LOCAL num
46420objnum=?listptr
46430IF objnum>last_object THEN ENDPROC
46440num=FNfindnoun(objnum,refs)
46450IF refs=1 THEN
46460PROCput(CHR$34):PROCpvok(num,1,FALSE):PROCput(CHR$34)
46470doneit=TRUE
46480ENDIF
46490ENDPROC
46500
46510DEF PROCprntvrb
46520vrbnum=?listptr
46530IF vrbnum>=vbn THEN ENDPROC
46540PROCput(CHR$34):PROCpvok(vrbnum,0,FALSE):PROCput(CHR$34)
46550doneit=TRUE
46560ENDPROC
46570
46580DEF PROCprintprep
46590LOCAL num
46600num=?listptr
46610IF num>=prn THEN ENDPROC
46620PROCput(CHR$34):PROCpvok(num,3,FALSE):PROCput(CHR$34)
46630doneit=TRUE
46640ENDPROC
46650
46660DEF PROCcopy_from_editor
46670LOCAL ldptr,svptr,O%,I%,R%
46680svptr=initsave
46690FOR O%=last_object TO 0 STEP-1
46700ldptr=odata%+O%*o_len
46710!svptr=!ldptr:svptr+=4
46720?svptr=ldptr?12:svptr+=1
46730?svptr=ldptr?14:svptr+=1
46740?svptr=ldptr?15:svptr+=1
46750NEXT
46760FOR R%=last_room TO 0 STEP-1
46770ldptr=rdata%+R%*r_len
46780?svptr=?ldptr:svptr?1=ldptr?1:svptr+=2
46790FOR I%=54 TO 73 STEP4
46800!svptr=I%!ldptr:svptr+=4
46810NEXT
46820NEXT
46830ENDPROC
46840
46850DEF PROCcopy_to_editor
46860LOCAL ldptr,svptr,O%,I%,R%
46870ldptr=initsave
46880FOR O%=last_object TO 0 STEP-1
46890svptr=odata%+O%*o_len
46900!svptr=!ldptr:ldptr+=4
46910svptr?12=?ldptr:ldptr+=1
46920svptr?14=?ldptr:ldptr+=1
46930svptr?15=?ldptr:ldptr+=1
46940NEXT
46950FOR R%=last_room TO 0 STEP-1
46960svptr=rdata%+R%*r_len
46970?svptr=?ldptr:svptr?1=ldptr?1:ldptr+=2
46980FOR I%=54 TO 73 STEP4
46990I%!svptr=!ldptr:ldptr+=4
47000NEXT
47010NEXT
47020ENDPROC
47030
47040DEF PROCswap_data
47050LOCAL ldptr,svptr,O%,I%,R%,T%
47060ldptr=initsave
47070FOR O%=last_object TO 0 STEP-1
47080svptr=odata%+O%*o_len
47090T%=!svptr
47100!svptr=!ldptr:!ldptr=T%:ldptr+=4
47110T%=svptr?12
47120svptr?12=?ldptr:?ldptr=T%:ldptr+=1
47130T%=svptr?14
47140svptr?14=?ldptr:?ldptr=T%:ldptr+=1
47150T%=svptr?15
47160svptr?15=?ldptr:?ldptr=T%:ldptr+=1
47170NEXT
47180FOR R%=last_room TO 0 STEP-1
47190svptr=rdata%+R%*r_len
47200T%=?svptr:?svptr=?ldptr:?ldptr=T%:T%=svptr?1:svptr?1=ldptr?1:ldptr?1=T%:ldptr+=2
47210FOR I%=54 TO 73 STEP4
47220T%=I%!svptr
47230I%!svptr=!ldptr:!ldptr=T%:ldptr+=4
47240NEXT
47250NEXT
47260ENDPROC
47270
47280DEF FNerrorbox(err$,err%,Errorflags,fromPlace%)
47290SYS CreateM,,-1
47300SYS Poll,,block
47310!mistake = err%
47320IF NOT testing AND err%=29 THEN
47330 err$="Sorry - not implemented in this version": Errorflags=1
47340ENDIF
47350IF testing err$+=" (Error code: "+STR$(ERL)+")"
47360IF (err% AND &FF)=&C7 err$="Disk not formatted. Shall I format it now?":Errorflags=3
47370$(mistake+4) = err$+CHR$(0)
47380IF fromPlace%<>-99 THEN Errorflags=Errorflags OR 16:t$="Message from ALPS" ELSE t$="ALPS"
47390SYS "Wimp_ReportError",mistake,Errorflags,t$ TO ,dialogue%
47400ok = (dialogue%=1)
47410
47420IF (err% AND &FF)=&C7 AND ok THEN
47430 *FORMAT 0 E Y
47440 PROCcreate_dirs(FNgeticondata(setuph,2),FNgeticondata(setuph,5))
47450ENDIF
47460
47470CASE fromPlace% OF
47480WHEN -99: REM *** a proper error ***
47490WHEN 0:IF ok THEN PROCsave_all(path$)
47500WHEN 1:IF ok THEN PROCload_all(path$):PROCopen(ALPSmain,400,800,600,600)
47510WHEN 2:IF ok THEN PROCcreate_dirs
47520WHEN 3:IF ok THEN
47530quit%=TRUE
47540SYS "Wimp_GetCaretPosition",,quitblk+20 :REM Fill up first 5 words
47550quitblk!44=&1FC :REM CTRL-SHIFT-f12
47560!quitblk=48 :REM Size of message block
47570quitblk!12=0
47580quitblk!16=8 :REM Send Key_Pressed message
47590SYS "Wimp_SendMessage",17,quitblk,prequittask%
47600ENDIF
47610WHEN 4:IF ok THEN quit%=TRUE
47620ENDCASE
47630=dialogue%
47640
47650
47660DEF FNOS_Var(V$)
47670SYS "XOS_ReadVarVal",V$,0,-1 TO ,,exists
47680=exists
47690
47700DEF FNReadVarVal(V$)
47710DIM vblk 32
47720SYS "XOS_ReadVarVal",V$,vblk,32,,0,3 TO ,,N%
47730vblk?N%=13
47740=$vblk
47750
47760DEF FNiconbar(sprBlk, spname$, xx,yy)
47770!qBlk%=-1
47780qBlk%!4=0:qBlk%!8=0:qBlk%!12=xx*2:qBlk%!16=yy*4
47790qBlk%!20=&2102
47800DIM qBlk%!24 (LENspname$+1):$(qBlk%!24)=spname$
47810qBlk%!28=sprBlk
47820qBlk%!32=LENspname$+1
47830SYS "Wimp_CreateIcon",,qBlk% TO theIc%
47840=theIc%
47850
47860
47870DEF PROCreceive(block)
47880ref%=block!8
47890CASE block!16 OF
47900 WHEN 0 :quit%=TRUE
47910 WHEN 2 :REM SaveAck from Filer/another app.
47920 path$=FNname(block+44)
47930 PROCsave_all(path$)
47940 !block=64:block!12=block!8:block!16=3
47950 SYS "Wimp_SendMessage",17,block,block!20,block!24
47960 WHEN 3,5 :PROCload(block)
47970 WHEN 8 :REM PreQuit
47980 IF NOT data_saved THEN
47990 prequittask%=block!4
48000 bytes=!block
48010 FOR I%=0 TO bytes
48020 quitblk!I%=block!I%
48030 NEXT
48040 quitblk!12=quitblk!8
48050 block!12=block!8
48060 SYS "Wimp_SendMessage",19,block
48070 ans = FNerrorbox("There is unsaved data in the memory. Do you really want to quit?",0,3,3)
48080 ENDIF
48090 WHEN &502:PROChelp(block!32,block!36,block)
48100 WHEN &400C1:REM mode change
48110 mode%=MODE
48120 PROCgetmodeinfo
48130 PROCassemble(armcode%):REM Need to allow for different screen size
48140 IF scrnsize>oldsize THEN null=FNerrorbox("Warning! It may not be possible to display pictures in this mode due to memory restrictions. To display pictures quit ALPS and restart in this mode.",0,1,5)
48150ENDCASE
48160ENDPROC
48170
48180DEF PROCload(b)
48190ourtype=EVAL("&"+type$)
48200IF b!40 = ourtype THEN
48210 path$=FNname(b+44)
48220 IF NOT data_saved THEN
48230 PROCLoadAck
48240 PROCensure(1,"Unsaved data in memory. Please confirm that you want to load this file.")
48250 ELSE
48260 REM Copy 'block' to preserve 'Load' message data - 12.04.90
48270 FOR I%=0 TO &200 STEP 4
48280 block2!I%=b!I%
48290 NEXT
48300 PROCload_all(path$)
48310 REM Restore block
48320 FOR I%=0 TO &200 STEP 4
48330 b!I%=block2!I%
48340 NEXT
48350 PROCLoadAck
48360 PROCopen(ALPSmain,400,800,600,600)
48370 ENDIF
48380ENDIF
48390ENDPROC
48400
48410DEF PROCLoadAck
48420block!12=block!8:block!16=4:!block=64
48430SYS "Wimp_SendMessage",17,block,block!4
48440ENDPROC
48450
48460DEF PROCsave
48470path$=FNgeticondata(savehandle,2)
48480PROCgetpointer
48490block!20=64:block!32=0:block!36=1:REM DataSave MSG
48500block!40=handle%:block!44=icon%:block!48=mousex%:block!52=mousey%
48510block!56=10000:REM Estimated size of data???
48520block!60=EVAL("&"+type$):REM File type
48530$(block+64)=FNleafname(path$)+CHR$0
48540SYS "Wimp_SendMessage",17,block+20,handle%,icon%
48550ENDPROC
48560
48570DEF FNname(indx)
48580LOCAL f$,g$,p,i
48590
48600WHILE ?indx<>0
48610f$+=CHR$(?indx):indx+=1
48620ENDWHILE
48630=f$
48640
48650DEF FNleafname(f$)
48660p=1
48670REPEAT
48680i=INSTR(f$,"."):IF i<>0 p=i+1:MID$(f$,i,1)="#"
48690UNTIL i=0
48700f$=MID$(f$,p)
48710=f$
48720
48730DEF FNtick_objected
48740flags%=VAL(FNgeticondata(objhandle,8))
48750FOR fl%=7 TO 0 STEP -1
48760 flag%=flags% DIV 2^fl%
48770 flags%=flags% MOD 2^fl%
48780 ptr=(m_objflag+28+(7-fl%)*24)
48790 IF flag%=1 THEN
48800 ?ptr=?ptr OR 1
48810 ELSE ?ptr=?ptr AND %11111110
48820 ENDIF
48830NEXT fl%
48840=0
48850
48860DEF FNtick_message
48870 ptr=0
48880 FOR I%=1 TO maxsw%
48890 $(swdata%+ptr)=STR$(switch_vals(I%))
48900 ptr+=12
48910 IF I%>switch_vals(0) THEN
48920 ?(m_switch%+28+24*I%)=(?(m_switch%+28+24*I%) AND &FE)
48930 ELSE
48940 ?(m_switch%+28+24*I%)=(?(m_switch%+28+24*I%) OR 1)
48950 ENDIF
48960 NEXT
48970REM $(m_text%+5)=STR$(mptr) - Not needed now msg# is in window title bar
48980 IF switch_vals(0)<>0 THEN ?(m_switch%+28)=(?(m_switch%+28) AND &FE) ELSE ?(m_switch%+28)=(?(m_switch%+28) OR 1)
48990 IF overwrite THEN
49000 ?(m_text%+28+24)=?(m_text%+28+24) OR 1
49010 ?(m_text%+28)=?(m_text%+28) AND &FE
49020 ELSE
49030 ?(m_text%+28+24)=?(m_text%+28+24) AND &FE
49040 ?(m_text%+28)=?(m_text%+28) OR 1
49050 ENDIF
49060=0
49070
49080DEF FNtick_program
49090 IF overwrite THEN
49100 ?(m_prog%+28+24)=?(m_prog%+28+24) OR 1
49110 ?(m_prog%+28)=?(m_prog%+28) AND &FE
49120 ELSE
49130 ?(m_prog%+28+24)=?(m_prog%+28+24) AND &FE
49140 ?(m_prog%+28)=?(m_prog%+28) OR 1
49150 ENDIF
49160 IF (listoption AND %10)<>0 THEN
49170 ?(m_listopts+28+24)=?(m_listopts+28+24) OR 1
49180 ?(m_listopts+28)=?(m_listopts+28) AND &FE
49190 ELSE
49200 ?(m_listopts+28+24)=?(m_listopts+28+24) AND &FE
49210 ?(m_listopts+28)=?(m_listopts+28) OR 1
49220 ENDIF
49230=0
49240
49250DEF FNtick_vocab
49260 IF overwrite THEN
49270 ?(m_vocab%+28+24)=?(m_vocab%+28+24) OR 1
49280 ?(m_vocab%+28)=?(m_vocab%+28) AND &FE
49290 ELSE
49300 ?(m_vocab%+28+24)=?(m_vocab%+28+24) AND &FE
49310 ?(m_vocab%+28)=?(m_vocab%+28) OR 1
49320 ENDIF
49330 FOR I%=1 TO 7
49340 IF I%=voc_sect% THEN
49350 ?(m_vocab%+28+24*(I%+4))=?(m_vocab%+28+24*(I%+4)) OR 1
49360 ELSE
49370 ?(m_vocab%+28+24*(I%+4))=?(m_vocab%+28+24*(I%+4)) AND &FE
49380 ENDIF
49390 NEXT I%
49400=0
49410
49420
49430DEF FNtick_
49440=0
49450
49460
49470DEF FNtick_roomedit
49480REM First set the 'tick' bits for each menu item
49490flags%=VAL(FNgeticondata(roomhandle,34))
49500FOR fl%=7 TO 0 STEP -1
49510 flag%=flags% DIV 2^fl%
49520 flags%=flags% MOD 2^fl%
49530 ptr=(m_rmflag+28+(7-fl%)*24)
49540 IF flag%=1 THEN
49550 ?ptr=?ptr OR 1
49560 ELSE ?ptr=?ptr AND %11111110
49570 ENDIF
49580NEXT fl%
49590=0
49600
49610
49620DEF FNtick_exitedit
49630REM First set the 'tick' bits for each menu item
49640flags%=?(rdata%+rptr*r_len+oldrmicon%)
49650FOR fl%=7 TO 0 STEP -1
49660 flag%=flags% DIV 2^fl%
49670 flags%=flags% MOD 2^fl%
49680 ptr=(m_exitf+28+(7-fl%)*24)
49690 IF flag%=1 THEN
49700 ?ptr=?ptr OR 1
49710 ELSE ?ptr=?ptr AND %11111110
49720 ENDIF
49730NEXT fl%
49740=0
49750
49760
49770DEF FNbutton_misc
49780icon%(THEmiscicon)=-1
49790=0
49800
49810
49820DEF FNtick_misc
49830 ptr=(miscmenu+28+48)
49840 IF datavalid THEN
49850 ?ptr = ?ptr OR 1
49860 ELSE
49870 ?ptr = ?ptr AND %11111110
49880 ENDIF
49890=0
49900
49910
49920DEF PROChelp(w,h,b)
49930LOCAL help$
49940CASE w OF
49950WHEN -2:help$="This is the ALPS icon.|MClick SELECT to choose an editor.|MClick MENU to quit.|MDrag an 'Alps' file icon to the ALPS icon to load it."
49960WHEN ALPSmain
49970help$="Click SELECT to open the "
49980CASE h OF
49990WHEN 0:help$="Click SELECT to Save files or Set up a disk for use with ALPS."
50000WHEN 1:help$="Click SELECT to display the ALPS variables and status."
50010WHEN 2:help$+="Room Editor and enter your map details.|MClick MENU Print the room data or Import BBC room data."
50020WHEN 3:help$+="Object Editor and enter your object details.|MClick MENU to Print the objects data or Import BBC objects data."
50030WHEN 4:help$+="Message Editor.|MClick MENU to Print the messages or Import BBC messages."
50040WHEN 5:help$="This is the Alpine Software logo. It has no effect."
50050WHEN 6:help$+="Program Editor and enter the game's logic.|MClick MENU to Print the program, Import a BBC program or Run the game."
50060WHEN 7:help$+="Character Designer.|MDouble-click a 'BBC font' file to Load a character set.|MCurrent character set is saved with your game."
50070WHEN 8:help$+="Vocabulary Editor and enter nouns, verbs, adjectives etc.|MClick MENU to Print the vocabulary."
50080WHEN 9:help$="Click SELECT to swap the original data in the editors with the data values obtained during a run of the game.|MA "+CHR$128+" indicates data is original. An X indicates post-run data."
50090WHEN 10:help$+="Picture Editor and edit the picture filenames.|MClick MENU to Print the Picture list."
50100OTHERWISE help$="Click SELECT to choose an editor.|MTo load an 'Alps' file, drag its icon to this window."
50110ENDCASE
50120WHEN roomhandle
50130help$="Click SELECT to "
50140CASE h OF
50150 WHEN 1:help$+="edit the room's flags."
50160 WHEN 5:help$+="display the first room's data."
50170 WHEN 6:help$+="display the last room's data."
50180 WHEN 7:help$+="display the next room's data."
50190 WHEN 8:help$+="display the previous room's data."
50200 WHEN 9:help$+="move forward 10 rooms."
50210 WHEN 10:help$+="move back 10 rooms."
50220 WHEN 11:help$+="enter the displayed data."
50230 WHEN 12:help$+="make this the last room."
50240 WHEN 54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69:help$="Click MENU to edit the exit flags."
50250 OTHERWISE help$=""
50260ENDCASE
50270WHEN objhandle
50280 help$="Click SELECT to "
50290 CASE h OF
50300 WHEN 0:help$+="edit the object's flags."
50310 WHEN 5:help$+="display the first object's data."
50320 WHEN 6:help$+="display the last object's data."
50330 WHEN 27:help$+="display the next object's data."
50340 WHEN 16:help$+="display the previous object's data."
50350 WHEN 20:help$+="move forward 10 objects."
50360 WHEN 21:help$+="move back 10 objects."
50370 WHEN 17:help$+="enter the displayed data."
50380 WHEN 22:help$+="make this the last object."
50390 WHEN 26:help$+="create a container."
50400 OTHERWISE help$=""
50410 ENDCASE
50420WHEN texthandle
50430help$="Click SELECT to position the caret.|M"
50431IF text_owner$<>"pix" help$+="Click MENU to pop up a menu.|MClick ADJUST or press F9 to insert a marker."
50440WHEN design
50450help$="Click SELECT to "
50460CASE TRUE OF
50470 WHEN h=66:help$+="display next character."
50480 WHEN h=67:help$+="display previous character."
50490 WHEN h=68:help$+="choose a different character."
50500 WHEN h=64:help$="This shows the character actual size."
50510 WHEN (h>=0 AND h<64):help$+="toggle this block."
50520 OTHERWISE help$="This is the Character Designer."
50530ENDCASE
50540ENDCASE
50550b!16=&503:REM Send a message
50560b!12=ref%
50570$(b+20)=help$
50580b!0=(((20+LEN(help$)+1)DIV4)*4)+4
50590$(b+21+LEN(help$))=CHR$(0)
50600SYS "Wimp_SendMessage",17,b
50610ENDPROC
50620
50630DEF PROCreadPalette
50640FOR col=0 TO 15
50650PROCreadpal(col,16)
50660rgb(col,1)=r%:rgb(col,2)=g%:rgb(col,3)=b%
50670NEXT
50680PROCreadpal(16,24)
50690rgb(16,1)=r%:rgb(16,2)=g%:rgb(16,3)=b%
50700FOR col=17 TO 19
50710PROCreadpal(col-16,25)
50720rgb(col,1)=r%:rgb(col,2)=g%:rgb(col,3)=b%
50730NEXT
50740ENDPROC
50750
50760DEF PROCreadpal(l%,p%)
50770REM Read the rgb values for logical/physical colour l%,p%
50780SYS ReadPal,l%,p% TO R0,R1,palette%
50790r%=(palette%>> 8)AND&FF
50800g%=(palette%>>16)AND&FF
50810b%=(palette%>>24)AND&FF
50820ENDPROC
� >$.!ALPS.!RunImage
2� � Alpine Software/Philip Hawthorne 1989,1990
*� With modifications by Keith McAlpine
( version$="5.09A, 3-Mar-1991"
2
<4� block &200,block2 &200,mistake 300,quitblk 100
F
P-� � � 0:� �$:� ":";�:ș"Wimp_CloseDown":�
Z
d@%=&10:ctr%=0
nmode%=�
x
testing=�
�Aresources_ok=�OS_Var("Alps$Resources") � �OS_Var("Alps$Data")
�
�ș "OS_GetEnv" � Env$
�I%=�Env$,�34,�Env$,�34)+1)
�ef$=�Env$,I%+1)
�ȕ �ef$,1)=" "
�ef$=�ef$,2)
��
�
�theLastMenu = 0 : tick$=""
�
�type$="CF8"
�
� tempBlk 4
$tempBlk = "TASK"
5ș "Wimp_Initialise",200,!tempBlk,"ALPS" � ,task%
"
,�� � resources_ok � � 1,"The ALPS resources are not available. Open up the directory viewer with !ALPS in it.":ș "Wimp_CloseDown",task%,!tempBlk:�
6�install_texted
@
�init2
J+� � dialog=�errorbox(�$,�,1,-99):� �dtA
T�new
^�assemble(armcode%)
h0�fill(text_block%,text_blocksize%,dummy_spc)
r#�fill(verb_type,2*(maxvbn+1),0)
|�fill(nref+4,nref_size-4,0)
��fill(aref+4,aref_size-4,0)
�
�clear
�'claimpoll$="":claimmenu$="":quit%=�
�
�
path$=ef$
�� ef$<>"" �
�$filename%=�leafname(ef$)
��load_all(ef$)
�#�open(ALPSmain,400,800,600,600)
��
�
��
�ș Poll,,block � reason
Ȏ reason �
� 1: �redraw(!block)
� 2: ș OpenW,,block
& � 3: �close(!block)
0H � 6: �checkmouse(!block,block!4,block!8,block!12,block!16,block!20)
:E � 7: �save:� User has dragged 'Alps' file icon to another window
D2 � 8: �userkeypressed(!block,block!4,block!24)
N% � 9: �menuselect(!block,block!4)
X � 17,18: �receive(block)
b �
l� quit%
vNș "Wimp_CloseDown",task%,!tempBlk:� testing � �("FX4"):�:�" at line ";�:�
��
�
�� �init2
�!�getmodeinfo:oldsize=scrnsize
�data_saved=�:loaded$=""
�� a_list$(10)
�small_areasize%=30
�!� small_area% small_areasize%
�
�(� D%(3),shade%(15),scale 15,pixtr 15
�'� ---------------------------------
�'� Manifest constants for the system
�
2maxrms=1000:maxobs=255:maxsw%=10:maxtokens=128
listoption=2:� Default LISTO
*
� pos$(3)
4� I%=0 � 3:� pos$(I%):�
>
� T,B,L,R
H
R� oldpars 73
\� I%=0 � 72
f� B%:oldpars?I%=B% � &F
p�
z
�� 0,0,0,0,0,1,161,193
�� 161,193,2,1,0,128,128,0
�� 128,0,0,128,0,1,1,1
�� 1,65,1,0,0,0,65,0
�%� 130,194,130,194,193,193,129,129
�#� 193,193,131,195,1,130,128,128
�� 2,2,66,0,1,66,3,67
�� 0,1,1,65,65,65,3,0
�� 1,1,130,130,130,2,130,2
�� 2
�
�1maxlen=10:� Maximum word length in vocabulary
�
3� Room and object data block lengths (in bytes)
r_len=74:o_len=16
$*num_vars=60:� Number of ALPS variables
..var_size=num_vars*2:� 2 bytes per variable
8
B5maxmsg=65535:maxobn=255:maxvbn=255:maxconst=65535
LEmaxadj=255:maxprep=50:maxconj=10:maxspec=30:maxnoise=50:maxpix=50
V
`noun_size=3000
jverb_size=3000
tadjc_size=2000
~-prep_size=400:� Size of prepositions list
�,conj_size=50:� size of conjunctions list
�;spec_size=100:� size of 'specials' list (IT, THEM, ALL)
�4noise_size=200:� size of 'noise' list (THE,A,AN)
�=aref_size=2000:� size of adjective object reference table
�9nref_size=2000:� size of nouns object reference table
�-pix_size=1000:� size of pix filename list
�
Ά� nouns noun_size,verbs verb_size,adjects adjc_size,preps prep_size,conjs conj_size,specs spec_size,noise noise_size,pixs pix_size
�
�:� aref aref_size,nref nref_size,verb_type 2*(maxvbn+1)
�
�5noun_end=nouns+noun_size:verb_end=verbs+verb_size
�adjc_end=adjects+adjc_size:prep_end=preps+prep_size:conj_end=conjs+conj_size:spec_end=specs+spec_size:noise_end=noise+noise_size
Iaref_end=aref+aref_size:nref_end=nref+nref_size:pix_end=pixs+pix_size
� Printer codes etc
(condensed=15:reset=64
2pline$=�132,"-")
<pline2$=�79,"-")
F
PK� ------- Set up data areas for rooms and objects and clear them ------
ZB� rdata% (maxrms+1)*r_len,odata% (maxobs+1)*o_len,controom% 12
d
n� Set up the save buffers
x+initareasize=7*(maxobs+1)+22*(maxrms+1)
�=� initsave initareasize,ramsave initareasize+var_size+128
�*$controom%="0":cont_room=0:container=�
�
�+rptr=1:optr=1:last_room=1:last_object=1
�
�&� areas to store flag descriptions
�maxd%=13
�'� o_flags% maxd%*8,r_flags% maxd%*8
�
�� Set the flag descriptions
�� I%=7 � 0 �-1
�� flag$
�($(o_flags%+I%*maxd%)=�flag$,maxd%-1)
�
� I%=7 � 0 �-1
"� flag$
,($(r_flags%+I%*maxd%)=�flag$,maxd%-1)
6�
@
J� Object Flag descriptions
TG� "","",Being worn,Wearable,Scenery,Invisible,Takeable,Light source
^
h� Room flag descriptions
r%� "","","","","","",Visited,Light
|
�!� Room Exit flag descriptions
�X� Invisible,Closed door,Open door,Locked door,Unl'ked door,Blocked,Reserved,Reserved
�
�� exit_flag$(7)
�)� flag=7 � 0 �-1:� exit_flag$(flag):�
�
�� proc% 12,exit% 12,def% 12
� $proc%="":$def%="":$exit%=""
�
�8� prg_sel% = Section of program selected for editing
�1� 2=Main, 3=Proc, 4=Define, 5=Exit
�K� progval$ = STR$ value of proc or exit number or name of selected verb
�
prg_sel%=2:progval$=""
<� voc_sect% = Section of vocabulary selected for editing
&"� 1=Nouns, 2=Verbs
0voc_sect%=1
:
D� voc$(8),prog$(6)
N[voc$()="","Nouns","Verbs","Adjectives","Prepositions","Conjunctions","Specials","Noise"
X4prog$()="","","Main","Procedure","Define","Exit"
b
l6pbsize=(scrnsize � 2)+400:� size of picture buffer
vF� pbsize<25*1024 � pbsize=25*1024:� Ensure at least 25k - 12.04.90
�
�� picbuf pbsize
�
�prgbsize=&1000
�� prgbuf% prgbsize
�
�?� ------- Some constants for the character designer -------
�
�cur_chr%=�"A":max_chr%=125
�� charnum 12
�$charnum=""
�
�7� ------- Dimension the other arrays needed -------
ucsize=500
Dș "OS_File",5,"<ALPS$Resources>.ASIobjcode" � ftype,,,,codesize
pbyte_size=148
F� armcode% 1000,pbytes pbyte_size,work% &1100,asicode% codesize+10
*� usercode% ucsize
4Lrun=asicode%:printmsg=asicode%+4:search=asicode%+12:findcode=asicode%+16
>setup=asicode%+20
H5�("LOAD <ALPS$Resources>.ASIobjcode "+�~asicode%)
R
� pal%(2)
\� q% &2000,erroraddr%(4)
f� indexdata% 32*24+20
pmaxbuf%=&3000
z&� buffer% maxbuf%:curbuff%=buffer%
�nh%=32:ni%=11
�,� handle%(nh%+1),wident$(nh%),wptr%(nh%)
�>� I%=0�nh%:handle%(I%)=I%-1:wident$(I%)="":�:handleSP%=nh%
� � icon%(ni%+1),iconbar$(ni%)
�.� I%=0 � ni%:icon%(I%)=-1:� iconbar$(I%):�
�icon%(ni%+1)=-1
�oldicon%=0:oldrmicon%=0
�
�8� ------ Names of icons (sprites) on icon bar ------
�L� disk35,arclogo,door,key,quill,info,listing,chardes,vocab,swap,eye,face
�
�0diskicon=0:texticon=4:progicon=6:staricon=99
�0vocabicon=8:faceicon=99:arcicon=1:swapicon=9
%alpsicon=5:helpicon=13:eyeicon=10
7THEkeyicon=3:THEdooricon=2:texticon=4:THEcharicon=7
$.� menufree% &1800:menuend%=menufree%+&1800
.� menulist% &100
8� qBlk% 256
B+dx%=2:lsY%=40:ypixel%=4:chX%=16:chY%=32
L%currentwindow%=-1:currenticon%=-1
Vspritef$=""
`9� mb_wident% 12,filename% 64,filename2% 64,import% 64
j6� testing $filename%="demo" � $filename%="starter"
t%$filename2%="charset":$import%=""
~(� start(20),sys_b2% &300,os_block 50
�
��KeyWordRead
��ErrorMsgRead
�
�9� ----- Define the "Wimp" and "OS" SYS numbers ------
�Wimp=&400C0
�CreateW=Wimp+1
�CreateI=Wimp+2
�DeleteW=Wimp+3
�DeleteI=Wimp+4
�OpenW=Wimp+5
�CloseW=Wimp+6
Poll=Wimp+7
RedrawW=Wimp+8
UpdateW=Wimp+9
GetW=Wimp+11
(GetWI=Wimp+&C
2SetCaret=Wimp+&12
<GetCaret=Wimp+&13
FGetR=Wimp+&A
PSetI=Wimp+&D
ZGetI=Wimp+&E
dGetP=Wimp+&F
nDrag=Wimp+&10
xForceR=Wimp+&11
�CreateM=Wimp+&14
�SetP=Wimp+&18
�GetOutline=Wimp+&E0
�ReadPal=&2F
�
�F� ------ Set up our own sprite area and read the sprites in ------
�Aș "OS_File",5,"<ALPS$Resources>.AlpsSprite" � ,,,,spritesize
�spritesize+=4
�� spritearea% spritesize
�!spritearea%=spritesize
�Bș "OS_SpriteOp",266,spritearea%,"<Alps$Resources>.AlpsSprite"
�#� fontcounts% 255,mb_wident% 24
�
6� ------ Set up the wimps and their handles ------
�rgb(19,3)
"+�loadtemplates("<Alps$Resources>.ALPS")
,
6+� ------ Name the window handles ------
@.objhandle=handle%(�matchident("objected"))
J/roomhandle=handle%(�matchident("roomedit"))
T-texthandle=handle%(�matchident("texted"))
^,design=handle%(�matchident("chrdesign"))
h+infohandle=handle%(�matchident("info"))
r-savehandle=handle%(�matchident("saveas"))
|8ALPSmain=handle%(�matchident("iconbar")):dialogue%=0
�(setuph=handle%(�matchident("Setup"))
�desticon=47:exitprogicon=48
�
�iconbar% = -2
�windowindex%=nh%+1
�
�,�changeicon(infohandle,7,version$,dummy)
�
�;firstIconBarIcon% = �iconbar(spritearea%, "face",31,19)
�!THEmiscicon=firstIconBarIcon%
�
�
�&� ------ Define the colours ------
barfgcol=11:barbgcol=3
'`wbcol=0:`tbcol=2:`sco=&3:`mbcol=&B
(`wfcol=7:`tfcol=7:`sci=&D:`tbcol2=&C
&
0cur_pal%=7:phys_col%=16
:
D0first_token=&30:� Lowest keyword token value
NW�find_token(keyword$(),"INC",var_token,dummy):� Tokens from here up allow variables
X4�find_token(keyword$(),"DEFINE",def_token,dummy)
b3�find_token(keyword$(),"STOP",stop_token,dummy)
l1�find_token(keyword$(),"END",end_token,dummy)
v3�find_token(keyword$(),"EXIT",exit_token,dummy)
�6�find_token(keyword$(),"DEFPROC",proc_token,dummy)
�3�find_token(keyword$(),"PREP",prep_token,dummy)
�9�find_token(keyword$(),"NOTPREP",notprep_token,dummy)
�
�)� ------ Set up the dictionary ------
�dict_size=1000
�%� dict% dict_size,tok$(maxtokens)
�!dict%=3:dict%?2=&80
�
�-� ------ Find the available memory ------
�memfree=(�-�)-50000
�l� memfree<0 � null=�errorbox("Not enough memory available in 'Next' slot",0,1,-99):ș "Wimp_CloseDown":�
�maxtext%=0.83*memfree
code_size%=0.17*memfree
@� ------ Areas for storing messages, switch info etc; ------
D� text% maxtext%,swdata% 12*maxsw%,switch_vals(maxsw%),m_msg% 12
*� switch_buf% 2*maxsw%+1
4'$swdata%=�12*maxsw%,�13):$m_msg%=""
>
H,� ------ Initialise the text area ------
R,!text%=1:text%!2=&B:text%!6=0:text%!10=0
\� st_msg% 12,end_msg% 12
f$st_msg%="1":$end_msg%="1"
p'mptr=1:� The current message number
zEtext_owner$="":� The current owner of any text in the text editor
�
�datavalid=�
�
�+� ------ Set up the program area ------
�� program% code_size%
�!program%=0
�program%!4=0
�
errflag=�
�
�-� ------ Set up the menu structure ------
�m_controom%=�crmenu
�� "#Number,$controom%(5)"
�m_contain=�crmenu
&� "Container,Use room>m_controom%"
m_chardes%=�crmenu
� "#CHANGE TO?,$charnum(2)"
$char_fname%=�crmenu
."� "#Filename:,$filename2%(11)"
8menu_fname%=�crmenu
B!� "#Filename:,$filename%(11)"
Lm_gotomsg%=�crmenu
V� "$m_msg%(12)"
`m_proc%=�crmenu
j� "#Number:,$proc%(4)"
tm_def%=�crmenu
~� "#Verb:,$def%(12)"
�m_exit%=�crmenu
�� "#Number:,$exit%(4)"
�m_listopts=�crmenu
�=� "#Display:,Vocabulary as numbers,Vocabulary as strings"
�m_import%=�crmenu
�� "#Filename:,$import%(11)"
� sw1=�crmenu:nxtsw=swdata%+12
�� "#Value:,$swdata%(12)"
�sw2=�crmenu:nxtsw=nxtsw+12
�� "#Value:,$nxtsw"
�sw3=�crmenu:nxtsw=nxtsw+12
�� "#Value:,$nxtsw"
sw4=�crmenu:nxtsw=nxtsw+12
� "#Value:,$nxtsw"
sw5=�crmenu:nxtsw=nxtsw+12
� "#Value:,$nxtsw"
(sw6=�crmenu:nxtsw=nxtsw+12
2� "#Value:,$nxtsw"
<sw7=�crmenu:nxtsw=nxtsw+12
F� "#Value:,$nxtsw"
Psw8=�crmenu:nxtsw=nxtsw+12
Z� "#Value:,$nxtsw"
dsw9=�crmenu:nxtsw=nxtsw+12
n� "#Value:,$nxtsw"
xsw10=�crmenu:nxtsw=nxtsw+12
�� "#Value:,$nxtsw"
�m_switch%=�crmenu
�Y� "#Switch,No switches,1>sw1,2>sw2,3>sw3,4>sw4,5>sw5,6>sw6,7>sw7,8>sw8,9>sw9,10>sw10"
�m_text%=�crmenu
��� "#MESSAGE,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Previous (f5),Next (f6),First (f7),Last (f8),Goto msg#>m_gotomsg%,Edit switch#>m_switch%,Print this"
�m_prog%=�crmenu
��� "#Program Editor,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Main,Procedure>m_proc%,Define>m_def%,Exit routine#>m_exit%,Print this,List options>m_listopts"
�m_vocab%=�crmenu
Ҟ� "#Vocabulary,Insert,Overtype#,Cut (Ctrl-X),Copy (Ctrl-C),Paste (Ctrl-V)#,Nouns,Verbs,Adjectives,Prepositions,Conjunctions,Specials,Noise#,Print this"
�pixmenu=�crmenu
�� "#Pictures,Print"
�progmenu=�crmenu
�,� "#Program,Print,Import#>m_import%,Run"
charmenu=�crmenu
2� "#CharSet,Save>char_fname%,Load>char_fname%"
vocabmenu=�crmenu
"� "#Vocabulary,Print"
,diskmenu=�crmenu
6-� "#Files,Save all>savehandle,Setup disk"
@facemenu=�crmenu
J� "#Actors,Print"
Tmiscmenu=�crmenu
^"� "#ALPS,Info>infohandle,Quit"
hmsg2%=�crmenu
r� "$st_msg%(6)"
|msg3%=�crmenu
�� "$end_msg%(6)"
�msg1%=�crmenu
�/� "#From/To?,Start msg>msg2%,End msg>msg3%"
�textmenu=�crmenu
�*� "#Text,Print>msg1%,Import>m_import%"
�objmenu=�crmenu
�'� "#Objects,Print,Import>m_import%"
�*mo_user5=�crmenu:ofl%=o_flags%+maxd%*3
�#� "#Description:,$o_flags%(13)"
�$mo_user4=�crmenu:ofl%=ofl%+maxd%
�� "#Description:,$ofl%(13)"
�$mo_user3=�crmenu:ofl%=ofl%+maxd%
�� "#Description:,$ofl%(13)"
$mo_user2=�crmenu:ofl%=ofl%+maxd%
� "#Description:,$ofl%(13)"
$mo_user1=�crmenu:ofl%=ofl%+maxd%
&� "#Description:,$ofl%(13)"
0$mo_user0=�crmenu:ofl%=ofl%+maxd%
:� "#Description:,$ofl%(13)"
Dm_objflag=�crmenu
N�� "#Flags,7 Light source,6 Takeable,5 Invisible,4 Scenery,3 Wearable,2 Being worn,1 User flag>mo_user1,0 User flag>mo_user0"
Xroommenu=�crmenu
b%� "#Rooms,Print,Import>m_import%"
l*mr_user6=�crmenu:rfl%=r_flags%+maxd%*2
v#� "#Description:,$r_flags%(13)"
�$mr_user5=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�$mr_user4=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�$mr_user3=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�$mr_user2=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�$mr_user1=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�$mr_user0=�crmenu:rfl%=rfl%+maxd%
�� "#Description:,$rfl%(13)"
�m_rmflag=�crmenu
�� "#Flags,7 Light,6 Visited,5 User (Trans)>mr_user5,4 User (Open)>mr_user4,3 User flag>mr_user3,2 User flag>mr_user2,1 User flag>mr_user1,0 User flag>mr_user0"
m_exitf=�crmenu
|� "#Flags,7 Invisible exit,6 Closed door,5 Open door,4 Locked door,3 Unlocked door,2 Blocked exit,1 Reserved,0 Reserved"
*�
4
>>� ------ Now we have the Procedures and Functions!! ------
H
R� �getmodeinfo
\� x,y,xeig,yeig,cols
f
mode=�
p
z1ș "OS_ReadModeVariable",mode,1 � ,,textcols%
�1ș "OS_ReadModeVariable",mode,2 � ,,textrows%
�text_maxllen%=textcols%-2
�,ș "OS_ReadModeVariable",mode,3 � ,,cols
�,ș "OS_ReadModeVariable",mode,4 � ,,xeig
�,ș "OS_ReadModeVariable",mode,5 � ,,yeig
�0ș "OS_ReadModeVariable",mode,7 � ,,scrnsize
�*ș "OS_ReadModeVariable",mode,11 � ,,x
�*ș "OS_ReadModeVariable",mode,12 � ,,y
�-scrw=((x+1)<<xeig)-1:scrh=((y+1)<<yeig)-1
��
�
�� �clear
�$�fill(odata%,(maxobs+1)*o_len,0)
$�fill(rdata%,(maxrms+1)*r_len,0)
%�fill(program%+4,code_size%-20,0)
'� PROCfill(initsave,initareasize,0)
$�
.
8
B� �return(x%,y%)
L�col(128+12):�col(7)
V>�centre(" Hit any key/button to return to the editor ",y%)
`�
jȗ X%,Y%,B%
t
� B%=0
~
��
�any=�(0)
�ȗ X%,Y%,B%
�� any>0 � B%>0
��
�
�� �centre(t$,r)
�#�(textcols%-� t$+1) � 2,r);t$;
��
�
�� �toUpper(text$)
�� I%,A$
�� I%=1 � � text$
� A$+=�(�(�text$,I%,1)) � &DF)
��
�=A$
�
�4� ------ General window handling routines ------
�
� �deletewindow(I%)
!q%=handle%(I%)
&handle%(I%)=handleSP%:handleSP%=I%
ș DeleteW,,q%
(wident$(I%)=""
2�
<
F� �loadtemplates(tfile$)
P
tmp%=0
Z"ș "Wimp_OpenTemplate",,tfile$
dtf_index%=0:�
n$mb_wident%="*"
xtș "Wimp_LoadTemplate",,q%+4,curbuff%,buffer%+maxbuf%,fontcounts%,mb_wident%,tf_index% � ,,curbuff%,,,,tf_index%
�+� tf_index%<>0 � �loadtemp($mb_wident%)
�� tf_index%=0
�ș "Wimp_CloseTemplate"
��
�
�� �loadtemp(wident$)
�8I%=�matchident(wident$):� I%<>-1 � �deletewindow(I%)
�-q%!68=spritearea% : � user sprite area
��crwindow(q%+4,wident$)
��
�
�� �highlight(I%)
��
-ș SetCaret,handle%(I%),-1,0,0,&2000000,0
�
"+� �retitle(handle%,newtitle$,� handle%)
,index%=windowindex%
6�
@1 index%-=1: �index%<0 � 255,"Invalid window"
J� handle%(index%)=handle%
T!q%=handle%
^ș GetWI,,q%
hș DeleteW,,q%
rflags%=q%!60
|M� (flags% � 256)=0 � $(q%+76)=�newtitle$,11) � $(!(q%+76))=�newtitle$,39)
�ș CreateW,,q%+4 � handle%
�handle%(index%)=handle%
��
�
�� �retitle_text(title$)
�!block=texthandle
�ș GetWI,,block
�$(!(block+76))=�title$,39)
�block!16+=36
�block!8=block!16 - 36
�2ș ForceR,-1,block!4,block!8,block!12,block!16
��
�
� �crwindow(q%,wident$)
ș CreateW,,q% � handle%
Am%=handleSP%:handleSP%=handle%(handleSP%):handle%(m%)=handle%
&!q%=handle%
0ș GetW,,q%
:)currentwindow%=m%:wident$(m%)=wident$
Dcurrenticon%=-1
N�highlight(m%)
X�
b
l� �close(wind)
vi%=ni%+1
�
Ȏ wind �
�? � objhandle:i%=THEkeyicon:� icon%(i%)<>-1 �store_obj(optr)
�C � roomhandle: i%=THEdooricon:� icon%(i%)<>-1 �store_room(rptr)
� � texthandle
� i%=texticon
� �remove_markers
� Ȏ text_owner$ �
� � "texted" : �store_msg
�0 � "program" : � � text_ok � �store_prog
�/ � "vocab" : � � text_ok � �store_vocab
� � "pix" : �store_pix
� �
� � � errflag �
4 text_owner$="":� release Text Editor window
5 �fill(text_block%,text_blocksize%,dummy_spc)
�
< � design: i%=THEcharicon:ș ForceR,-1,0,0,scrw+1,scrh+1
4�
>�� (text_owner$="program" � errflag � wind=texthandle) � (text_owner$="vocab" � errflag � wind=texthandle) � (text_owner$="pix" � errflag � wind=texthandle) � (text_owner$="texted" � errflag � wind=texthandle) �
H�
R icon%(i%)=-1
\ !block=wind
f ș CloseW,,block
p�
z�
�
�� �open(handle,x,y,w,d)
�!block=handle
�block!4=x:block!8=y-d
�block!12=x+w:block!16=y
�block!20=0:block!24=0
�block!28=-1
�ș OpenW,,block
��
�
�� �redraw(handle)
�block!0=handle
�ș RedrawW,0,block � more%
�info(block+4)
/� handle=texthandle � dummy=�redraw_text(�)
�
$
.� �forceR(handle)
8/� Force the given window ONLY to be redrawn
B�getw(handle)
L<ș ForceR,handle,scx%,scy%-(y1%-y0%),scx%+(x1%-x0%),scy%
V�
`
j� �matchident(A$)
t� A$="" � =-1
~� I%
�*I%=nh%+1:�I%=I%-1:�A$=wident$(I%)�I%=0
��A$=wident$(I%)�=I%�=-1
�
�� �getw(handle%)
�� handle%=iconbar% �
�!!block=handle%:șGetW,0,block
�4�info(block+4):bhandle%=block!28:flags%=block!32
�ontop=flags% � &20000
��
�
�� �info(b)
�7x0%=!b:y0%=b!4:x1%=b!8:y1%=b!12:scx%=b!16:scy%=b!20
bx%=x0%-scx%:by%=y1%-scy%
/gwxl%=b!24:gwyb%=b!28:gwxr%=b!32:gwyt%=b!36
�
(� �getpointer
2șGetP,0,block
<Zmousex%=!block:mousey%=block!4:b%=block!8:handle%=block!12:icon%=block!16:ob%=block!20
F�
P
ZF� �sys_claiminputfocus(window%,icon%,xofst%,yofst%,height%,index%)
d:șSetCaret, window%,icon%,xofst%,yofst%,height%,index%
n�
x
�R� �sys_getcaretposition(� window%,� icon%,� xofst%,� yofst%,� height%,� indx%)
�șGetCaret,0,b
�dwindow%=!block: icon%=block!4: xofst%=block!8: yofst%=block!12: height%=block!16: indx%=block!20
��
�
�� �cursor(x%,y%)
�^�sys_claiminputfocus(texthandle,-1,(x%-1)*chX%,-y%*lsY%-9*ypixel%,&1000000 �10*ypixel%,-1)
��
�
�� �text_menubox
�Ȏ text_owner$ �
�� "texted"
� tick$="message"
null = �tick_message
B ș CreateM,0,m_text%,mousex%-64,mousey%:claimmenu$="message"
theLastMenu = m_text%
"
,� "program"
6 tick$="program"
@ null = �tick_program
JB ș CreateM,0,m_prog%,mousex%-64,mousey%:claimmenu$="program"
T theLastMenu = m_prog%
^
h
� "vocab"
r tick$="vocab"
| null = �tick_vocab
�A ș CreateM,0,m_vocab%,mousex%-64,mousey%:claimmenu$="vocab"
� theLastMenu = m_vocab%
�
��
�
��
�
�<� �checkmouse(mousex%,mousey%,button%,handle%,icon%,ob%)
��handle%=-1 � �
��getw(handle%)
��handle%=ALPSmain �
� �icon%<>-1 �
�#� icon% -= firstIconBarIcon%
Ȏ� �
0 �(button%�1)=1 : � adjust does nothing
< �(button%�2)=2 : void=�("FNmenu_"+iconbar$(icon%))
&) �(button%�4)=4 : �openup(icon%)
0 �
: �
D�
N � handle%=iconbar% �
X � The RISC OS icon bar
b Ȏ � �
l) � (button%�2)=2 : void=�menu_misc
v � (button%�4)=4
�C � icon%=firstIconBarIcon% � �open(ALPSmain,400,800,600,600)
� �
� �
� index%=windowindex%
�
�
�5 index%-=1: �index%<0 � 255,"Invalid window"
�" � handle%(index%)=handle%
�+ void=�("FNbutton_"+wident$(index%))
� �
��
��
�
�)� �userkeypressed(handle%,icon%,key%)
�getw(handle%)
�index%
index%=windowindex%
�
*index%-=1: �index%<0 � �
4�handle%(index%)=handle%
>)void=�("FNkeypress_"+wident$(index%))
H�
R
\ � �menuselect(item0%,item1%)
f#ș "Wimp_GetPointerInfo",,block
pbuTTon = block!8
z&void=�("FNmenuselect_"+claimmenu$)
�� buTTon=1 �
�: � *** ADJUST pressed so keep the menu structure ***
� null = �("FNtick_"+tick$)
�# ș CreateM,0,theLastMenu,0,0
��
� claimmenu$=""
��
��
�
�*� �update(handle%,ux0%,uy0%,ux1%,uy1%)
�H!block=handle%:block!4=ux0%:block!8=uy0%:block!12=ux1%:block!16=uy1%
�-ș UpdateW,0,block � more%:�info(block+4)
��
� �openup(icon%)
� icon%(icon%)=-1 �
$� � icon%<>diskicon � icon%<>texticon � icon%<>arcicon � icon%<>swapicon � icon%<>progicon � icon%<>vocabicon � icon%<>eyeicon � icon%(icon%)=icon%
. Ȏ icon% �
8 � diskicon:
B6 ș CreateM,0,diskmenu,mousex%-64,mousey%
L6 � loaded$<>"" � f$=path$ � f$="AlpsFile"
V/ �changeicon(savehandle,2,f$,void)
`? claimmenu$="disk35":theLastMenu=diskmenu:tick$=""
j � WHEN THEmiscicon:
t< � *********** do nothing for this icon *******
~ � texticon:
� � text_owner$="" �
�@ �retitle(texthandle,"MESSAGE "+�mptr,texthandle)
�1 �open(texthandle,0,1000,scrw,400)
�. text_owner$="texted":text_ok=�
� �show_msg(mptr)
� �
� � 7
� �
� � THEdooricon:
�E �open(handle%(�matchident("roomedit")),0,720,1280,1040)
�! �restore_room(rptr)
� � THEkeyicon:
E �open(handle%(�matchident("objected")),850,560,800,680)
�restore_obj(optr)
� progicon:
� text_owner$="" �
(X �retitle(texthandle,"PROGRAM: "+prog$(prg_sel%)+" "+progval$,texthandle)
21 �open(texthandle,0,1000,scrw,400)
</ text_owner$="program":text_ok=�
F( �list(prg_sel%,progval$)
P �
Z � 7
d �
n � THEcharicon:
xE �open(handle%(�matchident("chrdesign")),0,560,1280,860)
�$ �display_chr(cur_chr%)
�6 �changeicon(design,64,�(cur_chr%),dummy)
� � vocabicon:
� � text_owner$="" �
�N �retitle(texthandle,"VOCABULARY: "+voc$(voc_sect%),texthandle)
�1 �open(texthandle,0,1000,scrw,400)
�- text_owner$="vocab":text_ok=�
�& �list_vocab(voc_sect%)
� �
� � 7
� �
� � helpicon:
�? �open(handle%(�matchident("HELP")),0,500,960,400)
� eyeicon:
� text_owner$="" �
: �retitle(texthandle,"PICTURES",texthandle)
"1 �open(texthandle,0,1000,scrw,400)
,+ text_owner$="pix":text_ok=�
6 �list_pix
@ �
J � 7
T �
^) � arcicon:dummy=�keypress_status
h � swapicon
r- datavalid=� datavalid:� 7:�swap_data
| � datavalid �
�8 �changeicon(ALPSmain,swapicon,"swap",swapicon)
�
�
�: �changeicon(ALPSmain,swapicon,"swap_x",swapicon)
�
�
� �forceR(ALPSmain)
�
�
��
��
�
�
�J� ------ `button` routines to deal with clicks in given window ------
�
�� �button_texted
�mx%,my%
� button%<>2 �
�getpointer
&)mx%=(mousex%-bx%+chX%�4) �(�(chX%-1))
0-my%=(mousey%-by%) - ((mousey%-by%) �lsY%)
:text_col%=1+mx% �chX%
D$text_row%=-((mousey%-by%) �lsY%)
N-� text_row%>last_row% text_row%=last_row%
XK� text_col%>text_rowlen%(text_row%) text_col%=text_rowlen%(text_row%)+1
b� text_col%<1 text_col%=1
l�
v
�Ȏ button% �
�� 2
��text_menubox
�� 4
��locate_ptr
� �cursor(text_col%,text_row%)
�� 1
��insert_marker
��
�=0
�
�� �insert_marker
�� text_owner$<>"pix" �
!�locate_ptr
!
� mrk<2 �
!mark(mrk)=text_ptr%
! )col(mrk)=text_col%:row(mrk)=text_row%
!*asc(mrk)=?text_ptr%
!4/� asc(mrk)=13 � �23,dummy_cr � �23,chr(mrk)
!>?os_block=asc(mrk)
!Hș "OS_Word",&A,os_block
!R� R%=1 � 8
!\row_value=R%?os_block
!f� row_value � &FF
!p�
!z=� asc(mrk)=13 � ?text_ptr%=dummy_cr � ?text_ptr%=chr(mrk)
!�h�update(texthandle,chX%*(text_col%-1),-(text_row%+1)*lsY%,chX%*(text_col%-1)+chX%,-(text_row%)*lsY%)
!�dummy=�redraw_text(�)
!�
mrk+=1
!� �cursor(text_col%,text_row%)
!��
!��
!��
!�
!�� �locate_ptr
!�text_ptr%=text_block%
!�� text_row%>0 �
!� � R%=0 � text_row%-1
!�# text_ptr%+=text_rowlen%(R%)
"7 � text_rowlen%(R%)<text_maxllen% � text_ptr%+=1
" �
"�
"$text_ptr%+=text_col%-1
"./� text_ptr%>text_end% � text_ptr%=text_end%
"8�
"B
"L� �button_objected
"VȎ icon% �
"`� 0:
"j
"t2� First set the 'tick' bits for each menu item
"~null = �tick_objected
"�Cș CreateM,0,m_objflag,mousex%-64,mousey%:claimmenu$="objected"
"�tick$="objected"
"�theLastMenu = m_objflag
"�
"�� 5:�first_obj
"�� 6:�last_obj
"�� 27:�next_obj
"�� 16:�prev_obj
"�� 20:�fwd_obj(10)
"�� 21:�rewind_obj(10)
"�� 17
"��store_obj(optr)
# %optr=�(�geticondata(objhandle,7))
#
� optr<1 � optr=1
#� optr>maxobs � optr=maxobs
#�restore_obj(optr)
#(� 22:last_object=optr
#2 � 26:
#<Dș CreateM,0,m_contain,mousex%-64,mousey%:claimmenu$="container"
#Ftick$=""
#PtheLastMenu = m_contain
#Z
#d�
#n4� optr>last_object last_object=optr:data_saved=�
#x=0
#�
#�� �button_roomedit
#�Ȏ icon% �
#�� 1:
#�tick$="roomedit"
#�null = �tick_roomedit
#�Bș CreateM,0,m_rmflag,mousex%-64,mousey%:claimmenu$="roomedit"
#�theLastMenu = m_rmflag
#�
#�� 5:�first_room
#�� 6:�last_room
#�� 7:�next_room
#�� 8:�prev_room
$� 9:�fwd_room(10)
$� 10:�rewind_room(10)
$� 11
$"�store_room(rptr)
$,'rptr=�(�geticondata(roomhandle,33))
$6� rptr<1 � rptr=1
$@� rptr>maxrms � rptr=maxrms
$J�restore_room(rptr)
$T
$^� 12:last_room=rptr
$h�
$r0� rptr>last_room last_room=rptr:data_saved=�
$|
$�8� Now check for clicking menu on selected EXITR icon
$�
$�
Ȏ � �
$�
$�� icon%>53 � icon%<70
$�
$�oldrmicon%=icon%
$�null = �tick_exitedit
$�tick$="exitedit"
$�Aș CreateM,0,m_exitf,mousex%-64,mousey%:claimmenu$="exitedit"
$�theLastMenu = m_exitf
$�
$��
%=0
%
%� �button_chrdesign
%&
Ȏ � �
%0� icon%>=0 � icon%<64
%:) �set_icon(design,icon%,&50000000,0)
%D �write_chr(cur_chr%)
%N �set_icon(design,64,0,0)
%X� icon%=66
%b cur_chr%+=1
%l+ � cur_chr%>max_chr% cur_chr%=max_chr%
%v. �changeicon(design,64,�(cur_chr%),icon%)
%� �display_chr(cur_chr%)
%�� icon%=67
%� cur_chr%-=1
%� � cur_chr%<32 cur_chr%=32
%�. �changeicon(design,64,�(cur_chr%),icon%)
%� �display_chr(cur_chr%)
%�� icon%=68
%�D ș CreateM,0,m_chardes%,mousex%-64,mousey%:claimmenu$="chrdef"
%�' theLastMenu = m_chardes%:tick$=""
%��
%�=0
%�
%�
&� �button_info
&� icon%=5 �
&�close(infohandle)
& �
&*=0
&4
&>� �button_saveas
&HȎ icon% �
&R/� 0 : �save_all(�geticondata(savehandle,2))
&\� 1 : �getw(savehandle)
&f. dummy$=�geticondata(savehandle,1)
&p* block!4=5:block!8=block!8+bx%
&z" block!12=block!12+by%
&�" block!16=block!16+bx%
&�" block!20=block!20+by%
&�B block!24=0:block!28=0:block!32=scrw+1:block!36=scrh+1
&�% ș "Wimp_DragBox",,block
&��
&�=0
&�
&�� �button_Setup
&�Ȏ icon% �
&�� 0
&�C� 1:�create_dirs(�geticondata(setuph,2),�geticondata(setuph,5))
&��
&��close(setuph)
'ȗ ȓ 0,0,scrw,scrh
'=0
'
'$K� ------ `keypress` routines deal with pressing key `key%` in a window
'.
'8� �keypress_texted
'B
Ȏ � �
'L-� key%=13:�newline:data_saved=�:text_ok=�
'V^� (key%=&186 � text_owner$="texted"):�next_msg:�forceR(texthandle):text_row%=0:text_col%=1
'`^� (key%=&185 � text_owner$="texted"):�prev_msg:�forceR(texthandle):text_row%=0:text_col%=1
'j_� (key%=&187 � text_owner$="texted"):�first_msg:�forceR(texthandle):text_row%=0:text_col%=1
't^� (key%=&188 � text_owner$="texted"):�last_msg:�forceR(texthandle):text_row%=0:text_col%=1
'~>� key%=24:�cut(mark(0),mark(1),picbuf):�forceR(texthandle)
'�>� key%=3:�copy(mark(0),mark(1),picbuf):�forceR(texthandle)
'�:� key%=22:�paste(text_ptr%,picbuf):�forceR(texthandle)
'�1� key%=26:�remove_markers:�forceR(texthandle)
'�� key%=&189:�insert_marker
'�� key%=&18F:�up
'�� key%=&18E:�down
'�� key%=&18D:�right
'�)� key%=&18A:� I%=1 � tab_set:�right:�
'�(� key%=&19A:� I%=1 � tab_set:�left:�
'�� key%=&18C:�left
'�3� key%=&1AB:�delete_line:data_saved=�:text_ok=�
'�3� key%=&1ED:�insert_line:data_saved=�:text_ok=�
( � key%=&1AC:�left_end
(
� key%=&1AD:�right_end
(:� key%=&18B:�right:�delete_char:data_saved=�:text_ok=�
(%� key%=&1CD:overwrite=� overwrite
((2� key%=127:�delete_char:data_saved=�:text_ok=�
(2� (key%>31) � (key%<126)
(<<� overwrite � �overwrite_char(key%) � �insert_char(key%)
(Fdata_saved=�:text_ok=�
(P ș "Wimp_ProcessKey",key%
(Z�
(d
(n �cursor(text_col%,text_row%)
(x=0
(�
(�� �check_scroll_up
(��getw(texthandle)
(�Ty%= (text_row%+1)*lsY%
(�D� (y1%-Ty%)<(y0%+scy%) � block!24 =block!24-lsY%:ș OpenW,,block
(��
(�
(�� �check_scroll_down
(��getw(texthandle)
(�Tr%=-scy% � lsY%
(�?� text_row%-1<Tr% � block!24 =block!24+lsY%:ș OpenW,,block
(��
(�
)� �check_scroll_left
)�getw(texthandle)
)Rx%=(text_col%-1)*chX%
)"D� (x1%-Rx%)<(x0%-scx%) � block!20 =block!20+chX%:ș OpenW,,block
),�
)6
)@� �check_scroll_right
)J�getw(texthandle)
)TLe%=scx% � chX%
)^?� text_col%-1<Le% � block!20 =block!20-chX%:ș OpenW,,block
)h�
)r
)|� �keypress_saveas
)�Q� key%=13 � �save_all(�geticondata(savehandle,2)) � ș "Wimp_ProcessKey",key%
)�=0
)�
)�� �keypress_objected
)�� key%=13 � icon%=7 �
)� �store_obj(optr)
)�+ optr=�(�geticondata(objhandle,icon%))
)� � optr<1 � optr=1
)�! � optr>maxobs � optr=maxobs
)� �restore_obj(optr)
)��
)�
)�
Ȏ key% �
*$� 13,&18E:� Return or down arrow
*� icon%<15 �
* icon%+=1
*&�
*0
icon%=7
*:�
*D� &18F:� Up arrow
*N� icon%>7 �
*X icon%-=1
*b�
*l icon%=15
*v�
*� ș "Wimp_ProcessKey",key%
*��
*�Q�sys_claiminputfocus(objhandle,icon%,0,0,-1,�(�geticondata(objhandle,icon%)))
*�=0
*�
*�� �keypress_roomedit
*�
Ȏ key% �
*�� 13,&18E,&18F
*�
*�� key%=13 � icon%=33 �
*� �store_room(rptr)
*�, rptr=�(�geticondata(roomhandle,icon%))
*� � rptr<1 � rptr=1
+! � rptr>maxrms � rptr=maxrms
+ �restore_room(rptr)
+�
+
+*� key%=13 � key%=&18E �
+4
Ȏ � �
+>� icon%=37:newicon%=71
+H� icon%=71:newicon%=38
+R� icon%=69:newicon%=33
+\� icon%<37:newicon%=icon%+1
+f-� (icon%>37 � icon%<54):newicon%=icon%+16
+p-� (icon%>53 � icon%<69):newicon%=icon%-15
+z�
+��
+�
+�� key%=&18F �
+�
Ȏ � �
+�� icon%=71:newicon%=37
+�� icon%=38:newicon%=71
+�� icon%=33:newicon%=69
+�� icon%>33:newicon%=icon%-1
+�-� (icon%>37 � icon%<54):newicon%=icon%-16
+�-� (icon%>53 � icon%<69):newicon%=icon%+15
+��
+��
+�
, ș "Wimp_ProcessKey",key%
,�
,Y�sys_claiminputfocus(roomhandle,newicon%,0,0,-1,�(�geticondata(roomhandle,newicon%)))
,$=0
,.
,8� �keypress_status
,B�col(128+2)
,L
� 26,4,12
,V�col(9):�col(128+7)
,`<�centre(�27," ")+"System Status Information"+�28," "),0)
,j�col(128+2):�col(7)
,t�status
,~�col(128+7):�col(9)
,�5�centre(�31," ")+"Integer Variables"+�32," "),10)
,��col(128+2):�col(7)
,� �lvar
,��:�return(18,31):�
,�
� 26,5
,�"ș ForceR,-1,0,0,scrw+1,scrh+1
,�=0
,�
,�� �keypress_chrdef
,�� key%=13 � icon%=64 �
,�*cur_chr%=�(�geticondata(design,icon%))
,��display_chr(cur_chr%)
- ,�changeicon(design,64,�(cur_chr%),icon%)
-
�
-*� key%<>13 � ș "Wimp_ProcessKey",key%
-�
-(=0
-2
-<� �keypress_Setup
-F0� key%=&18E � key%=13 � icon%=2 � newicon%=5
-P7� key%=13 � icon%=5 � icon%=1:void=�button_Setup:=0
-Z&� key%=&18E � icon%=5 � newicon%=2
-d&� key%=&18F � icon%=5 � newicon%=2
-n&� key%=&18F � icon%=2 � newicon%=5
-xD� key%<>13 � key%<>&18E � key%<>&18F � ș "Wimp_ProcessKey",key%
-�Q�sys_claiminputfocus(setuph,newicon%,0,0,-1,�(�geticondata(setuph,newicon%)))
-�=0
-�
-�A� ------ The `menu` routines to open the selected menu ------
-�
-�� �menu_
-�=0
-�
-�� �menu_swap
-�=0
-�
-�� �menu_arclogo
-�=0
.
.� �menu_info
.=0
."
.,
.6� �menu_disk35
.@,ș CreateM,0,diskmenu,mousex%-64,mousey%
.J,� loaded$<>"" � f$=path$ � f$="AlpsFile"
.T%�changeicon(savehandle,2,f$,void)
.^theLastMenu= diskmenu
.h claimmenu$="disk35":tick$=""
.r=0
.|
.�
.�� �menu_key
.�+ș CreateM,0,objmenu,mousex%-64,mousey%
.�theLastMenu = objmenu
.�claimmenu$="key":tick$=""
.�=0
.�
.�� �menu_door
.�,ș CreateM,0,roommenu,mousex%-64,mousey%
.�theLastMenu = roommenu
.�claimmenu$="door":tick$=""
.�=0
.�
/� �menu_quill
/$end_msg%=�(�maxmsg)
/,ș CreateM,0,textmenu,mousex%-64,mousey%
/&theLastMenu = textmenu
/0claimmenu$="quill":tick$=""
/:=0
/D
/N
/X� �menu_listing
/b,ș CreateM,0,progmenu,mousex%-64,mousey%
/ltheLastMenu = progmenu
/v!claimmenu$="listing":tick$=""
/�=0
/�
/�
/�� �menu_chardes
/�=0
/�,ș CreateM,0,charmenu,mousex%-64,mousey%
/�theLastMenu = charmenu
/�!claimmenu$="chardes":tick$=""
/�=0
/�
/�� �menu_vocab
/�-ș CreateM,0,vocabmenu,mousex%-64,mousey%
/�theLastMenu = vocabmenu
0$claimmenu$="vocabulary":tick$=""
0=0
0
0 � �menu_face
0*,ș CreateM,0,facemenu,mousex%-64,mousey%
04theLastMenu = facemenu
0> claimmenu$="actors":tick$=""
0H=0
0R
0\� �menu_misc
0fnull = �tick_misc
0p<ș CreateM,0,miscmenu,mousex%-64,�menuHeight(miscmenu,1)
0ztheLastMenu = miscmenu
0�"claimmenu$="misc":tick$="misc"
0�=0
0�
0�� �menu_help
0�=0
0�
0�
0�� �menu_eye
0�+ș CreateM,0,pixmenu,mousex%-64,mousey%
0�theLastMenu = pixmenu
0�claimmenu$="eye":tick$=""
0�=0
0�
1
1J� `menuselect` functions - called when a selection is made from a menu
1D� `item0%` is the number of selection from first menu (0,1,2...)
1$E� `item1%` is the number of selection from second menu (0,1,2...)
1.
18� �menuselect_
1B=0
1L
1V
1`� �menuselect_message
1j� changed_msg
1t
1~Ȏ item0% �
1�
� -1
1�! � 0,1:overwrite=� overwrite
1�& � 2:�cut(mark(0),mark(1),picbuf)
1�' � 3:�copy(mark(0),mark(1),picbuf)
1�" � 4:�paste(text_ptr%,picbuf)
1� � 5:�prev_msg
1� � 6:�next_msg
1� � 7:�first_msg
1� � 8:�last_msg
1� � 9:�goto_msg(�($m_msg%))
1�
� 10
1� � item1%>-1 �
2 � item1%=0 �
2
� I%=0 � maxsw%
2 switch_vals(I%)=0
2 � I%
2( �
227 switch_vals(item1%)=�($(swdata%+12*(item1%-1)))
2<7 � item1%>switch_vals(0) � switch_vals(0)=item1%
2F6 � switch_vals(0) stores the number of switches
2P �
2Z
� 11
2d
*FX3,10
2n �print_msg(mptr)
2x *FX3,0
2��
2��forceR(texthandle)
2�� changed_msg �
2�text_row%=0:text_col%=1
2��cursor(1,0)
2��
2�� claimmenu$=""
2�=0
2�
2�� �cut(start,end,buf)
2�� mrk<2 � � 1,error$(29)
2�Q� end<start � Ȕ start,end:Ȕ col(0),col(1):Ȕ row(0),row(1):Ȕ asc(0),asc(1)
2�cliplen=end-start+1
3�move(start,buf,cliplen)
3&� SYS"Wimp_CloseDown":MODE 12:STOP
3;�move(end+1,start,text_end%-end):� was +1 until 16.6.89
3"&?buf=asc(0):buf?(cliplen-1)=asc(1)
3,text_end%=text_end%-cliplen
36� asc(1)=0 � text_end%+=1
3@+� Restore end marker if it has been cut
3J3� text_end%<text_block% � text_end%=text_block%
3T?text_end%=0
3^last_row%=�find_lastrow
3h� I%=0 � last_row%
3rtext_rowlen%(I%)=��row(I%)
3|�
3�mrk=0:mark()=+0
3�/� text_row%>last_row% � text_row%=last_row%
3�M� text_col%>text_rowlen%(text_row%) � text_col%=text_rowlen%(text_row%)+1
3�,�locate_ptr:�cursor(text_col%,text_row%)
3�data_saved=�:text_ok=�
3��
3�
3�� �copy(start,end,buf)
3�� mrk<2 � � 1,error$(29)
3�Q� end<start � Ȕ start,end:Ȕ col(0),col(1):Ȕ row(0),row(1):Ȕ asc(0),asc(1)
3�cliplen=end+1-start
3��move(start,buf,cliplen)
3�&?buf=asc(0):buf?(cliplen-1)=asc(1)
4-?start=asc(0):?end=asc(1):mrk=0:mark()=+0
4�
4
4&� �paste(to,from)
40 � cliplen=0 � � 1,error$(30)
4:'�move(to,to+cliplen,text_end%-to+1)
4D�move(from,to,cliplen)
4Ntext_end%+=cliplen
4Xlast_row%=�find_lastrow
4b� I%=0 � last_row%
4ltext_rowlen%(I%)=��row(I%)
4v�
4�,�locate_ptr:�cursor(text_col%,text_row%)
4�data_saved=�:text_ok=�
4��
4�
4�� �menuselect_program
4�
errflag=�
4�� item0%>4 � item0%<9 �
4��remove_markers
4�� � text_ok � �store_prog
4�prg_sel%=item0%-3
4�text_row%=0:text_col%=1
4��cursor(1,0)
4��
5
5Ȏ item0% �
5� 0,1:overwrite=� overwrite
5 $� 2:�cut(mark(0),mark(1),picbuf)
5*%� 3:�copy(mark(0),mark(1),picbuf)
54 � 4:�paste(text_ptr%,picbuf)
5>� 5:progval$=""
5H� 6:progval$=$proc%
5R � 7:progval$=�toUpper($def%)
5\� 8:progval$=$exit%
5f� 9:�print_prog_seg
5p� 10:�listo
5z�
5�
5�� (item0%>4 � item0%<9) �
5� � � errflag �
5� �list(item0%-3,progval$)
5�= �retitle_text("PROGRAM: "+prog$(prg_sel%)+" "+progval$)
5� �forceR(texthandle)
5� �
5��
5�� (item0%>1 � item0%<5) �
5��forceR(texthandle)
5��
5�� item0%=10 �
5�� � text_ok � �store_prog
6� � errflag �
6text_row%=0:text_col%=1
6�cursor(1,0)
6$�list(prg_sel%,progval$)
6.�forceR(texthandle)
68�
6B�
6L=0
6V
6`� �menuselect_vocab
6j6� Make a selection from the vocabulary editor menu
6tȎ item0% �
6~� 0,1:overwrite=� overwrite
6�$� 2:�cut(mark(0),mark(1),picbuf)
6�%� 3:�copy(mark(0),mark(1),picbuf)
6� � 4:�paste(text_ptr%,picbuf)
6�� 5,6,7,8,9,10,11
6�$�remove_markers:� Added 23.08.89
6�� � text_ok � �store_vocab
6�� � errflag �
6�voc_sect%=item0%-4
6��list_vocab(voc_sect%)
6�text_row%=0:text_col%=1
6��cursor(1,0)
6�1�retitle_text("VOCABULARY: "+voc$(voc_sect%))
7 �
7
� 12:�print_prog_seg
7�
7Ȏ item0% �
7(� 2,3,4,5,6,7,8,9,10,11
72�forceR(texthandle)
7<�
7F� claimmenu$=""
7P=0
7Z
7d� �menuselect_exitedit
7nxerr%=�
7x� oldrmicon%<>0 �
7�) ptr%=(rdata%+rptr*r_len+oldrmicon%)
7� flags%=?ptr%
7� cl_door%=flags% � &40
7� op_door%=flags% � &20
7� lk_door%=flags% � &10
7� unlk_door%=flags% � &8
7�% � cl_door% � item0%=2 � xerr%=�
7�% � op_door% � item0%=1 � xerr%=�
7�% � op_door% � item0%=3 � xerr%=�
7�' � unlk_door% � item0%=3 � xerr%=�
7�% � lk_door% � item0%=4 � xerr%=�
7�% � lk_door% � item0%=2 � xerr%=�
7� � xerr% �
8 � 7
8 �
8# ?ptr%=?ptr% � (&80 >> item0%)
8" � � lk_door% � item0%=3 �
8,+ ?ptr%=?ptr% � %11011111 � %01000000
86 �
8@ � lk_door% � item0%=1 �
8J ?ptr%=?ptr% � %11101111
8T �
8^ �
8h data_saved=�
8r�
8|� claimmenu$=""
8�=0
8�
8�� �menuselect_disk35
8�Ȏ item0% �
8� � 0
8�( path$=�geticondata(savehandle,2)
8�$ ș "OS_File",5,path$ � ftype
8�e � ftype=0 � �save_all(path$) � �ensure(item0%,"This file exists. Do you want to replace it?")
8� � 1
8�* �load_bits(�geticondata(setuph,2))
8� �setup_disk(item0%)
8��
8�&icon%(diskicon)=-1:� claimmenu$=""
9=0
9
9
9&
90� �menuselect_objected
9:+old_flags%=�(�geticondata(objhandle,8))
9D+new_flags%=old_flags% � (&80 >> item0%)
9N0�changeicon(objhandle,8,�(new_flags%),dummy)
9X� claimmenu$=""
9b=0
9l
9v� �menuselect_container
9�Ȏ item0% �
9�� 0
9�container=� container
9�� container �
9�.�changeicon(objhandle,26,"SIZE <C>",dummy)
9��
9�*�changeicon(objhandle,26,"SIZE",dummy)
9��
9�� 1
9�cont_room=�($controom%)
9��
9�� data_saved=FALSE
9�� claimmenu$=""
:=0
:
:� �menuselect_roomedit
: -old_flags%=�(�geticondata(roomhandle,34))
:*+new_flags%=old_flags% � (&80 >> item0%)
:42�changeicon(roomhandle,34,�(new_flags%),dummy)
:>� claimmenu$=""
:H=0
:R
:\� �menuselect_key
:fȎ item0% �
:p � 0:�print_objs
:z$ � 1:�import_obj("O."+$import%)
:��
:�� claimmenu$=""
:�=0
:�
:�� �menuselect_door
:�Ȏ item0% �
:� � 0:�print_rooms
:�& � 1:�import_rooms("R."+$import%)
:��
:�� claimmenu$=""
:�=0
:�
:�� �menuselect_quill
;Ȏ item0% �
; � 0:�print_text
;% � 1:�import_text("T."+$import%)
;$& �load_dict("D."+$import%)
;.�
;8� claimmenu$=""
;B=0
;L
;V� �menuselect_listing
;`Ȏ item0% �
;j � 0:�print_program
;t � 1:�convert($import%)
;~ � 2:�run
;��
;�� claimmenu$=""
;�=0
;�
;�� �menuselect_chardes
;�2� When `menu` is clicked on the `chardes` icon
;�Ȏ item0% �
;�5� 0:�save_chars("<Users$Resources>."+$filename2%)
;�� 1
;�,�("PRINT <Alps$Resources>."+$filename2%)
;��display_chr(cur_chr%)
;�"ș ForceR,-1,0,0,scrw+1,scrh+1
<