
PRELIMINARY - - - - - - - - 05/03/2004
Protocol version 4  
  But 0x04 will be its version for inter-protocol 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, handled by ezsockets (if you're using C++)
C       - Command.
Payload - variable size based on command

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


In the following protocol, the term size means the size of the chunk of data.
If the "size" is	"NT" then that means it's a null-terminating string.
			"MSN" most significant 4 bits (byte/16)
			"LSN" least significant 4 bits (byte%16)


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 response.
 Payload:	None
 Response:	Server 001
 
001:	No Operation Response
 Desc:		This command is used to respond to a no operation.
 Payload:	None
 Response:	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
 Response:	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 (Null if non-existant)
    NT		Secondary Player's Options (Null if non-existant)
    
 Response: 	Server 003


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

005:	Game Status update
 Desc:		Updates game info for each step
 Payload:
    Size	Description
    MSN		Player #
Protocol <= 2
    LSN		StepID 
		1: Miss
		2: W5
		3: W4
		4: W3
		5: W2
		6: W1
		7: LetGo
		8: Held
Protocol >= 3
    LSN		StepID
		1: HitMine
		2: AvoidMine  
		3: Miss
		4: W5
		5: W4
		6: W3
		7: W2
		8: W1
		9: LetGo
		10: Held

    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.
 Response:	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)

 Response:	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 response to server 8) User has specified song
		1: (in response 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			
		0: exited ScreenNetSelectMusic
		1: entered ScreenNetSelectMusic
		2: **Not Sent**
		3: entered options screen
		4: exited the evaluation screen
		5: entered evaluation screen
		6: exited ScreenNetRoom
		7: entered ScreenNetRoom

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


012:	SMOnline Packet.	//SPECIAL CASE!!!
	NOTE: The smonline packet is not defined here.
	The SMLan packet 12 is a wrapper for the SMOnline packet.
	This is so that we can have "protection" of sorts when 
	it comes to the coding of SMOnline, so we don't have to
	use the lower level commands when dealing with SMOnline.
 Size:
    1		SMOnline command	//This used to say 2, but it looks like 1 in all cases
 <VARIABLE>	SMOnline data


013:	Reserved

014: 	Reserved

015: XML Packet.  This packet contains data in XML format.
 Size:
 	NT		XML

SERVER to CLIENT protocol: (begins at 128)

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

000(128):No Operation 
 Desc:		This command will cause server to respond with a no op response.
 Payload:	None
 Response:	Server 001

001(129):No Operation Response
 Desc:		This command is used to respond to a no operation.
 Payload:	None
 Response:	None

002(130):Server Hello Response
 Desc:		This introduces the server.
 Payload:
    Size	Description
    1		Server protocol version //NOTE: if protocol version is 128+, then this
			server is an SMOnline server
    NT		Server Name
    4		Random key ( at the moment only used for an alternate login method )

003(131):Allow Start
 Desc:		This will cause the client to start the game.
 Payload:	None
 Response:	None

004(132):Game over stats
 Desc:		this packet is send in response 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>

	#this next chunk of step types is actually reversed
    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:(133)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 index
    1		Player in second place's index
    ...
    1		Last player's index
	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:(134)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:(135)Chat Message
 Desc:		Add a chat message to the chat window on some StepMania screens.
 Payload:	
    Size	Description
    NT		Message

008:(136)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:(137)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)
	2	In Selection Screen
	3	In Options
	4 	In Evaluation

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

011:(139)Reserved


012:(140)SMOnline Packet.	//SPECIAL CASE!!!
	NOTE: The smonline packet is not defined here.
	The SMLan packet 12 is a wrapper for the SMOnline packet.
	This is so that we can have "protection" of sorts when 
	it comes to the coding of SMOnline, so we don't have to
	use the lower level commands when dealing with SMOnline.
 Size:
    1		SMOnline command
 <VARIABLE>	SMOnline data


013:(141)Formatted information packet
 Desc:		Send formatted information regarding the server back to the player.
		NOTE: The purpose of this function is alternatively to be a broadcast
		packet.  (You can expect it via UDP broadcast)
 Size:
    NT		Server Name
    2		Port the server is listening on
    2		Number of players connected

014:(142)Attack Client
 Size:
    1		Player Number
    4		Time to Last (in MS)
    NT		Text describing modifiers.

015:(143)  XML reply. Contains XML
 Size:
	NT		XML
	

----------------------------------------------------------------
Client SMOnline packets:
000:  Send Login Information
 Size:
    1		Player Number
    1		Encryption text
		0: MD5 hash
		1: MD5 ( MD5 hash + salt ) (salt is plain text, base 10 string )
    NT		Username
    NT		Password

  Note: The client is not permitted to use method (1) for authentication
	if the salt it received from the server is 0

001: User asks to enter room
 Size:
    1		Enter/Exit?
		0: User wishes to exit room
		1: User wishes to enter room 
    NT		Room Name (Used when entering rooms)
    NT		Password (Empty if password not used)

002: Create a new Room
 Size:
    1		Room Type
		0: Normal room (has sub rooms)
		1: Game room (no sub rooms)
    NT		Room Title
    NT		Room Description
    NT		Room Password (blank if no password)

003: Requests Room Info
 Size:
    NT	Room Name


Server SMOnline packets:
000:  Login Response
    1		Approval Status
		0: Approved
		1: Approval Failed
    NT		Login response (plain text)

001:  Room Update (Changing rooms)
 Size:
    1		Type of update
		0: Change Room Title
		1: Update List of other rooms (or games)

	If Room Title Update:
    NT		Room Title
    NT		Room Description
    1		Type of room:
 		0: Chat room
		1: Game room
    1		Allows creation of sub room.
		0: Does not allow creation of subrooms
		1: Allows creation of subrooms
	
	If Room List Update:
    1		Number of rooms
    NT		Room1 Title
    NT		Room1 Description			
    NT		Room2 Title
    NT		Room2 Description
	...
    NT		RoomN Title
    NT		RoomN Description

    Room Status appended for reverse compatibility
    1		Room1 Status
		0: Normal Room
		1: Unused
		2: Room in game
		3: First stage of song selection has been done
		4: Second stage of song selection has been done
    1		Room2 Status
	...
    1		RoomN Status

    Room Flags appended for reverse compatibility
    1		Room1 Flags
			bit 0: Passworded if true
    1		Room2 Status
	...
    1		RoomN Status	

002:  Request general information from server.
    1		Format for stats
	0: Normal unformatted stats

003:  Room Info
  Size:
    NT	Last Song Title
    NT  Last Song Subtitle
    NT  Last Song Artist
    1		Num Players
    1		Max Players
    NT	Player1 Name
	...
    NT  PlayerN Name
