rem Multiplayer Functionality

gosub _findconnections : gosub _waitkey
gosub _findsessions : gosub _waitkey
gosub _createagame : gosub _waitkey
gosub _findplayers : gosub _waitkey
gosub _handlenetgame : gosub _waitkey
gosub _handlesimplemessages : gosub _waitkey
gosub _handlecomplexmessages : gosub _waitkey
gosub _destroyagame

rem End of Program
end

_findconnections:

rem Set Network Connection
perform checklist for net connections
cls : print "CONNECTIONS (Can Occur In Any Order)"
print
for c=1 to checklist quantity()
 print c;". ";checklist string$(c)
next c

rem Have User Select a Connection
SelectionIndex=0
if checklist quantity()=0
 print "No Connections Found"
else
 while SelectionIndex<1 or SelectionIndex>checklist quantity()
  print  : input "Select A Number>";SelectionIndex
  input "Enter Additional Data ( IP Address or PhoneNumber )>";data$
 endwhile
endif

rem Set Connection
if data$="" then set net connection SelectionIndex
if data$<>"" then set net connection SelectionIndex,data$

rem Prompt connection
print : print "SELECTED ";checklist string$(SelectionIndex)

return

_findsessions:

rem Set Network Session (Game On Selected Network Connection)
perform checklist for net sessions
cls : print "SESSIONS (Found on the Selected Connection)"
print
for c=1 to checklist quantity()
 print c;". ";checklist string$(c)
next c

rem Have User Select a Session
SessionIndex=0
if checklist quantity()=0
 print "No Sessions Found"
else
 while SessionIndex<1 or SessionIndex>checklist quantity()
  print  : input "Select A Number>";SessionIndex
 endwhile
endif

return

_createagame:

rem Create or Join a game
if SessionIndex=0
 PlayerMax=4 : KindOfGame=1
 create net game "gamename", "playername", PlayerMax, KindOfGame
else
 join net game SessionIndex, "playername"
endif

rem Was game created successfully
if net game exists()=1
 print : print "GAME SESSION STARTED"
else
 print "COULD NOT CREATE A SESSION"
 print "PRESS ANY KEY"
 wait key : end
endif

return

_findplayers:

rem Create an EXTRA Player (used rarely)
cls : print : print "EXTRA PLAYER CREATION"
PlayerNumber = create net player("NPC Player")

rem Find all current players in game
perform checklist for net players
print : print "PLAYERS (At Time Of Call)"
print
for c=1 to checklist quantity()
 print c;". ";checklist string$(c);" ID:";checklist value a(c);" UNIQUE:";checklist value b(c);" ";
 if checklist value c(c)=1 then print "(me) ";
 if checklist value d(c)=1 then print "(host) ";
 print
next c

rem Delete the EXTRA Player (used rarely)
print : print "EXTRA PLAYER DESTRUCTION"
free net player PlayerNumber

return

_handlenetgame:

rem Network game can change during session
while mouseclick()<>2
 cls : print "HANDLE NET GAME (Right Mouse Button To Continue)" : print
 if net game now hosting()=1 then Hosting=1
 if Hosting=1 then PRINT "THIS PLAYER IS NOW HOSTING THE GAME"
 if net game lost()=1 then LostGame=1
 if LostGame=1 then PRINT "THE GAME SESSION WAS LOST"
 returnvalue=net player created()
 if returnvalue>0 then PlayerIn=returnvalue
 if PlayerIn>0 then PRINT "A NEW PLAYER HAS JOINED THE GAME (";PlayerIn; ")"
 returnvalue=net player destroyed()
 if returnvalue>0 then PlayerOut=returnvalue
 if PlayerOut>0 then PRINT "A PLAYER HAS LEFT THE GAME (";PlayerOut; ")"
 sync
endwhile

return

_handlesimplemessages:

