【目次】
テーブルの作成
マッチングルームの探索
新規にマッチングルームを作成する
マッチングルームへ入室する
テーブルの作成▲
では具体的に、サンプルで提供されているマッチングアルゴリズムを解説します。
まず、マッチングサーバ起動直後、ライブラリ処理から、
/server/matching/src/sample/matching/ValueMatching.cpp 内の
ValueMatching::QueryCreateTable 関数がコールされます。
ここでは以下の要素を持つ、マッチング用データベーステーブルvalue_rooms を生成します。
・ room_id - マッチングルームのID
・ value - マッチングルーム入室条件

また上記関数は同時に /server/matching/src/sample/matching/MatchingBase.cpp 内の
MatchingBase::QueryCreateTable 関数をコールされます。
そこではマッチングルームテーブル rooms と、マッチングプレイヤーテーブル room_players を作成しています。
マッチングテーブル rooms は以下の要素を持ちます。
・ id - マッチングルームのID(上述の room_id に対するキーとなる)
・ max_players - そのルームに入ることが出来る最大人数
・ curt_players - そのルームに現在入室している人数
・ created_time - そのルーム(レコード)が生成された時間

一方、マッチングプレイヤーテーブル room_players は以下の要素を持ちます。
・ player_id - プレイヤーの識別ID
・ room_id - プレイヤーが所属しているルームのID( 上記 value_rooms の room_id および rooms
テーブルの id とのキーとなる)
・ created_time - そのプレイヤー(レコード)が生成された時間

マッチングルームの探索▲
前述のページ触れていますが、マッチングルームに入室する際に
RPC_BTL_Matching::Recv_EnterMatchingRoom 関数がコールされます。
その中で上述に触れたデータベーステーブルを使ってルーム入室処理を行ないます。
はじめに、以下の ValueMatching::SearchRoom 関数内の制御を実行し、
現在データベース上に登録されているルーム情報のうち、以下に示す条件に一致するルーム情報を抽出します。
・ マッチング時に設定した「マッチング値」が一致すること
・ マッチングルームIDが一致していること
・ 現在入室しているログインプレイヤー数が 1 以上 rooms.max_players 未満であること
・ 複数見つかった場合には、 rooms.create_time (早く作成されたルーム)順とする
該当するルームは、下記赤枠以降の処理内でリスト searchRoomInfoList に入れられます。

新規にマッチングルームを作成する▲
上記の結果見つかった場合、リストに登録された最初のルームに入室します。
逆に見つからなかった場合には、RPC_BTL_Matching::Recv_EnterMatchingRoom 関数経由で
ValueMatching.cpp 内の ValueMatching::QueryCreateRoom 関数がコールされます。
ここでは、テーブル value_rooms にレコードを1件登録します。
・ room_id - ルームID ( RPC_BTL_Matching::GenerateRoomId 関数で生成したID)を登録
・ value - マッチング時に設定した「マッチング値」を登録

また上記関数経由にて、MatchingBase.cpp 内の MatchingBase::QueryCreateRoom 関数がコールされます。
その中身は以下のようになっており、データベーステーブル rooms に対し、以下のレコードを1件追加します。
・ id - ルームID ( RPC_BTL_Matching::GenerateRoomId 関数で生成したID)を登録
createRoomInfo.room_id == 0 の場合には最後に room_id に登録した番号を登録
・ max_players - マッチングルームに入室できる最大人数を登録
・ curt_players - 生成時は常に 0 (後述の「マッチングルームへ入室」する処理にて加算される)
・ created_time - マッチングデータベースに登録された時間

マッチングルームへ入室する▲
入室すべきマッチングルームの情報をデータベースに登録し終えたら、そのルームへ入室します。
入室する処理は、RPC_BTL_Matching::Recv_EnterMatchingRoom 関数経由で
MatchingBase.cpp 内の MatchingBase::QueryEnterRoom 関数がコールされます。
まず以下の部分で、データベーステーブル rooms にある、roomId が一致するレコードに対し、
curt_players、つまり現在入室しているユーザーのカウントを+1します。

続けて以下の部分で、データベーステーブル rooms_player に対し、以下のレコードを追加します。
・ player_Id - 自身のプレイヤーID。サンプル上で入力する「キャラクタID」と同じ値。
・ room_Id - マッチングルームのID。
・ created_time - レコード追加時の時間。

マッチングルームの削除▲
バトルサーバにプレイヤーを送り出した後の、空になったマッチングルームは
ライブラリ処理にて、その5秒後にマッチングルームを削除しています。
この際、MatchingBase.cpp 内の MatchingBase::QueryEnterRoom 関数がコールされます。
まず以下の部分で、データベーステーブル rooms にある、roomId が一致するレコードに対し、
curt_players、つまり現在入室しているユーザーのカウントを+1します。

続けて以下の部分で、データベーステーブル rooms_player に対し、以下のレコードを追加します。
・ player_Id - 自身のプレイヤーID。サンプル上で入力する「キャラクタID」と同じ値。
・ room_Id - マッチングルームのID。
・ created_time - レコード追加時の時間。
