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 <