rem Network game can communicate numbers and strings
while inkey$()<>"x"
 cls : print "HANDLE NET MESSAGES (Press X To Continue)"

 rem Show Latest Return Values
 print
 print "TO: ";ReturnTo
 print "FROM: ";ReturnFrom
 print "INTEGER: ";ReturnInteger
 print "FLOAT: ";ReturnFloat#
 print "STRING: ";ReturnString$
 print

 rem Send Part
 if mouseclick()=1
  print "SENDING..."
  send net message integer 0,mousex()
  send net message float 0,mousey()*1.0
  send net message string 0,"hello world"
 endif

 rem Receive Part (from all other players)
 get net message
 if net message exists()=1 then print "RECEIVING..."
 while net message exists()=1
  ReturnTo=net message player to()
  ReturnFrom=net message player from()
  if net message type()=1 then ReturnInteger=net message integer()
  if net message type()=2 then ReturnFloat#=net message float()
  if net message type()=3 then ReturnString$=net message string$()
  get net message
 endwhile

 sync

endwhile

return

_handlecomplexmessages:

rem Network game can communicate sounds, images and 3D data
while inkey$()<>"z"

 rem User Prompt
 cls : print "HANDLE ADVANCED NET MESSAGES (Press Z To Continue)"
 print "PRESS [1] through [5] to SEND RESOURCE"

 rem Show Latest Return Values
 print
 print "TO: ";ReturnTo
 print "FROM: ";ReturnFrom
 print "MEMBLOCK: ";ReturnMemblockIndex
 print "IMAGE: ";ReturnImageIndex
 print "BITMAP: ";ReturnBitmapIndex
 print "SOUND: ";ReturnSoundIndex
 print "MESH: ";ReturnMeshIndex
 print

 rem Send Part
 k$=inkey$()
 if k$>="1" and k$<="5"
  print "SENDING..."
  GuarenteePacket=1
  if k$="1"
   MemblockIndex=1
   make memblock MemblockIndex, 1024
   send net message memblock 0, MemblockIndex, GuarenteePacket
   delete memblock MemblockIndex
  endif
  if k$="2"
   ImageIndex=1
   get image ImageIndex, 0, 0, 64, 64
   send net message image 0, ImageIndex, GuarenteePacket
   delete image ImageIndex
  endif
  if k$="3"
   BitmapIndex=1
   load bitmap "face.bmp", BitmapIndex
   send net message bitmap 0, BitmapIndex, GuarenteePacket
   delete bitmap BitmapIndex
  endif
  if k$="4"
   SoundIndex=1
   load sound "gun.wav", SoundIndex
   send net message sound 0, SoundIndex, GuarenteePacket
   delete sound SoundIndex
  endif
  if k$="5"
   MeshIndex=1
   load mesh "mesh.x", MeshIndex
   send net message mesh 0, MeshIndex, GuarenteePacket
   delete mesh MeshIndex
  endif
 endif

 rem Receive Part (from all other players)
 get net message
 if net message exists()=1 then print "RECEIVING..."
 while net message exists()=1
  ReturnTo=net message player to()
  ReturnFrom=net message player from()
  if net message type()=4
   ReturnMemblockIndex=1
   net message memblock ReturnMemblockIndex
   print "MEMBLOCK SIZE:";get memblock size(ReturnMemblockIndex)
   sync
   delete memblock ReturnMemblockIndex
  endif
  if net message type()=5
   ReturnImageIndex=1
   net message image ReturnImageIndex
   paste image ReturnImageIndex,50,50
   sync
   delete image ReturnImageIndex
  endif
  if net message type()=6
   ReturnBitmapIndex=1
   net message bitmap ReturnBitmapIndex
   copy bitmap ReturnBitmapIndex,0
   sync
   delete bitmap ReturnBitmapIndex
  endif
  if net message type()=7
   ReturnSoundIndex=1
   net message sound ReturnSoundIndex
   play sound ReturnSoundIndex
   sync
   delete sound ReturnSoundIndex
  endif
  if net message type()=8
   ReturnMeshIndex=1
   net message mesh ReturnMeshIndex
   backdrop off
   make object 1,ReturnMeshIndex,0
   sync
   delete object 1
   delete mesh ReturnMeshIndex
  endif
  get net message
 endwhile

 rem Update screen
 sync

endwhile
return

_destroyagame:

rem Free the current game session
free net game

return

_waitkey:
 print : print "Press Any Key"
 wait key
return