; ÍŐŘĂČÁÔ˛®ÁĂÔ v.0.0››; Multi-user chat sample program for›; the Multiplexer!››; Original BASIC code by:›; Robert Puff (?)›; Computer Software Services, 1990››; Action! conversion and more features:›; Bill Kendrick›; New Breed Software, 1995›››; Chat commands:›; Msg Send Msg to all›; /User Msg Send Msg to User›; /W Show who is online›; /Q Quit››INCLUDE "D3:RUNTIME.ACT"›››; Çěďâáěóş›Char Array Name(21),Msg(128),Q(130),› Who(21),Line(40)›Byte Node,Done›Card OError›Byte KeyCode=764,BufLen=747›Byte Chn=[1],MsgPipe=[20],› NamePipe=[28],LocPipe=[36]›Byte TX,TY,L››Proc MuxErr()› Byte ErrV=195›› Print("Error ")› PrintB(ErrV)› PrintE(" accessing M: device!")› Error=OError›Return››; Íş ŘÉĎ ăáěě›Proc MXIO(Byte Cmd, Aux1, Aux2)› XIO(Chn,0,Cmd,Aux1,Aux2,"M:")›Return››; Íş Óôáôőó ăáěě›Proc MStatus()› MXIO(13,0,0)›Return››; Íş ˘×čáô îďäĺ áí Éż˘ ăáěě››Byte Func GetNode(Byte A Byte B Byte C)›Return(C-1)››Byte Func MNodeNum()› Byte N›› MXIO(13,0,0)› N=GetNode()›Return(N)››; Ăáóĺ­éçîďňéîç óôňéîç ăďíđáňĺ›Char Func UCase(Char C)› If C>='a And C<='z Then› C=C-32› Fi›Return(C)››Byte Func SUCCompare(Char Array S1, S2)› Byte V› Char Array X1(130), X2(130)›› For V=0 To S1(0) Do› X1(V)=UCase(S1(V))› Od› For V=0 To S2(0) Do› X2(V)=UCase(S2(V))› Od›› V=SCompare(X1,X2)›Return(V)›››; ×ňéôĺ ôď ÷éîäď÷›Proc Say(Char Array T)› Position(TX,TY)› Poke(766,1)› Print(T)› Poke(766,0)› TX=TX+T(0)›Return››Proc SayE(Char Array T)› Position(TX,TY)› Poke(766,1)› Print(T)› Poke(766,0)› TX=0› TY=TY+1› If TY>19 Then› TY=19› Position(0,0)› Put('ś)› Position(0,19)› Put('ť)› Fi›Return››Proc SayB(Byte B)› Char Array T›› StrB(B,T)› Say(T)›Return››; Óđĺăéáě íĺóóáçĺ›Proc SpecialMsg()› Byte X›› For X=0 To 7 Do› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SCompare(Q,"In chat")=0 Then› ; They're in chat› MXIO(MsgPipe+X,0,128)› PrintD(Chn,Name)› PutD(Chn,32)› PrintDE(Chn,Msg)›; MXIO(18,0,0)› Fi› Fi› Od›Return››; Óĺîä íĺóóáçĺ›Proc SendMsg()› Byte X,Ok,Sent›› Sent=0› For X=0 To 7 Do› Ok=0› If Who(0)=0 Then› ; Ok if we talk to all› Ok=1› Else› ; And ok if it's our dest user› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Who)=0 Then› Ok=1› Fi› Fi› Fi›› ; Ok to send it?› If Ok=1 Then› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SCompare(Q,"In chat")=0 Then› ; They're in chat› Sent=1› MXIO(MsgPipe+X,0,128)› ; *privt* specl› If Who(0)=0 Then› PrintD(Chn,"<")› Else› PrintD(Chn,"*")› Fi› PrintD(Chn,Name)› If Who(0)=0 Then› PrintD(Chn,"> ")› Else› PrintD(Chn,"* ")› Fi› PrintDE(Chn,Msg)›; MXIO(18,0,0)› Fi› Fi› Fi› Od› ; Did we even send it?› If Sent=0 Then› If Who(0)=0 Then› SayE("Nobody else is here!")› Else› Say(Who)› SayE(" isn't here!")› Fi› Fi›Return››Proc Cls()› Poke(752,1)› Put(125)›› Position(0,20)› Print("")›› L=0› TX=0› TY=0›Return››; Óĺôőđ›Proc Setup()› Byte Ok,X›› Graphics(0)› PokeC(82,9984)› PokeC(709,15)› Poke(712,2)›› PrintE("}}×ĺěăďíĺ ôď ÍŐŘĂčáô ÉÉ")› PrintE("Original BASIC code: CSS 1990")› PrintE("Action! conversion: NBS 1995")› PutE()›› Close(Chn)› OError=Error› Error=MuxErr› Open(Chn,"M:",12,0)› Node=MNodeNum()›› ; Flush our pipes (just in case)› MXIO(LocPipe+Node,0,0)› MXIO(18,0,0)› MXIO(NamePipe+Node,0,0)› MXIO(18,0,0)› MXIO(MsgPipe+Node,0,0)› MXIO(18,0,0)›› Print("Your node is: [ ")› PrintB(Node+1)› PrintE(" ]")› PutE()›› Do› ; Get your username› PrintE("What is your name?")› InputS(Name)›› Ok=1› For X=1 To Name(0) Do› If Name(X)=32 Then› PrintE("No spaces allowed!")› PutE()› Ok=0› X=254› ElseIf Name(X)='/ Then› PrintE("No slashes allowed!")› PutE()› Ok=0› X=254› Fi› Od›› If Ok=1 Then› ; Make sure that username doesn't› ; already exist!› For X=0 To 7 Do› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Name)=0 Then› PrintE("Sorry! That name is in use!")› PutE()› Ok=0› X=254› Fi› Fi› Od› Fi› Until Ok=1 Od›› ; Store your username› MXIO(NamePipe+Node,0,128)› PrintDE(Chn,Name)› MXIO(18,0,0)›› ; You're in the chat area› MXIO(LocPipe+Node,0,128)› PrintDE(Chn,"In chat")› MXIO(18,0,0)›› Done=0›› Close(2)› Open(2,"K:",4,0)›› SCopy(Msg,"has joined!")› SpecialMsg()›› Cls()›Return››; ×čď éó ďî›Proc WhoIsOn()› Byte X›› SayE("The following people are online:")›› For X=0 To 7 Do› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› ; Get name› InputSD(Chn,Q)› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› ; Get location› InputSD(Chn,Msg)› › Say("Node #")› SayB(X+1)› Say(": ")› Say(Q)› Say(" is ")› SayE(Msg)› Fi› Fi› Od› SayE(" ")›Return››; Çĺô íĺóóáçĺ ćňďí Íş›Proc GetAnyMessage()› MXIO(MsgPipe+Node,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Msg)› SayE(Msg)› Fi›Return››; Óĺîä íĺóóáçĺ ćňďí ëĺůâďáňä›Proc SendAnyMessage()› Byte A,L2,NameDone,Ok,C› Char Array Msg2(128)›› Position(L+1,21)› Put('_)› If KeyCode<255 Then› Position(L+1,21)› Put(32)› C=GetD(2)› If C=155 Then› Line(0)=L› SCopy(Msg,Line)› Line(0)=0› L=0› Position(0,21)› Print(" ")› If Msg(0)<>0 Then› If SUCCompare(Msg,"/Q")=0 Then› ; /Q = quit› Done=1› ElseIf SUCCompare(Msg,"/W")=0 Then› ; /W = who is on› WhoIsOn()› ElseIf SCompare(Msg,"/?")=0 Or› SUCCompare(Msg,"/H")=0 Or› SUCCompare(Msg,"/HELP")=0 Then› ; /? /H /HELP = help› SayE("ČĹĚĐş")› SayE("msg = send message to everyone")› SayE("/user msg = send private message to")› SayE(" user")› SayE("/Q = quit")› SayE("/W = who is on")› SayE("/CLS = clear screen")› SayE(" ")› ElseIf SUCCompare(Msg,"/CLS")=0 Then› Cls()› Else› Who(0)=0› If Msg(1)='/ Then› ; /name = private› NameDone=0› L2=0› For A=2 To Msg(0) Do› If Msg(A)=32 And NameDone=0 Then› NameDone=1› L2=0› Else› If NameDone=0 Then› L2=L2+1› Who(L2)=Msg(A)› Who(0)=L2› Else› L2=L2+1› Msg2(L2)=Msg(A)› Msg2(0)=L2› Fi› Fi› Od› SCopy(Msg,Msg2)› Fi›› ; Don't let them send private› ; messages to themselves!!› Ok=1› MXIO(NamePipe+Node,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Who)=0 Then› Ok=0› SayE("Don't talk to yourself!")› Fi› Fi› If Ok=1 Then› SendMsg()› Fi› Fi› Fi› ElseIf C='~ Then› If L>0 Then› L=L-1› Fi› ElseIf C='ś Then› Line(0)=0› L=0› Position(0,21)› Print(" ")› Else› If L<38 Then› L=L+1› Line(L)=C› Position(L,21)› Put(27)› Put(C)› Fi› Fi› Fi›Return››; Ĺřéô›Proc Xit()› SCopy(Msg,"has left!")› SpecialMsg()›› ; Flush our pipes› MXIO(LocPipe+Node,0,0)› MXIO(18,0,0)› MXIO(NamePipe+Node,0,0)› MXIO(18,0,0)› MXIO(MsgPipe+Node,0,0)› MXIO(18,0,0)› Close(Chn)› Close(2)›Return›››; Íáéî›Proc Main()› Setup()› WhoIsOn()›› Do› GetAnyMessage()› SendAnyMessage()› Until Done=1 Od›› Xit()›Return››