マッチングサーバー

プロトコルを考えてみたりですにゃ。

  • 扱う文字コードUTF-16にゃで。
  • 親と子みたいな感じに区別
  • マッチング人数 2〜32人
  • チャットは無し(あるとトラブルにゃの元にゃので)
  • キックもにゃし
  • キーデータを送るタイプにゃのフレーム同期タイプ(2バイトを共有するにゃ)
  • リレーサーバーみたいにゃ感じで、ピアピアにはしにゃい。
  • 1〜3フレームぐらいにゃのレイテンシ
// Init
C2S - Hello
/* +0   1 */ PacketType		// 0x00:"Hello"
/* +1   2 */ Client Version	// Client Version
/* +3  64 */ ApplicationId	// Application ID(UTF-16)
/* +67 64 */ UserName		// UserName(UTF-16)

S2C - Hello Res
/* +0  1 */ PacketType		// 0x01:"Hello Res"
/* +1  1 */ ResultCode		// Result Code
							//  RESULT_CODE_SUCCESS               成功した
							//  RESULT_CODE_ERROR_CONNECTION_DENY 接続拒否された(失敗)
							//  RESULT_CODE_ERROR_ILLEGAL_VERSION バージョン不一致(失敗)
							//  RESULT_CODE_ERROR_NO_SURVICE      サービスしていないアプリケーションID(失敗)
// MatchMaking - Parent
C2S - CreateRoom
/* +0    1 */ PacketType	// 0x10:"CreateRoom"
/* +1    1 */ MemberMax		// 最大人数(1〜32)
/* +2   64 */ GameId		// ゲーム固有の識別子(UTF-16)
/* +66 128 */ RoomName		// ルーム名(UTF-16)

S2C - CreateRoom Res
/* +0    1 */ PacketType	// 0x11:"CreateRoom Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS             成功した
							//  RESULT_CODE_ERROR_ROOM_OVER     ルーム数が一杯で失敗した
							//  RESULT_CODE_ERROR_FAILED        ルーム作成に失敗した
							//  RESULT_CODE_ERROR_ILLEGAL_PARAM パラメータが不正

C2S - DestroyRoom
/* +0    1 */ PacketType	// 0x12:"DestroyRoom"

S2C - DestroyRoom Res
/* +0    1 */ PacketType	// 0x13:"DestroyRoom Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS             成功した
							//  RESULT_CODE_ERROR_FAILED        失敗した

C2S - StartGame
/* +0    1 */ PacketType	// 0x14:"StartGame"
/* +1   64 */ StartInfo		// ゲームスタート時に子に送るユーザーデータ

S2C - StartGame Res
/* +0    1 */ PacketType	// 0x15:"StartGame Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS             成功した
							//  RESULT_CODE_ERROR_FAILED        失敗した

// MatchMaking - Child
C2S - ScanRoom
/* +0    1 */ PacketType	// 0x50:"ScanRoom"
/* +1    2 */ StartIndex	// 何件目から取得するか
/* +3    1 */ Count			// 何件取得するか(1〜8)

S2C - ScanRoom Res
/* +0    1 */ PacketType	// 0x51:"ScanRoom Res"
/* +2    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS             成功した
							//  RESULT_CODE_ERROR_FAILED        失敗した
							//  RESULT_CODE_ERROR_ILLEGAL_PARAM パラメータが不正
/* +2    2 */ RoomCount		// 全体の件数
/* +2    2 */ StartIndex	// 何件目からの結果か
/* +2    1 */ Count			// 検索結果の件数
							// 件数分繰り返す
/* +?    8 */ RoomId		// ルーム情報数 - ルーム固有の識別子
/* +?    1 */ MemberCount	// ルーム情報数 - 現在の人数(1〜32)
/* +?    1 */ MemberMax		// ルーム情報数 - 最大人数(1〜32)
/* +?   64 */ GameId		// ルーム情報数 - ゲーム固有の識別子
/* +?  128 */ RoomName		// ルーム情報数 - ルーム名(UTF-16)

