
PRELIMINARY - - - - - - - - 09/01/2004
Protocol version not yet 1.  
  But 0x01 will be its version for inter-prtocol purposes.

This protocol is only intended to replace current protocol.  Because current protocol
not expanable

SMLAN PROTCOL TCP/8765

Protcol is entirelly packaged in EzSockets Data Packets (use send and receive packet)

This will prevent any out-of-sync errors with future or past versions.

The protocol is impervious to fragmented, or bonded TCP packets.

Basic Representation:

Octet 0123 4 5
     +----+-+---//--+
     |ssss|C|Payload|
     +----+-+---//--+

ssss    - size of packet, stripped and created by ezsockets
C       - Command.
Payload - variable size based on command

The payload may contain more data than expected, i.e. new protocol version.

If the size is 	"NT" then that means it's a null-terminating string.
		"MSN" most significant 4 bits
		"LSN" least significant 4 bits


Note: Primary player is 0x0, secondary player is 0x1

CLIENT to SERVER protocol:

000:	No Operation
 Desc:		This command will cause server to respond with a no op responce.
 Payload:	None
 Responce:	Server 001
 
001:	No Operation Responce
 Desc:		This command is used to respond to a no operation.
 Payload:	None
 Responce:	None

002:	Hello
 Desc:		This is the first packet from a client to server, stating below 
		information  (NOTE: Names are no longer sent in this packet)
 Payload:	
    Size	Description:
    1		Client protocol version
    NT		Name of build of StepMania
 Responce:	Server 002



003:	Game Start Request
 Desc:		This command is called once after most loading is done, and
		again immediately before the sound starts.
 Payload:	
    Size	Description
    MSN		Primary player difficulty (feet)   (0 for no player)
    LSN		Secondary player difficulty (feet) (0 for no player)
    MSN		Primary player difficulty (0=Beginner, 1=easy, etc.) 
    LSN		Second player difficulty (0=Beginner, 1=easy, etc.)
    MSN		Start Position (0 is pre-sync, 1 is for sync)
    LSN		Reserved
    NT		Song Title
    NT		Song Subtitle
    NT		Song Artist   
    NT		Course Title     (If none exists; make it just a null)
    NT		Song Options (in string-format)
    NT		Primary Player's options
    NT		Secondary Player's Options (Null if non-existant)
    
 Responce: 	Server 003


004:	Game Over Notice
 Desc:		This command is sent when end of game is encounterd
 Payload:	None.
 Responce:	None.

005:	Game Status update
 Desc:		Updates game info for each step
 Payload:
    Size	Description
    MSN		Player #
    LSN		StepID 
		1: Miss
		2: Boo
		3: Good
		4: Great
		5: Perfect
		6: Marvelous
		7: NG
		8: OK

    MSN		Projected Grade (StepMania enum int)
    LSN		Reserved
    4		Net-order long containing score.
    2		Net-order int containing combo.
    2		Net-order int containing health.
    2		Net-order # containing offset
			32767 would be DEAD on the note
			If the user is hitting late, the # will be higher
			It if the user is exactly 0.25 seconds off, the
			number will be different by 500, if 0.5, it will be
			different by 1000.
 Responce:	None.

006: Style Update    (PLEASE NOTE THIS HAS NOTHING TO DO WITH SERVER COMMAND 6)
 Desc:		This is sent when a style is chosen.  
 Size:
    1		# of enabled players (1 means 1, 2 means 2)
    1		Player #   (0 means 1st, 1 means 2nd)
    NT		Player Name for #
   (Additional player's and #'s) (enabled players ONLY)

 Responce:	None

007:	Chat message
 Desc:		The user typed a message for general chat.
 Size:
    NT		Message

008:	Request Start Game and Tell server existance/non existance of song.
 Desc:		The user selected a song on a Net-enabled selection
 Size:
    1		Usage of message
		0: (in responce to server 8) User has specified song
		1: (in responce to server 8) User does NOT have specified song
		2: User requested a start game on given song
    NT		Song Title    (As gotten by GetTranslitMainTitle)
    NT		Song Artist   (As Gotten by GetTranslitArtist)
    NT		Song Subtitle (As gotten by GetTranslitSubTitle)

009: //Reserved

010:	User entered/exited Network Music Selection Screen
 Size:
    1		
		If this value is 0 then the user exited the screen
		If this value is 1 then the user entered the screen
		If this value is 2 then the user entered the options screen
		If this value is 3 then the user came from options screen

