; ShareWorld Sonic Interrogator V1.00 ; Programmed in Blitz Basic 2.1 ; Copyright Carl Read 1996. ; Freely distributable - but hardly useful except as example code. ; 96.03.08 - 96.04.07 ; Carl Read ; CyberCraft ; PO Box 14032 ; Mayfair ; Hastings 4201 ; NEW ZEALAND .Initialize: WBStartup:NoCli WbToScreen 0:ShowScreen 0 light=Red(1)+Green(1)+Blue(1) dark=Red(2)+Green(2)+Blue(2) If light>dark light=1:dark=2 Else light=2:dark=1 EndIf Statement DBorder{x,y,width,height} SHARED light,dark BorderPens dark,light:GadgetBorder x,y,width,height BorderPens light,dark:GadgetBorder x-2,y-1,width+4,height+2 End Statement LoadFont 0,"topaz.font",8 BitMap 1,320,80,2 DecodeILBM 1,?Pics If light=1 CopyBitMap 1,2 Use BitMap 2 ReMap 1,2,1:ReMap 2,1,1 Free BitMap 2 EndIf Use BitMap 1 For x=0 To3 GetaShape Int(x*2),x*40,0,20,10 GetaShape Int(x*2)+1,x*40+20,0,20,10 Next GetaShape 8,160,0,16,8 GetaShape 9,0,10,73,19 Free BitMap 1 DecodeMedModule 0,?Med0 DecodeMedModule 1,?Med1 SetInt 5 PlayMed End SetInt Filter Off .Variables: ; And yes, I know I should be using NEWTYPEs and LIST arrays ; here, but this was a rushed job and I've not really used them ; before so I haven't used them now. With my next program, OK? BorderPens light,dark winEvent.l=0 vol=64 svFlag=0 ; 1 means Questionnaire has been altered but not saved. MaxLen questPath$=250:MaxLen questFile$=64 MaxLen comPath$=250:MaxLen comFile$=64 pattern$=Chr$(126)+"(#?.info)" Dim winFlags(9) ; 0=window closed, 1=open. Dim tuneTitle$(1) Restore Tunes For n=0 To 1:Read tuneTitle$(n):Next Tunes: Data$ " `AZ-10A' by Mike Richmond. " Data$ " `Tension' by Mike Richmond. " Dim text$(1,200) ; Text. 0=docs, 1=questionnaire. Dim paraData(1,4) ; 0=number paragraphs, 1=lines, 2=columns, ; 3=top line, 4=total lines. Restore Docs paraData(0,0)=0:a$="" While a$<>"*" Read a$ If a$<>"*" If a$="" paraData(0,0)+1:If text$(0,paraData(0,0)-1)<>"" Then paraData(0,0)+1 Else If text$(0,paraData(0,0))<>""Then text$(0,paraData(0,0))+" " text$(0,paraData(0,0))+a$ If Right$(a$,1)="<" text$(0,paraData(0,0))=UnLeft$(text$(0,paraData(0,0)),1) paraData(0,0)+1 EndIf EndIf EndIf Wend paraData(0,0)+1 ; Convert Net-Styles to ANSI-Styles For n=0 To paraData(0,0)-1 a$=text$(0,n) If Instr(a$,"/")+Instr(a$,"*")+Instr(a$,"_")+Instr(a$,"#")+Instr(a$,"@")+Instr(a$,">")>0 a$="" For m=1 To Len(text$(0,n)) b$=Mid$(text$(0,n),m,1) If b$="/" If italics=0 b$=Chr$(27)+"[3m":italics=1 Else b$=Chr$(27)+"[23m":italics=0 EndIf EndIf If b$="*" If bold=0 b$=Chr$(27)+"[1m":bold=1 Else b$=Chr$(27)+"[22m":bold=0 EndIf EndIf If b$="#" Then b$="*" If b$="_" If underl=0 b$=Chr$(27)+"[4m":underl=1 Else b$=Chr$(27)+"[24m":underl=0 EndIf EndIf If b$=">" If center=0 b$=Chr$(27)+"[98m":center=1 Else b$=Chr$(27)+"[99m":center=0 EndIf EndIf If b$="@" Then b$=">" a$=a$+b$ Next text$(0,n)=a$ EndIf Next Dim textData(1,550,4) ; 0=Bits: 0=Underline, 1=bold, 2=italics, ; 3=centered, 4=new paragraph. ; 1=paragraph pointer. ; 2=Text start pointer. ; 3=Length text (including ANSI code). ; 4=Length text (excluding ANSI code). textData(0,0,2)=1 Dim sections$(6) Dim sectNos(6) Restore Sects For n=0 To 6:Read sections$(n):Next Sects: Data$ " General " Data$ " Columns " Data$ " ShareWorld " Data$ " Reviews " Data$ "Other Worlds" Data$ " Limericks " Data$ " Gallery " artParaMax=15:artMax=15 Dim arts$(6,artMax,2) Dim coms$(6,artMax,artParaMax) Dim bl$(1,artParaMax) ; 0=cut block. 1=temp block. Dim blParas(1) Dim comLen(6,artMax) For n=0 To 6:For m=0 To artMax:comLen(n,m)=1:Next:Next Restore Articles For n=0 To 6 a=0:a$="" While a$<>"*" Read a$ If a$<>"*" arts$(n,a,0)=a$:Read arts$(n,a,1):arts$(n,a,2)=" ":a+1 EndIf Wend sectNos(n)=a Next .Menus: MenuColour 2 MenuTitle 0,0," Project " MenuItem 0,0,0,0,"New","N" MenuItem 0,0,0,1,"Open","O" MenuItem 0,0,0,2,"Save","S" MenuItem 0,0,0,3,"Save As ","A" MenuItem 0,0,0,4,"About","?" MenuItem 0,0,0,5,"Help","H" MenuItem 0,0,0,6,"Quit","Q" MenuTitle 0,1," Edit " MenuItem 0,0,1,0,"Cut","X" MenuItem 0,0,1,1,"Copy","C" MenuItem 0,0,1,2,"Paste ","V" MenuTitle 0,2," Comments " MenuItem 0,0,2,0,"Save Comments","M" MenuItem 0,0,2,1,"Delete Comments ","D" MenuItem 0,0,2,2,"Previous","<" MenuItem 0,0,2,3,"Next",">" .Gadgets: ; SWSI. ShapeGadget 0,54,1,0,1,4,5 ; Volume down. ShapeGadget 0,74,1,0,2,6,7 ; Volume up. PropGadget 0,98,3,64|256,3,132,6 ; Volume slider. Borders 2,1:GadgetPens dark,3 TextGadget 0,234,1,0,4," Filter Off | Filter On " SetGadgetStatus 0,4,2 TextGadget 0,350,1,0,5," Silence | Music " TextGadget 0,442,1,0,6," Help ":BorderPens dark,light StringGadget 0,38,47,0,7,71,572:BorderPens light,dark TextGadget 0,2,58,0,8," General " TextGadget 0,78,58,0,9," Columns " TextGadget 0,154,58,0,10," ShareWorld " TextGadget 0,254,58,0,11," Reviews " TextGadget 0,330,58,0,12," Other Worlds " TextGadget 0,446,58,0,13," Limericks " TextGadget 0,538,58,0,14," Gallery " PropGadget 0,598,79,128|256,15,12,18 ; Index slider. ShapeGadget 0,594,99,0,16,0,1 ; Index up. ShapeGadget 0,594,109,0,17,2,3 ; Index down. Dim cols(11,1) a=0 For n=0 To 3 For m=0 To 3 If n<>m GadgetPens m,n:TextGadget 0,a*44+64,120,0,a+18," *** " cols(a,0)=m:cols(a,1)=n:a+1 EndIf Next Next colSel=7 GadgetPens dark,3 TextGadget 0,5,140,0,30,"*" TextGadget 0,19,140,0,31,"?" TextGadget 0,33,140,0,32,"!" TextGadget 0,47,140,0,33,"c" ShapeGadget 0,594,130,0,34,6,7 ShapeGadget 0,594,120,0,35,4,5 PropGadget 0,-39,143,2|128|256,36,12,16 ; Text slider. ShapeGadget 0,-23,141,2,37,0,1 ; Text up. ShapeGadget 0,-23,151,2,38,2,3 ; Text down. ; About. TextGadget 1,194,157,0,1," OK " ; Help. PropGadget 2,-15,2,2|16|128|256,1,12,-24 ; Text slider. ShapeGadget 2,-19,-19,6,2,0,1 ; Text up. ShapeGadget 2,-19,-9,6,3,2,3 ; Text down. ; Quit. TextGadget 3,10,62,0,1," Quit " TextGadget 3,178,62,0,2," Cancel " ; Comments full. TextGadget 4,126,76,0,1," OK " ; Delete Comments. TextGadget 5,14,52,0,1," Delete " TextGadget 5,172,52,0,2," Cancel " ; File Error. TextGadget 6,184,22,0,1," OK " ; New warning. TextGadget 7,14,60,0,1," Erase " TextGadget 7,172,60,0,2," Cancel " ; Message. TextGadget 8,14,52,0,1," Yes " TextGadget 8,222,52,0,2," Yes " .Start: Gosub ArtGet:win=0:Gosub WinHandler:Gosub StartMod VWait 90:WSize 518,52 .MainLoop: While quitFlag=0 Gosub GetEvent Wend End GetEvent: winEvent=WaitEvent If winEvent<>0 Then win=EventWindow:windFlag=win If winEvent=$2 Then Gosub WinHandler If winEvent=$8 Then Gosub ButSelected If winEvent=$20 Then Gosub GadDownSelected If winEvent=$40 Then Gosub GadUpSelected If winEvent=$100 Then Gosub MenuSelected If winEvent=$200 Then Gosub CloseSelected If winEvent=$400 Then Gosub KeySelected Return .ButSelected: Use Window win:xPos=EMouseX-4:yPos=EMouseY-11 Select win Case 0 ; SWSI window. If xPos>3 AND xPos<493 AND yPos>20 AND yPos<37 ; Module selected. y=Int((yPos-21)/8) If y<>music music=y:Gosub DisplayMods:Gosub StopMod If GadgetStatus(0,5)=1 Then Gosub StartMod EndIf EndIf If xPos>5 AND xPos<590 AND yPos>77 AND yPos<119 ; Article selected. Gosub ArtReturn:texX=0:texY=0:paraData(1,3)=0 art=Int((yPos-78)/8)+artTop:selTop=artTop:sectSel=sect Gosub IndDisplay:Gosub ArtSelected While Joyb(0)<>0 Wend VWait 2:a=Event EndIf If xPos>69 AND xPos<78+paraData(1,2)*8 AND yPos>141 AND yPos<142+paraData(1,1)*8 ; Text selected. a=1:Gosub EraseCursor:If blFlag=1 Then blFlag=0:Gosub TextOut cuX=Int((xPos-70)/8) cuY=Int((yPos-142)/8)+paraData(1,3) If cuY>paraData(1,4)-1 cuY=paraData(1,4)-1:cuX=textData(1,cuY,4) EndIf Gosub TidyCursor:Gosub CuTextGet:Gosub DisplayCursor x=cuX:y=cuY:sX=x:sY=y:sX1=x:sY1=y While Joyb(0)=1 x1=Int((WMouseX-70)/8):x=cuX:y=cuY y1=Int((WMouseY-142)/8)+paraData(1,3) If y1paraData(1,3)+paraData(1,1)-1 Then Gosub TDown If y1>paraData(1,3)+paraData(1,1)-1 y1=paraData(1,3)+paraData(1,1)-1:x1=textData(1,y1,4) EndIf If y1paraData(1,4)-1 y1=paraData(1,4)-1:x1=textData(1,y1,4) EndIf b=1 If y1textData(1,y1,3)-1+b Then x1=textData(1,y1,3)-1+b blFlag=0 If y<>y1 OR x<>x1 blFlag=1 If y1blXStart OR sY<>blYStart OR sX1<>blXEnd OR sY1<>blYEnd Then Gosub TextOut sX=blXStart:sY=blYStart:sX1=blXEnd:sY1=blYEnd EndIf Wend VWait2:a=Event If blFlag=1 cuX=x1:cuY=y1:Gosub CuTextGet:texXEnd=texX+1:texYEnd=texY cuX=x:cuY=y:Gosub TidyCursor:Gosub CuTextGet texXStart=texX+1:texYStart=texY Else Gosub TidyCursor:Gosub CuTextGet:Gosub DisplayCursor EndIf EndIf Case 2 ; Help window. a=0 While Joyb(0)=1 yPos=SMouseY:pause=1 If yPosWindowY+WindowHeight dir=1 Else Select Int((yPos-WindowY)/(WindowHeight-16)*5) Case 0 dir=-1 Case 1 dir=-1:pause=10 Case 2 dir=0 Case 3 dir=1:pause=10 Case 4 dir=1: End Select EndIf EndIf If dir=-1 AND paraData(0,3)>0 Then Gosub TextScroll If dir=1 AND paraData(0,3)>" pause=15:Gosub ArtRight Case 35 ; "<<" pause=15:Gosub ArtLeft Case 36 ; Slider. Gosub TextSlidHit While Joyb(0)=1 Gosub TextSlidHit Wend Case 37 ; Text up. a=1:Gosub TUp Case 38 ; Text down. a=1:Gosub TDown End Select Case 2 ; Help. Use Window 2:a=0 Select gad Case 1 ; Slider. Gosub HelpSlidHit While Joyb(0)=1 Gosub HelpSlidHit Wend Case 2 ; Text up. a=0:Gosub TUp Case 3 ; Text down. a=0:Gosub TDown End Select End Select Return HelpSlidHit: a=paraData(0,3) paraData(0,3)=Int(VPropPot(2,1)*(paraData(0,4)-paraData(0,1)+1)) If paraData(0,3)<>a Then Gosub ClrHelp:a=0:Gosub TextOut Return TextSlidHit: a=paraData(1,3) paraData(1,3)=Int(VPropPot(0,36)*(paraData(1,4)-paraData(1,1)+1)) If paraData(1,3)<>a Then a=1:Gosub TextOut:Gosub DisplayCursor Return IndSlider: artTop=Int(VPropPot(0,15)*(sectNos(sect)-4)) If sect=sectSel Then selTop=artTop Gosub IndDisplay Return ArtRight: While Joyb(0)=1 Gosub AR Wend Return AR: If sectSel<6 OR artselTop+4 Then selTop+1 EndIf Gosub NextArt EndIf Gosub IndSliderDraw:Gosub PauseWait Return ArtLeft: While Joyb(0)=1 Gosub AL Wend Return AL: If sectSel>0 OR art>0 Gosub ArtReturn art-1:texX=0:texY=0:paraData(1,3)=0 If art<0 sectSel-1:art=sectNos(sectSel)-1 selTop=art-4:If selTop<0 Then selTop=0 Else If art0) OR (gad=2 AND vol<64) If gad=1 Then vol-1 Else vol+1 SetMedVolume vol:Gosub VolDisplay Else volFlag=1 EndIf VWait 2 If Joyb(0)<>1 Then volFlag=1 Wend Return .GadUpSelected: gad=GadgetHit:Use Window win Select win If gad>7 AND gad<15 artTop=0:sect=gad-8:If sect=sectSel Then artTop=selTop Gosub SectDisplay:Gosub IndDisplay:Gosub IndSliderDraw EndIf If gad>17 AND gad<30 colSel=gad-18 windFlag=0:a=1:Gosub TextOut If winFlags(2)=1 Then windFlag=2:a=0:Gosub ClrHelp:Gosub TextOut EndIf Case 0 ; SWSI. Select gad Case 4 ; Filter. Use Window 0:WBlit 8,236,2 Filter GadgetStatus(0,4)-1 Case 5 ; Silence/Music toggle. Use Window 0:WBlit 8,352,2 If GadgetStatus(0,5)=2 Gosub StopMod Else Gosub StartMod EndIf Case 6 ; Help win=2:winFlags(2)=0:Gosub WinHandler Case 7 ; Name name$=StringText$(0,7):svFlag=1 Case 30 ; "*" a$="*":Gosub AddStar Case 31 ; "?" a$="?":Gosub AddStar Case 32 ; "!" a$="!":Gosub AddStar Case 33 ; "c" svFlag=1:arts$(sectSel,art,2)=" ":Gosub DisplayStars End Select Case 1 ; About. winShut=1:Gosub ShutWindow Case 3 ; Quit. winShut=3:Gosub ShutWindow Select gad Case 1 ; Quit. Gosub Quit End Select Case 4 ; Comments full. winShut=4:Gosub ShutWindow Case 5 ; Delete comments. winShut=5:Gosub ShutWindow Select gad Case 1 ; Delete. Use Window 0:Gosub EraseCursor:svFlag=1 For n=0 To paraData(1,4)-1:text$(1,n)="":Next paraData(1,0)=1:texX=0:texY=0 textData(1,0,3)=0:textData(1,0,4)=0 windFlag=0:Gosub TextUpdate:Gosub DisplayCursor End Select Case 6 ; File error. winShut=6:Gosub ShutWindow Case 7 ; New. winShut=7:Gosub ShutWindow Select gad Case 1 ; Erase. name$="":sect=0:art=0:artTop=0:sectSel=0:selTop=0:nameFlag=0 For n=0 To 6 For m=0 To artMax comLen(n,m)=1 For p=0 To artParaMax coms$(n,m,p)="" arts$(n,m,2)=" " Next Next Next win=0:SetString 0,7,name$:Redraw 0,7 Gosub ArtGet:Gosub WinHandler End Select Case 8 ; SWSI message. winShut=8:Gosub ShutWindow End Select Return AddStar: b$=arts$(sectSel,art,2) If a$="*" AND Instr(b$,"!")>0 Then Return If a$="!" AND Instr(b$,"*")>0 Then Return a=Instr(b$," "):svFlag=1 If a>0 Then b$=Left$(Left$(b$,a-1)+a$+" ",3) arts$(sectSel,art,2)=b$:Gosub DisplayStars Return NextArt: sect=sectSel:artTop=selTop:Gosub SectDisplay:Gosub ArtSelected Gosub IndDisplay Return .ArtSelected: Use Window 0:WJam 1:WColour light,0:WLocate 56,131 WindowFont 0,0 Print String$(" ",67):a$="Comments: "+arts$(sectSel,art,0) WLocate 309-Int(Len(a$)/2)*8,131:Print a$:Gosub DisplayStars Gosub ArtGet:blFlag=0:Gosub DisplayArt Return ArtGet: paraData(1,0)=comLen(sectSel,art) For n=0 To artParaMax If paraData(1,0)>0 AND n0 For n=0 To paraData(1,0)-1 coms$(sectSel,art,n)=text$(1,n) Next EndIf Return IndScroll: pause=15 While Joyb(0)=1 If artTop+dir>=0 AND artTop+dir+40 AND Joyb(0)=1 dir=-1:Gosub TextScroll Wend Return TDown: pause=15 While paraData(a,3)"" fiErr=0:errMes$="Error while loading Questionnaire." If ReadFile(0,quest$) FileInput 0 SetErr fiErr=1 End SetErr If fiErr=0 Then a$=Edit$(50) If a$<>"SWSIv1.00.SW6Questionnaire" Then fiErr=1 ClrErr If fiErr=1 Then errMes$="That wasn't a Questionnaire file." If fiErr=0 For n=0 To 6 SetErr:fiErr=1:End SetErr If fiErr=0 Then sectNos(n)=Edit(50) ClrErr If fiErr=0 For m=0 To sectNos(n)-1 SetErr:fiErr=1:End SetErr If fiErr=0 Then arts$(n,m,2)=Edit$(50) If fiErr=0 Then comLen(n,m)=Edit(50) ClrErr If fiErr=0 If comLen(n,m)>0 For p=0 To comLen(n,m)-1 SetErr:fiErr=1:End SetErr If fiErr=0 Then coms$(n,m,p)=Edit$(10240) ClrErr If fiErr=1 Then p=comLen(n,m)-1 Next EndIf Else m=sectNos(n)-1 EndIf Next Else n=6 EndIf Next SetErr:fiErr=1:End SetErr:b=0 While fiErr=0 AND b=0 name$=Edit$(71):sectSel=Edit(50):sect=Edit(50) art=Edit(50):artTop=Edit(50):selTop=Edit(50):b=1 Wend ClrErr EndIf DefaultOutput Else fiErr=1 EndIf CloseFile 0 If fiErr=1 win=6:Gosub WinHandler Else svFlag=0:nameFlag=2 EndIf win=0:SetString 0,7,name$:Redraw 0,7 Gosub ArtGet:Gosub WinHandler EndIf Case 2 ; Save. Gosub CheckName If nameFlag<>2 AND name$<>"" If quest$="" prompt$="SWSI Save Questionnaire":Gosub Requestor EndIf If quest$<>"" Then Gosub QuestSave EndIf Case 3 ; Save As. Gosub CheckName If nameFlag<>2 AND name$<>"" prompt$="SWSI Save Questionnaire":Gosub Requestor If quest$<>"" Then Gosub QuestSave EndIf Case 4 ; About. win=1:winFlags(1)=0:Gosub WinHandler Case 5 ; Help. win=2:winFlags(2)=0:Gosub WinHandler Case 6 ; Quit. win=3:winFlags(3)=0:Gosub WinHandler End Select Case 1 ; *** Edit *** Select menItem Case 0 ; Cut. Gosub BlCut Case 1 ; Copy. Gosub BlCopy Case 2 ; Paste. Gosub BlPaste End Select Case 2 ; *** Comments *** pause=1 Select menItem Case 0 ; Save Comments. prompt$="SWSI Save Comments":comment$="" If ExecVersion<36 comment$=FileRequest$(prompt$,comPath$,comFile$) Else ASLFlag=0 SetErr ASLFlag=1 End SetErr If ASLFlag=0 Then comment$=ASLFileRequest$(prompt$,comPath$,comFile$,pattern$,150,11,340,188) If ASLFlag=1 Then comment$=FileRequest$(prompt$,comPath$,comFile$) ClrErr EndIf If comment$<>"" fiErr=0:errMes$="Error while saving Comments." If WriteFile(1,comment$) FileOutput 1 For n=0 To paraData(1,0)-1 SetErr:fiErr=1:End SetErr If fiErr=0 Then NPrint text$(1,n) ClrErr:If fiErr=1 Then n=paraData(1,0)-1 Next DefaultOutput Else fiErr=1 EndIf CloseFile 1:If fiErr=1 Then win=6:Gosub WinHandler EndIf Case 1 ; Delete Comments. Gosub DeleteAll Case 2 ; Previous Article. Gosub AL Case 3 ; Next Article. Gosub AR End Select End Select Return Requestor: quest$="" If ExecVersion<36 quest$=FileRequest$(prompt$,questPath$,questFile$) Else ASLFlag=0 SetErr ASLFlag=1 End SetErr If ASLFlag=0 Then quest$=ASLFileRequest$(prompt$,questPath$,questFile$,pattern$,150,11,340,188) If ASLFlag=1 Then quest$=FileRequest$(prompt$,questPath$,questFile$) ClrErr EndIf Return .QuestSave: Gosub ArtReturn Gosub CheckName:If fiErr=1 Then Return errMes$="Error while saving Questionnaire." If WriteFile(0,quest$) FileOutput 0 SetErr:fiErr=1:End SetErr If fiErr=0 Then NPrint"SWSIv1.00.SW6Questionnaire" ClrErr If fiErr=0 For n=0 To 6 SetErr:fiErr=1:End SetErr If fiErr=0 Then NPrint sectNos(n) ClrErr If fiErr=0 For m=0 To sectNos(n)-1 SetErr:fiErr=1:End SetErr If fiErr=0 Then NPrint arts$(n,m,2) If fiErr=0 Then NPrint comLen(n,m) ClrErr If fiErr=0 If comLen(n,m)>0 For p=0 To comLen(n,m)-1 SetErr:fiErr=1:End SetErr If fiErr=0 Then NPrint coms$(n,m,p) ClrErr If fiErr=1 Then p=comLen(n,m)-1 Next EndIf Else m=sectNos(n)-1 EndIf Next Else n=6 EndIf Next SetErr:fiErr=1:End SetErr:b=0 While fiErr=0 AND b=0 NPrint name$:NPrint sectSel:NPrint sect NPrint art:NPrint artTop:NPrint selTop:b=1 Wend ClrErr EndIf DefaultOutput Else fiErr=1 EndIf CloseFile 0 If fiErr=1 win=6:Gosub WinHandler Else svFlag=0 EndIf Return .CloseSelected: If win=0 win=3:winFlags(3)=0:Gosub WinHandler Else winShut=win:Gosub ShutWindow EndIf Return .KeySelected: Use Window win:WindowFont 0,0 k$=Inkey$:k=Asc(k$) qual=(Qualifier AND $fb):If qual=$02 Then qual=$01 If k=139 Then win=2:winFlags(2)=0:Gosub WinHandler:Return If k$="/" AND qual=$80 Then win=1:winFlags(1)=0:Gosub WinHandler:Return If win<>0 Then Return If WindowHeight<165 Then Return Gosub CheckShown:a=1 If qual=$01 AND (k=8 OR k=127) Then Gosub DeleteAll:Gosub DisplayCursor:Return pause=1:If qual=$80 AND k$="," Then Gosub AL:Return If qual=$80 AND k$="." Then Gosub AR:Return Gosub EraseCursor If blFlag=1 AND k>27 AND k<32 Then BlFlag=0:Gosub TextOut Select k Case 8 ; Left delete. If blFlag=1 Gosub BlErase Else If texX>0 OR texY>0 svFlag=1 If texX>0 text$(1,texY)=Left$(text$(1,texY),texX-1)+Mid$(text$(1,texY),texX+1) texX-1 Else texX=Len(text$(1,texY-1)) text$(1,texY-1)=text$(1,texY-1)+text$(1,texY) If texYparaData(1,3) cuY=paraData(1,3):Gosub TidyCursor:Gosub CuTextGet Else texY=0:texX=0:paraData(1,3)=0:cuY=0:cuX=0:Gosub TextOut EndIf Else If cuY>0 cuY-1:Gosub TidyCursor:Gosub CuTextGet:Gosub CheckUp EndIf EndIf Case 29 ; Cursor down. If qual=$01 If cuYtextData(1,cuY,3)-1+b cuY+1:cuX=0 Gosub CuTextGet:Gosub CheckDown EndIf EndIf EndIf Case 31 ; Cursor left. If qual=$01 cuX=0:Gosub CuTextGet Else If cuY>0 OR cuX>0 cuX-1:texX-1 If cuX<0 cuY-1:cuX=textData(1,cuY,3)-1 If (textData(1,cuY+1,0) AND 16)=16 Then cuX+1 Gosub CuTextGet:Gosub CheckUp EndIf EndIf EndIf Case 127 ; Right delete. If blFlag=1 Gosub BlErase Else If texXChr$(27) svFlag=1 If blFlag=1 Then Gosub BlErase text$(1,texY)=Left$(text$(1,texY),texX)+k$+Mid$(text$(1,texY),texX+1) texX+1:cuX+1:textData(1,cuY,3)+1 textData(1,cuY,4)+1:a=1:WJam 1 If textData(1,cuY,3)>paraData(1,2) Gosub TextUpdate:Gosub CheckDown Else n=cuY:Gosub LineOut EndIf EndIf End Select Gosub DisplayCursor Return .BlCut: Gosub BlCopy:Gosub BlErase Return BlErase: If blFlag=0 Then Return svFlag=1 If texYStart<>texYEnd text$(1,texYStart)=Left$(text$(1,texYStart),texXStart-1)+Mid$(text$(1,texYEnd),texXEnd+1) paraData(1,0)=texYStart+1 If texYEndparaData(1,3)+paraData(1,1)-1 paraData(1,3)=cuY:a=1:Gosub TextOut:Gosub DisplayCursor EndIf Return .TidyCursor: b=1 If cuYtextData(1,cuY,3)-1+b Then cuX=textData(1,cuY,3)-1+b Return CuTextGet: texY=textData(1,cuY,1):texX=textData(1,cuY,2)+cuX-1 Return CheckDown: If cuY>paraData(1,3)+paraData(1,1)-1 pause=1:dir=1:Gosub TextScroll EndIf Return CheckUp: If cuYsectNos(sect)-1 Then bot=sectNos(sect)-1 For n=artTop To bot WLocate 5,78+(n-artTop)*8 If n=art AND sect=sectSel WColour dark,light Else WColour dark,0 EndIf Print " ",arts$(sect,n,0) Print String$(" ",71-Len(arts$(sect,n,0))-Len(arts$(sect,n,1))) NPrint arts$(sect,n,1)," " Next Return IndSliderDraw: body=5/sectNos(sect):If body>1 Then body=1 SetVProp 0,15,artTop/(sectNos(sect)-5),body:Redraw 0,15 Return HelpSlider: SetVProp 2,1,paraData(0,3)/(paraData(0,4)-paraData(0,1)),paraData(0,1)/paraData(0,4) Redraw 2,1 Return TextSlider: SetVProp 0,36,paraData(1,3)/(paraData(1,4)-paraData(1,1)),paraData(1,1)/paraData(1,4) Redraw 0,36 Return .DisplayArt: Use Window 0:BorderPens dark,light If WindowHeight>163 GadgetBorder 66,141,WindowWidth-136,WindowHeight-156 Else GadgetBorder 66,141,WindowWidth-136,148 EndIf Gosub ArtUpdate:Gosub TextSlider Return ArtUpdate: windFlag=0:Gosub TextUpdate Return DisplayStars: Use Window 0:WJam 1:a$=arts$(sectSel,art,2):WindowFont 0,2 WBox 11,130,52,138,0:WLocate 11,130:WColour light:WJam 0 Print Left$(a$,1)," ",Mid$(a$,2,1)," ",Right$(a$,1) WLocate 12,131:WColour dark Print Left$(a$,1)," ",Mid$(a$,2,1)," ",Right$(a$,1) Return .TextUpdate: Use Window windFlag:a=0:If windFlag=0 Then a=1 paraData(a,1)=Int((WindowHeight-16+a*3)/8)-a*18 paraData(a,2)=Int((WindowWidth-48)/8)-a*13 topLine=textData(a,paraData(a,3),1) oldPos=textData(a,paraData(a,3),2) bits=0:ln=0 If paraData(a,0)>0 For n=0 To paraData(a,0)-1 a$=text$(a,n):textData(a,ln,0)=(bits OR 16) textData(a,ln,1)=n:pos=1:textData(a,ln,2)=pos If a$="" textData(a,ln,3)=0:textData(a,ln,4)=0 ln+1:Gosub GetTop Else While pos<=Len(a$) b$=Mid$(a$,pos,paraData(a,2)) If Instr(b$,Chr$(27))=0 b=Len(b$):Gosub CheckLine:Gosub GetTop Else b$="":b=0 For m=pos To Len(a$) c$=Mid$(a$,m,1) If c$=Chr$(27) c=Val(Mid$(a$,m+2)):Gosub ANSI If c=98 Then textData(a,ln,0)=(textData(a,ln,0) OR 8) c=Instr(a$,"m",m):b$+Mid$(a$,m,c-m+1):m=c Else b$+c$:b+1:If b=paraData(a,2) Then m=Len(a$) EndIf Next Gosub CheckLine:Gosub GetTop EndIf Wend EndIf Next paraData(a,4)=ln If a=1 cuX=0 For n=0 To paraData(1,4)-1 If textData(1,n,1)=texY If cuX+textData(1,n,3)paraData(1,3)+paraData(1,1)-1 Then Return WLocate cuX*8+70,(cuY-paraData(1,3))*8+142:WJam 1 Print Left$(Mid$(text$(1,texY),texX+1,1)+" ",1) Return .TextOut: ; Only processes 1st code in ANSI at present. Gosub ClrArt:WColour cols(colSel,0):WLocate 0,2:WJam 0 b=paraData(a,3)+paraData(a,1) If b>paraData(a,4) Then b=paraData(a,4) For n=paraData(a,3) To b-1 Gosub LineOut Next Return .ClrArt: If a=1 AND WindowHeight>164 WBox 66,141,WindowWidth-71,WindowHeight-16,cols(colSel,1) EndIf Return GetTop: If n=topLine If oldPos>=textData(a,ln-1,2) AND oldPos<=textData(a,ln-1,2)+textData(a,ln-1,3)-1 paraData(a,3)=ln-1 EndIf EndIf Return CheckName: If name$="" win=6:errMes$="Please enter your name first.":Gosub WinHandler If nameFlag=0 Then nameFlag=1 Else If nameFlag=2 Then nameFlag=3 If nameFlag=1 Then win=8:Gosub WinHandler:nameFlag=2 EndIf Return .LineOut: If a=1 aY=n-paraData(a,3):aX=70:WLocate aX,142+aY*8:WColour cols(colSel,0),cols(colSel,1):WJam 1 If blFlag=1 AND n>blYStart AND n0 If b-1>0 Then Print Left$(a$,b-1) a$=Mid$(a$,b) c=Val(Mid$(a$,3)):Gosub ANSI:WindowFont 0,bits c=Instr(a$,"m"):a$=Mid$(a$,c+1) b=Instr(a$,Chr$(27)) Wend NPrint a$ EndIf If a=1 AND blFlag=1 AND (n=blYStart OR n=blYEnd) WColour cols(colSel,1),cols(colSel,0) If n=blYEnd Then a$=Left$(a$,blXEnd) If n=blYStart aX+(blXStart-1)*8:a$=Mid$(a$,blXStart) EndIf WLocate aX,142+aY*8 If n<>blYEnd NPrint a$+String$(" ",paraData(a,2)-Len(a$)-blXStart+1) Else NPrint a$ EndIf EndIf Return .GetLine: a$=Mid$(text$(a,textData(a,n,1)),textData(a,n,2),textData(a,n,3)) Return CheckLine: If Instr(b$," ")=0 OR pos+Len(b$)>Len(a$) textData(a,ln,3)=Len(b$):pos+Len(b$):Gosub NewLine Else For m=Len(b$) To 1 Step-1 b-1 c$=Mid$(b$,m,1) If c$=" " pos+m:textData(a,ln,3)=m:m=1:b+1 Else If c$=Chr$(27) pos+m-1:textData(a,ln,3)=m-1:m=1 EndIf EndIf Next Gosub NewLine EndIf Return NewLine: textData(a,ln,4)=b:ln+1:textData(a,ln,0)=bits:textData(a,ln,1)=n textData(a,ln,2)=pos Return ANSI: Select c ; c is the ANSI code, bits the current state. Case 0 bits=(bits AND 16) ; Clear. Case 1 bits=(bits OR 2) ; Bold on. Case 3 bits=(bits OR 4) ; Italics on. Case 4 bits=(bits OR 1) ; Underline on. Case 22 bits=(bits AND 29) ; Bold off. Case 23 bits=(bits AND 27) ; Italics off. Case 24 bits=(bits AND 30) ; Underline off. Case 98 bits=(bits OR 8) ; Center on. (Center not true ANSI code.) Case 99 bits=(bits AND 23) ; Center off. End Select Return DisplayMods: Use Window 0:WJam 1:WindowFont 0,0 For n=0 To 1 WLocate 4,21+n*8 If music=n WColour dark,light Else WColour dark,0 EndIf Print tuneTitle$(n) Next Return VolDisplay: SetHProp 0,3,vol/64,1/64:Redraw 0,3 Return Quit: winShut=0:Gosub ShutWindow:Gosub StopMod:quitFlag=1 Return ShutWindow: Free Window winShut:winFlags(winShut)=0 Return .StartMod: StartMedModule music:SetMedVolume vol:Filter GadgetStatus(0,4)-1 Return StopMod: If GadgetStatus(0,5)=1 For v=1 To 0 Step-(1/64) VWait 2 SetMedVolume Int(vol*v) Next VWait 15 EndIf StopMed Return .Pics: IncBin "Buttons1.pic" Med0: IncBin "MOD.AZ-10A" Med1: IncBin "MED.Tension" Articles: Data$ "Front Page","The picture `Landscape' ? by Tristan Campbell" Data$ "ShareWorld 6 Logo","Mr. Frosty" Data$ "Editorial","Carl Read" Data$ "Letters to the editor","Various" Data$ "Feedback","Various" Data$ "Feedback Addendum","Someone" Data$ "The ShareWorld Survey","Various" Data$ "`AZ-10A'","Music 1 by Mike Richmond" Data$ "`Tension'","Music 2 by Mike Richmond" Data$ "`ShareWorld Sonic Interrogator v1.00'","Did it work for you? Carl Read" Data$ "<> Your overall impression of ShareWorld Six <>","" Data$ "*" Data$ "Futures Past","Carl Read" Data$ "Machine Language The Easy Way","Matthew Goode" Data$ "Blitztified","Carl Read" Data$ "Not The Editorial","Carl Read" Data$ "Diary Of A Long Distance Editor","Carl Read" Data$ "*" Data$ "Diary of `The Midnight Hour'","Mike Richmond" Data$ "Where Is It Going??","Andrew Cashmore" Data$ "`Virtual Fish Tank'","Chris Wells" Data$ "`PDPaint'","Carl Read" Data$ "Raven's Reply","Jack Holland" Data$ "Blitz Basic 2.1","Carl Read" Data$ "A Cool Algorithm","Carl Read" Data$ "About A.M.I.G.A","Carl Read" Data$ "A.M.I.G.A Newsletter #4","A.M.I.G.A" Data$ "Tips for Writing Music for Games","Mike Richmond" Data$ "Tips for Using Sound Effects in Games","Mike Richmond" Data$ "Ultimate Distribution","Mr. Frosty" Data$ "SWSI - The Awakening...","Carl Read" Data$ "*" Data$ "`Amon Extension v1.04'","Mike Richmond" Data$ "`Vanishing Point'","Matthew Goode" Data$ "`Map Editor v2.22'","Mike Richmond" Data$ "`Hilt'","James Dearie" Data$ "`Deus Ex Machina 1968'","Carl Read" Data$ "`Vanishing Point'","Mike Richmond" Data$ "`The Portrait'","Carl Read" Data$ "Played Any Crap Lately?","Zzzzz" Data$ "`Excellent Card Games III AGA'","Carl Read" Data$ "*" Data$ "`Future Warrior'","Fiction by Neale Grant" Data$ "`Deus Ex Machina' Chapter 4","Fiction by Ivan Millett" Data$ "Forbidden Secrets Extra - Focus on Ted Jones","Ted Jones" Data$ "What Are OOBS?","Ted Jones" Data$ "Precognition In Dreams","Ted Jones" Data$ "Feet On The Ground","Carl Read" Data$ "Editorial Licence","A Chat with Neale Grant and Dr. Roney" Data$ "`Diary From A Padded Cell'","Fiction by Mr. Frosty" Data$ "*" Data$ "`A programmer pestered by yobs'","" Data$ "`A young lady with little regard'","" Data$ "`There was a plant-lover called Read'","" Data$ "`Virtual reality reached a new height'","" Data$ "`A Kiwi named Frederick Blunt'","" Data$ "`Tom stuck the disk drive cable'","" Data$ "`A gamer found to his dismay'","" Data$ "`When Mary began to titter'","" Data$ "`In Scotland there's an editor called Neale'","" Data$ "`A nurseryman known as Buck'","" Data$ "`An artist who wasn't a saint'","" Data$ "`A young author known only as Flick'","" Data$ "`There was a programmer called Sam'","" Data$ "`A man used noises in bed'","" Data$ "`Kev Murphy writes cyberpunk fiction'","" Data$ "`A Kiwi from Mayfair, Hastings'","" Data$ "*" Data$ "`River Of Dreams'","Mike Richmond" Data$ "`Europe'","Andrew Campbell" Data$ "`Icy Wastes'","Jen Allen" Data$ "`Tree' ?","Tristan Campbell" Data$ "`Islands In The Sun'","Ted Jones" Data$ "`Orange Mountain'","Rudolf Sanchez" Data$ "*" .Docs: Data$ ">/*ShareWorld Sonic Interrogator v1.00 Documentation*/>" Data$ "" Data$ "SWSI is a program designed to run alongside the Amiga disk" Data$ "magazine ShareWorld. As well as playing the" Data$ "issue's music it also lets the user answer the" Data$ "ShareWorld Questionnaire while reading the mag, even if" Data$ "they autobooted it. Although designed for using while the" Data$ "mag is running, SWSI is a stand-alone program and can be" Data$ "run just like any other program. It was introduced with" Data$ "ShareWorld Six, released in April of 1996." Data$ "" Data$ "/>This Documentation Reader>/" Data$ "" Data$ "The text in these docs can be scrolled using the buttons" Data$ "in the bottom right of the window or by using" Data$ "the slider-bar on its right side. You can also scroll the" Data$ "text by clicking on it and, while holding the mouse button" Data$ "down, moving the pointer up or down. There are five speeds" Data$ "of scrolling from fast-up through stopped to fast down." Data$ "The window can also be resized - with the text wrapping" Data$ "tidily. The Help button on the main SWSI window will" Data$ "bring up this window, as will choosing Help from the" Data$ "menus." Data$ "" Data$ "/>The Music Player>/" Data$ "" Data$ "Music will start playing when SWSI is first run and the" Data$ "program allows you to play with it using its various" Data$ "gadgets. These are all on SWSI's main window" Data$ "and are as follows..." Data$ "" Data$ ">Volume Control>" Data$ "" Data$ "These three gadgets alter the volume of the music." Data$ "They are the `left' and `right' buttons and the slider" Data$ "gadget situated to the right of the word `Volume'. Clicking on" Data$ "the buttons will increase or decrease the volume while the" Data$ "slider may be used to quickly set the volume to somewhere" Data$ "near where you want it." Data$ "" Data$ ">The Filter>" Data$ "" Data$ "The Amiga's low-pass audio filter may be turned off and" Data$ "on using the Filter cycling button. Note that what is" Data$ "said on the button is what will happen when you click on" Data$ "it and not the state the filter's currently in." Data$ "So if it says `Filter On'" Data$ "then the filter is off and thus ready to be turned on." Data$ "You know it makes sense... (Yes, I know, I should have" Data$ "used radio buttons - but this was a rushed job. Okay?)" Data$ "" Data$ ">Stopping The Music>" Data$ "" Data$ "The cycling button that says either `Silence' or `Music'" Data$ "is for turning the music on and off. When it says" Data$ "`Silence' the music should be playing - with clicking" Data$ "on `Silence' turning it off. (Yes, it should have" Data$ "been radio buttons too.)" Data$ "" Data$ ">The Music>" Data$ "" Data$ "Below the word `Music' is a box containing the modules" Data$ "you can listen to. The one selected will be highlighted." Data$ "To choose another just click on its title. The reason for" Data$ "Mike Richmond's `Tension' being used again, (it was" Data$ "issue five's music), is becase it was corrupted before." Data$ "" Data$ ">/The Questionnaire Editor/>" Data$ "" Data$ "The Questionnaire part of SWSI is for the readers of" Data$ "ShareWorld to give their opinion of the various" Data$ "contributions to the magazine, the results of which" Data$ "appear in the Feedback section of the magazine. For" Data$ "each article, picture or whatever a rating can given" Data$ "and, if you wish, some comments added as well. These" Data$ "can be saved to disk and when complete, sent to" Data$ "the editor who'll add them to the next issue's Feedback." Data$ "" Data$ "The following is a description of the various features" Data$ "of the Questionnaire Editor. (You will have to open" Data$ "up the window to see them all.)" Data$ "" Data$ ">Name>" Data$ "" Data$ "Enter your name in the text-entry box to the right of" Data$ "the word `Name'. This is just so we can keep track of" Data$ "the various questionnaires returned and it *WON'T* appear" Data$ "in Feedback. If you want it made know that the comments" Data$ "are yours then say so at the end of each one." Data$ "" Data$ ">The Index Buttons>" Data$ "" Data$ "The `General', `Columns' etc. buttons mirror the Indexes" Data$ "in ShareWorld and are to let you quickly find the article" Data$ "you want to rate or to comment on." Data$ "" Data$ ">The Index Box>" Data$ "" Data$ "Below the Index Buttons is the Index itself where you" Data$ "can choose the contribution you want to rate or" Data$ "comment on. The buttons and slider on its right are" Data$ "for scrolling it. Also, just below the scrolling" Data$ "buttons are a left and right button for quickly" Data$ "moving back and forth through them." Data$ "" Data$ ">Colours>" Data$ "" Data$ "The twelve, coloured buttons to the right of the word" Data$ "`Colours' are for choosing the text and background" Data$ "colour of the text-editing box and the Help window." Data$ "" Data$ ">`#' `!' `?' `c' Making Your Opinion Felt>" Data$ "" Data$ "The four buttons at the top-left of the text-editing" Data$ "box are for you to give a rating to the contribution" Data$ "you've selected. It's a three-star system and the four" Data$ "buttons mean the following..." Data$ "" Data$ "# Not bad." Data$ "" Data$ "## Very good." Data$ "" Data$ "### Awesome! More, more, MORE please!" Data$ "" Data$ "? You didn't understand it." Data$ "" Data$ "! You thought it was crap." Data$ "" Data$ "c Clears the rating should you get it wrong." Data$ "" Data$ "Just click on these for each contribution," Data$ "(after you've selected them from the Index), and the" Data$ "results will appear just above the buttons." Data$ "" Data$ ">Comments>" Data$ "" Data$ "Should you have any comments on a contribution, after" Data$ "selecting it from the Index, type them into the text-entry" Data$ "box at the bottom of the window. Keep your comments as" Data$ "short as possible and don't waste space by just putting" Data$ "into words what you've indicated by whatever you gave as." Data$ "a rating. Feedback is a big enough file as it is!" Data$ "" Data$ "The text-editor is a pretty standard affair (I hope) and" Data$ "has the following features..." Data$ "" Data$ "*Word-wrap:* No need to press Return at the end of every" Data$ "line - just at the end of each paragraph. It also" Data$ "tidies itself up should you re-size its window." Data$ "" Data$ "*Cursor controls:* The cursors work as expected, (hopefully)," Data$ "and when used with shift will move to the top, bottom," Data$ "left or right of your comments." Data$ "" Data$ "*Delete:* A window will appear if you use shifted delete" Data$ "which will offer you the choice of deleting all of your" Data$ "current comments. This will *ONLY* delete the comments" Data$ "you're currently writing - and not any you've written" Data$ "about other contributions." Data$ "" Data$ "*Block Marking:* Text can be marked using the mouse" Data$ "pointer in the standard way, letting you cut, copy, paste" Data$ "and delete you text." Data$ "" Data$ "And that's about it. After you've rated and commented on" Data$ "all the contributions you can be bothered with, save the" Data$ "completed Questionnaire to disk using `Save As' from the" Data$ "Project menu. (That's `Save As' - *NOT* `Save Comments'" Data$ "from the Comments menu.) You can also load them back in" Data$ "again so you don't have to fill it all in in the one" Data$ "sitting." Data$ "" Data$ ">/The Menus/>" Data$ "" Data$ "The three menus work in the standard Amiga way, meaning" Data$ "they can also be activated by pressing the right Amiga" Data$ "key and their keyboard equivilent - `Right Amiga O' for" Data$ "Open and so on." Data$ "" Data$ ">*Project Menu*>" Data$ "" Data$ ">New `N'>" Data$ "" Data$ "Erases *everything* you've entered. You'll be given the" Data$ "option of canceling." Data$ "" Data$ ">Open `O'>" Data$ "" Data$ "Opens a file requestor and allows you to load in a" Data$ "previously saved file containing Questionnaire data." Data$ "" Data$ ">Save `S'>" Data$ "" Data$ "Saves the Questionnaire data to disk without using a file" Data$ "requestor. However, a requestor will appear if you've" Data$ "not already saved or loaded the Questionnaire data" Data$ "since starting SWSI." Data$ "" Data$ ">Save As `A'>" Data$ "" Data$ "Opens a requestor and allows you to save the Questionnaire" Data$ "data to disk." Data$ "" Data$ ">About `?'>" Data$ "" Data$ "Opens a window giving you some info on this progam." Data$ "" Data$ ">Help `Help'>" Data$ "" Data$ "Opens a window, (meaning the window you're reading this" Data$ "in), which contains the documentation to this program - meaning" Data$ "these docs. Along with using the gadgets on the right of" Data$ "window to scroll through the docs, you can also click on" Data$ "the text in the window and while holding the mouse" Data$ "button down scroll the text up and down by moving the" Data$ "mouse up and down." Data$ "" Data$ ">Quit `Quit'>" Data$ "" Data$ "Exits the program. Make sure you've saved your" Data$ "Questionnaire results before you do this." Data$ "" Data$ ">*Edit Menu*>" Data$ "" Data$ ">Cut `X'>" Data$ "" Data$ "Cuts a marked block of text out of your comments and" Data$ "stores it so it may be pasted back in using `Paste'." Data$ "" Data$ ">Copy `C'>" Data$ "" Data$ "Copies a marked block of text from your comments and" Data$ "stores it so it may be pasted back in using `Paste'." Data$ "" Data$ ">Paste `V'>" Data$ "" Data$ "Pastes previously `Cut' or `Copied' text back into" Data$ "comments." Data$ "" Data$ ">*Comments Menu*>" Data$ "" Data$ ">Save Comments `M'>" Data$ "" Data$ "This opens a requestor and allows you to save the" Data$ "comments you've written to disk. This is so" Data$ "you can then turn them into an article if you think" Data$ "they're getting a bit long for the meant-to-be-brief" Data$ "Questionnaire comments. This only saves the current" Data$ "comments that are displayed in the Comments' window" Data$ "and not all the comments you've so far entered." Data$ "" Data$ ">Delete Comments `D'>" Data$ "" Data$ "This deletes all of the currently displayed comments." Data$ "" Data$ ">Previous `<'>" Data$ "" Data$ "Moves you back a contribution - meaning up the menus." Data$ "" Data$ ">Next `@'>" Data$ "" Data$ "Moves you forward a contribution - meaning down the menus." Data$ "" Data$ ">/Finally/>" Data$ "" Data$ "Hopefully all this makes sense and the readers of" Data$ "ShareWorld Six use it - as it'll make the editor's job of" Data$ "compiling the next issue's Feedback a lot easier." Data$ "" Data$ "I fully expect this to be pretty bug-ridden - especially" Data$ "in the text-editor. It was a rushed job and hasn't had" Data$ "much testing. I also expect it to crash when memory" Data$ "is low as Blitz doesn't handle low-memory too well." Data$ "However, if you're carefull you /should/ be able to" Data$ "fill in a Questionnaire with it - so good luck." Data$ "" Data$ "Anyway, have fun, and any Questionares you fill in should" Data$ "be sent to..." Data$ "" Data$ ">Carl Read><" Data$ ">CyberCraft><" Data$ ">PO Box 14032><" Data$ ">Mayfair><" Data$ ">Hastings 4201><" Data$ ">NEW ZEALAND><" Data$ "*"