C2S - EnterRoom
/* +0    1 */ PacketType	// 0x52:"EnterRoom"
/* +1    8 */ RoomId		// ルーム固有の識別子
/* +9   64 */ GameId		// ゲーム固有の識別子(UTF-16)

S2C - EnterRoom Res
/* +0    1 */ PacketType	// 0x53:"EnterRoom Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS                成功した
							//  RESULT_CODE_ERROR_NOTFOUND_ROOM    部屋が見つからなかった
							//  RESULT_CODE_ERROR_ROOM_MEMBER_MAX  部屋の人数が最大だった
							//  RESULT_CODE_ERROR_GAME_START       既に募集を締め切って、ゲームを開始している
							//  RESULT_CODE_ERROR_MISSMATCH_GAMEID ゲーム固有の識別子が違う
							//  RESULT_CODE_ERROR_FAILED           失敗した

C2S - LeaveRoom
/* +0    1 */ PacketType	// 0x54:"LeaveRoom"

S2C - LeaveRoom Res
/* +0    1 */ PacketType	// 0x55:"LeaveRoom Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS                成功した
							//  RESULT_CODE_ERROR_FAILED           失敗した

// Running
C2S - SendData - Parent only
/* +0    1 */ PacketType	// 0x:80"SendData"
/* +1    1 */ Size          // データサイズ-1(0〜255)
/* +2    ? */ Data          // データ

S2C - RecvData - Child  only
/* +0    1 */ PacketType	// 0x:81"SendData"
/* +1    1 */ Size          // データサイズ-1(0〜255)
/* +2    ? */ Data          // データ

C2S - SendKeyData
/* +0    1 */ PacketType	// 0x:82"SendKeyData"
/* +1    2 */ KeyData		// キーデータ

S2C - RecvKeyData
/* +0    1 */ PacketType	// 0x:83"RecvKeyData"
/* +1    4 */ enable		// 有効なPlayerIDのビットマップ情報
							// 有効なPlayerID数分
/* +5    ? */ KeyData		// キーデータ

C2S - EndGame     - Parent only
/* +0    1 */ PacketType	// 0x84:"EndGame"

S2C - EndGame Res
/* +0    1 */ PacketType	// 0x85:"EndGame Res"
/* +1    1 */ ResultCode	// Result Code
							//  RESULT_CODE_SUCCESS                成功した
							//  RESULT_CODE_ERROR_FAILED           失敗した

// Event - Parent/Child
S2C - EventStartGame
/* +0    1 */ PacketType	// 0xA3:"EventStartGame"
/* +1    1 */ MemberCount	// 人数
/* +2    1 */ PlayerID		// 自分に割り振られたプレイヤID(0〜31)
/* +3   64 */ StartInfo		// 親から送られたゲームスタート時のユーザーデータ

S2C - EventServerInfo
/* +0    1 */ PacketType	// 0xA5:"EventServerInfo"
/* +1    1 */ Category		// 情報の種別
							//  SERVER_INFO_NORMAL          普通のメッセージ
							//  SERVER_INFO_WARNNING        警告メッセージ
							//  SERVER_INFO_SERVER_SHUTDOWN サーバーをダウンさせますメッセージ
/* +2    2 */ TextSize		// 可変
/* +4    ? */ Text			// サーバーからの情報(UTF-16)

S2C - EventEnter
/* +0    1 */ PacketType	// 0xA7:"EventEnter"
/* +2    1 */ MemberCount	// 現在の人数(1〜32)
/* +2    1 */ PlayerID		// 入室してきたPlayerID(0〜31)
/* +3   64 */ UserName		// 入室してきたUserName(UTF-16)

S2C - EventLeave
/* +0    1 */ PacketType	// 0xA9:"EventLeave"
/* +2    1 */ MemberCount	// 現在の人数(1〜32)
/* +2    1 */ PlayerID		// 退室したPlayerID(0〜31)
/* +3   64 */ UserName		// 退室したUserName(UTF-16)

S2C - EventEndGame
/* +0    1 */ PacketType	// 0xAB:"EventEndGame"