TGC Codebase Backup



A very basic chat program by IanM

18th Sep 2003 16:31
Summary

A very basic chat program. Allows up to 8 users to join



Description

Um, well actually the short description covers it.

'A very basic chat program. Allows up to 8 users to join'



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    #constant MAX_PLAYERS   8
#constant MAX_MESSAGES  25

#constant COL_INFO      rgb(255,255,0)
#constant COL_ERROR     rgb(255,0,0)
#constant COL_USER      rgb(255,255,255)
#constant COL_MESSAGE   rgb(255,255,255)

` Storage for player name info, so that we don't have to keep interrogating the system
type PlayerCache_t
   PlayerID as integer
   PlayerName as string
endtype
dim PlayerCache(MAX_PLAYERS) as PlayerCache_t

` Storage for the last 20 messages
type Message_t
   MessageText as string
   Colour as dword
endtype
dim Messages(MAX_MESSAGES) as Message_t

` Local storage
Name as string
UserMessage as string

` Make DBPro play nice with the system
sync off

input "Enter your name : ", Name
clear entry buffer

` Make up a random name for now
if Name = ""
   randomize timer()
   Name = "Unknown " + str$( rnd(32767) )
endif

` Lets get online
ConnectToChat( Name )

` Keep going until the escape key is pressed
disable escapekey
while escapekey() = 0

   WelcomeNewPlayers()
   GoodbyeToDeadPlayers()

   ReceiveMessage()

   DisplayMessages()

   ` If the user gives us a complete message to send, forward it on
   UserMessage = InputUserMessage()
   if UserMessage <> ""
      if left$(UserMessage,1) = "/"
         CarryoutUserCommand(UserMessage)
      else
         SendMessage(UserMessage)
      endif
   endif

endwhile

` All done
ExitChat()
end


function ConnectToChat(Name as string)
   local PlayerNumber as integer

   ` Connect to the chat session
   AddMessage("Attempting to connect to the chat session", COL_INFO)
   DisplayMessages()
   PlayerNumber = default net game("chat", Name, MAX_PLAYERS, 2)
   AddMessage("", 0)
   AddMessage("Connected as " + Name, COL_INFO)

   ` Ensure that we have everyones name
   RefreshPlayerCache()
endfunction

function RefreshPlayerCache()
   local i as integer

   ` Clear the current list of names
   for i = 1 to MAX_PLAYERS
      PlayerCache(i).PlayerID = 0
   next i

   ` Query for the new list
   perform checklist for net players

   ` Copy the names and ID's to our cache
   for i = 1 to checklist quantity()
      PlayerCache(i).PlayerID = checklist value a(i)
      PlayerCache(i).PlayerName = checklist string$(i)
   next i

endfunction

function GetPlayerName(PlayerNumber)
   local i as integer

   ` Search for the player ID in the cache and return the name
   for i = 1 to MAX_PLAYERS

      if PlayerCache(i).PlayerID = PlayerNumber
         exitfunction PlayerCache(i).PlayerName
      endif

   next i

endfunction "Unknown"

function WelcomeNewPlayers()
   local NewPlayer as integer

   ` If a new player joins we detect it here
   NewPlayer = net player created()
   if NewPlayer > 0

      ` Get the latest list of players
      RefreshPlayerCache()

      ` If we are the main server, send a welcome message
      if net game now hosting()
         send net message string NewPlayer, "Welcome to the chat"
      endif

      ` and notify that someone just joined
      AddMessage( GetPlayerName( NewPlayer ) + " : Just joined", COL_INFO )
   endif
endfunction

function GoodbyeToDeadPlayers()
   local DeadPlayer as integer

   ` If someone leaves we detect it here
   DeadPlayer = net player destroyed()
   if DeadPlayer > 0

      ` and let everyone know.
      ink rgb(255,0,0), 0
      AddMessage("Just left : " + GetPlayerName(DeadPlayer), COL_INFO)
   endif
endfunction

function ReceiveMessage()
   local Result as string

   ` Check for new messages and loop until we got them all
   get net message
   while net message exists() > 0
      ` Only accepting strings for the moment - anything else is illegal
      if net message type() = 3
         ink rgb(255,255,255), 0
         AddMessage(GetPlayerName( net message player from() ) + " : " + net message string$(), COL_MESSAGE)
      else
         ink rgb(255,0,0), 0
         AddMessage("Illegal message type received from " + GetPlayerName( net message player from() ), COL_ERROR)
      endif

      get net message
   endwhile

endfunction Result

function SendMessage(UserMessage as string)
   AddMessage("ME : " + UserMessage, COL_USER)
   send net message string 0, UserMessage
endfunction

global CurrentInput as string

function InputUserMessage()
   local Result as string
   local Char as string
   local i as integer

   ` If anything is in the keyboard entry buffer we add the characters one by one to the current input string
   if entry$() <> ""
      for i = 1 to len( entry$() )
         Char = mid$( entry$(), i )

         ` If it's a backspace, remove the last character
         if Char = chr$( 8 )
            if CurrentInput <> "" then CurrentInput = left$( CurrentInput, len(CurrentInput)-1 )
         else
            ` If it's a valid character add it to the buffer
            if asc( Char ) >= 32 && asc( Char ) < 128 then CurrentInput = CurrentInput + Char

            ` If it's a return, pass on what we got and start again
            if asc( Char ) = 13
               Result = CurrentInput
               CurrentInput = ""
            endif
         endif
      next i

      ` Clear out the buffer
      clear entry buffer
   endif
endfunction Result

function AddMessage(UserMessage as string, Colour as dword)
   local i as integer

   ` Scroll up all messages 1 line
   for i=1 to MAX_MESSAGES-1
      Messages(i) = Messages(i+1)
   next i

   ` Record the current message
   Messages(MAX_MESSAGES).MessageText = UserMessage
   Messages(MAX_MESSAGES).Colour = Colour
endfunction

function DisplayMessages()
   local i as integer

   ` Clear the screen
   cls

   ` Output all messages
   for i=1 to MAX_MESSAGES
      ink Messages(i).Colour, 0
      text 0, (i-1)*15, Messages(i).MessageText
   next i

   ` Output what the user has typed so far
   ink COL_USER, 0
   text 0, 400, "> " + CurrentInput + "_"
endfunction

function CarryoutUserCommand(UserMessage as string)
   UserMessage = lower$( right$( UserMessage, len(UserMessage)-1 ) )
   select UserMessage
      case "help"    : DisplayHelp()                                                   : endcase
      case "quit"    : ExitChat()                                                      : endcase
      case "who"     : DisplayUsers()                                                  : endcase
      case default   : AddMessage("Unknown user command : " + UserMessage, COL_ERROR)  : endcase
   endselect
endfunction

function ExitChat()
   free net game
   end
endfunction

function DisplayUsers()
   local i as integer

   ` Display the cached list of users
   AddMessage("Who's logged on:", COL_INFO)
   for i=1 to MAX_PLAYERS
      if PlayerCache(i).PlayerID > 0
         AddMessage("    " + PlayerCache(i).PlayerName, rgb(128,255,128))
      endif
   next i
endfunction

function DisplayHelp()
   AddMessage("HELP:", COL_INFO)
   AddMessage("    /help      This help", COL_INFO)
   AddMessage("    /quit      Exit chat", COL_INFO)
   AddMessage("    /who       List currently connected users", COL_INFO)
endfunction