011:	User has changed player options
 Size:
    NT		Player 0's options
    NT		Player 1's options

SERVER to CLIENT protocol: (begins at 128)

NOTE: Server responces always add 128, thus a server responce for no operation
	is 128, not 000

000:	No Operation 
 Desc:		This command will cause server to respond with a no op responce.
 Payload:	None
 Responce:	Server 001

001:	No Operation Responce
 Desc:		This command is used to respond to a no operation.
 Payload:	None
 Responce:	None

002:	Server Hello Responce
 Desc:		This introduces the server.
 Payload:
    Size	Description
    1		Server protocol version
    NT		Server Name

003:	Allow Start
 Desc:		This will cause the client to start the game.
 Payload:	None
 Responce:	None

004: Game over stats
 Desc:		this packet is send in responce to the game over packet
		it contains information regarding how well each player did.
 Payload:
    1		# of players sent in this packet (active players)
	The way this works is to send every player's info for a given
	 field.  Like every player's score will be sent first, then every
	 player's grade.
    1		First player's player ID
	<Other player's IDs>
    4		Score
	<Other player's scores>
    1		Grade
	<Other player's Grades>
    1		Difficulty (0=beginner, 1=light, etc.)
	<Other player's difficulties>
    2           miss
	<Other player's misses>
    2		boo		
	<Other player's boos>
    2		good (All players)
    2		great (All players)
    2		perfect (All players)
    2		marvelous (All players)
    2		ok (All players)
    2		max_combo (All players)
    NT		Player's options
	<Other player's options>


005: 	Scoreboard update
 Desc:		This will update the client's scoreboard.
 Payload:	
    Size
    1		Which section
		0: Names
		1: Combos
		2: Projected Grades
    1		# of players to display

	If Names, then:
    1		Player in first place's ID
    1		Player in second place's ID
    ...
    1		Last player's ID
	If Combos, then:
    2		First player's combo
    2		Second Player's combo
    ...
    2		Last player's combo
	If Project grades
    1		Player 1's grade (in the same format used when reporting projected grades)
    1		Player 2's grade
    ...
    1		Last player's projected grade


006: 	System Message  (PLEASE NOTE THIS HAS NOTHING TO DO WITH CLIENT COMMAND 6)
 Desc: 		Send system message to user
 Payload:
    Size	Description
    NT		Message

007:	Chat Message
 Desc:		Add a chat message to the chat window on some StepMania screens.
 Payload:	
    Size	Description
    NT		Message

008:	Tell client to start song/ask if client has song
 Desc:		The user selected a song on a Net-enabled selection
 Size:
    1		Usage of message
		0: See if client has song
		1: See if client has song, if so, scroll to song
		2: See if client has song, if so, scroll to song, and play that song
		3: Blindly start song
    NT		Song Title    (As gotten by GetTranslitMainTitle)
    NT		Song Artist   (As Gotten by GetTranslitArtist)
    NT		Song Subtitle (As gotten by GetTranslitSubTitle)

009:	Update user list
 Desc:		This sends all the users currently connected
 Size:
    1		Max # of players
    1		# of players in this packet
    1		Player 0's status
    NT		Player 0's name (if there is no player here... make it a null (""))
    1		Player 1's status
    NT		Player 1's name
    ...
    1		Last player's status
    NT		Last player's name
     Status:  
	0	Inative (no info on this user yet)
	1	Active (you know who it is)

010:	Force change to Networking select music screen.
 Size:
    NT		Set Specified gametype
    NT		Set Specified style

011:	Reserved

///Potential for SMOnline/SMLAN  (Changed to 020)
020:	SMonline Packet.  (Adam)
      Bytemap(Game Packet - SMO/TCP[C=010] Data)
      +----+---//---+-+---//---+-+---+------+-----+
      |iiii|GameName|0|SongName|0|pmd|Length|Steps|
      +----+-//-----+-+-//-----+-+---+------+-----+
      Byte[4]      iiii         IPAddress of Host/Creator(WAN)
      char*        GameName     Name of the Game
      char*        SongName     Title of the Song
      Byte         p            Current number of Players
      Byte         m            Maximum allowed Players(Set by creator; values 1-14 valid)
      Enum Byte    d            Average Player Difficulty(values 0-4 valid)
      Long         Length       Length of .sm file for Song in Bytes(For validation)
      Long         Steps        Total number of steps in all stepcharts for this song(For validation)

