ドメインの部屋をゲームサーバーに割り当てる。
ゲームサーバーが 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 ループで複数回呼び出すことで実現している。
複数の部屋を要求するが、それらに共通の設定が含まれている。後ほど部屋を開く際にも部屋の設定を指定することができるが、ゲームクライアントが変えないような設定を指定する。例えば、部屋の最大人数がそれである。
この他にも必要ならば、Extension 機構を用いて拡張することができる。
部屋リソースを割り当てることができたら、フレームワークはモジュールの 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 公開関数を定義している。
ここではフレームワーク提供の onAssign を呼ぶとともに、必要ならば独自の設定を行うことができる。
void SampleRoom::onAssign(const AssignRoomRequest* pMsg, int index, const SessionHandle& hSession)
{
super::onAssign(pMsg, index, hSession);
}
サンプルは特に拡張をしていないので、フレームワークの onAssign を呼んでいるだけである。