ゲームサーバーへの部屋の割り当て

ゲームサーバーへの割り当て

ドメインの部屋をゲームサーバーに割り当てる。

ゲームサーバーが AssignRoomRequest を送り、マッチングサーバーが割り当てる。

ゲームサーバー側の送信

サンプルゲームサーバーのリクエスト送信部分は turnAssign() で行っている。 状態遷移関連を省いて抜き出すと、

void GameServer::turnAssign()
{
   for (int i=0; i<m_vecGame.size(); ++i) {
      Game& m = m_vecGame[i];
      nine::match::AssignRoomRequest msg;
      msg.domainIndex = i;
      msg.numMatches  = m.vecMatch.size();
      msg.salt   = m.salt;
      msg.host   = m_cfg.client.host;
      msg.port   = m_cfg.client.port;
      msg.memberCapacity = 2;

      if (! post(m_matchCommId, &msg)) {
         return;
      }
   }
}

このサンプルは、一つのゲームサーバーが異なるルールのゲームを担当するようになっている。 これは、AssignRoom を for ループで複数回呼び出すことで実現している。

for の中では、AssignRoomRequest を構築して post で送信している。AssignRoomRequest の設定は:
domainIndex
マッチングクライアント(この場合はゲームサーバー)での、ドメイン識別子。
for ループのインデックスを使っている。これは、for の繰り返しがドメイン選択の境界になっているからである。
numMatches
要求するマッチングルームの数
salt
シークレットを生成するために使うソルト。クライアントがゲームに接続する時のパスワードのようなものである。
host, port
ゲームサーバーがゲームクライアントを受け付ける接続口。
memberCapacity
マッチングルームに入れる最大人数

複数の部屋を要求するが、それらに共通の設定が含まれている。後ほど部屋を開く際にも部屋の設定を指定することができるが、ゲームクライアントが変えないような設定を指定する。例えば、部屋の最大人数がそれである。

この他にも必要ならば、Extension 機構を用いて拡張することができる。

RoomModule::onAssign

部屋リソースを割り当てることができたら、フレームワークはモジュールの onAssign を呼ぶ。

ここで AssignRoomRequest に含まれた部屋の初期設定を行う。

void SampleRoomModule::onAssign(std::vector< Room* >& rooms, AssignRoomRequest* pMsg, SessionHandle& hSession)
{
   for (int i=0; i<rooms.size(); ++i) {
      SampleRoom* p = static_cast< SampleRoom* >(rooms[i]);
      p->onAssign(pMsg, i, hSession);
   }
}

サンプルでは、モジュールレベルでの作業は無く、単純に Room の onAssign を呼んでいる。

SampleRoom::onAssign

SampleRoom は、割り当て時にモジュールから呼ぶための onAssign 公開関数を定義している。

ここではフレームワーク提供の onAssign を呼ぶとともに、必要ならば独自の設定を行うことができる。

void SampleRoom::onAssign(const AssignRoomRequest* pMsg, int index, const SessionHandle& hSession)
{
   super::onAssign(pMsg, index, hSession);
}

サンプルは特に拡張をしていないので、フレームワークの onAssign を呼んでいるだけである。