2004-08-16 17:19:17 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
|
|
|
#include "TurnManager.h"
|
2006-06-02 04:10:27 +02:00
|
|
|
#include "ps/Network/NetMessage.h"
|
|
|
|
#include "ps/Network/Network.h"
|
|
|
|
#include "ps/GameRecord.h"
|
|
|
|
#include "ps/CLogger.h"
|
2004-08-16 17:19:17 +02:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
CSinglePlayerTurnManager *g_SinglePlayerTurnManager=NULL;
|
|
|
|
|
|
|
|
CTurnManager::CTurnManager()
|
|
|
|
{
|
|
|
|
for (int i=0;i<3;i++)
|
2004-10-23 16:39:28 +02:00
|
|
|
m_Batches[i].m_TurnLength=40;
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::ClearBatch(uint batch)
|
|
|
|
{
|
2004-09-21 16:40:43 +02:00
|
|
|
typedef std::vector<SMessageSyncEntry> MsgVector;
|
|
|
|
MsgVector &messages=m_Batches[batch].m_Messages;
|
|
|
|
MsgVector::iterator it=messages.begin();
|
|
|
|
while (it != messages.end())
|
|
|
|
{
|
|
|
|
delete it->m_pMessage;
|
|
|
|
++it;
|
|
|
|
}
|
|
|
|
messages.clear();
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::SBatch::Swap(SBatch &other)
|
|
|
|
{
|
|
|
|
std::swap(m_Messages, other.m_Messages);
|
|
|
|
std::swap(m_TurnLength, other.m_TurnLength);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::RotateBatches()
|
|
|
|
{
|
2004-09-21 16:40:43 +02:00
|
|
|
// {a, b, c} => {b, c, a}:
|
|
|
|
// {a, b, c}
|
2004-08-16 17:19:17 +02:00
|
|
|
// -- swap (0, 1)
|
2004-09-21 16:40:43 +02:00
|
|
|
// {b, a, c}
|
2004-08-16 17:19:17 +02:00
|
|
|
// -- swap (1, 2)
|
2004-09-21 16:40:43 +02:00
|
|
|
// {b, c, a}
|
2004-08-16 17:19:17 +02:00
|
|
|
|
|
|
|
m_Batches[0].Swap(m_Batches[1]);
|
|
|
|
m_Batches[1].Swap(m_Batches[2]);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::IterateBatch(uint batch, BatchIteratorFunc *fp, void *userdata)
|
|
|
|
{
|
|
|
|
typedef std::vector<SMessageSyncEntry> MsgVector;
|
|
|
|
MsgVector &messages=m_Batches[batch].m_Messages;
|
|
|
|
MsgVector::iterator it=messages.begin();
|
|
|
|
while (it != messages.end())
|
|
|
|
{
|
2004-09-21 16:40:43 +02:00
|
|
|
it->m_ClientMask=(*fp)(it->m_pMessage, it->m_ClientMask, userdata);
|
2004-08-16 17:19:17 +02:00
|
|
|
++it;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::SendBatch(uint batch)
|
|
|
|
{
|
|
|
|
typedef std::vector<SMessageSyncEntry> MsgVector;
|
|
|
|
MsgVector &messages=m_Batches[batch].m_Messages;
|
|
|
|
MsgVector::iterator it=messages.begin();
|
|
|
|
while (it != messages.end())
|
|
|
|
{
|
|
|
|
SendMessage(it->m_pMessage, it->m_ClientMask);
|
2004-09-21 16:40:43 +02:00
|
|
|
++it;
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
2005-01-17 05:52:02 +01:00
|
|
|
CEndCommandBatch *pMsg=new CEndCommandBatch();
|
|
|
|
pMsg->m_TurnLength=m_Batches[batch].m_TurnLength;
|
|
|
|
SendMessage(pMsg, (uint)-1);
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::SendMessage(CNetMessage *pMsg, uint clientMask)
|
|
|
|
{
|
|
|
|
for (uint i=0;i<m_Clients.size();i++)
|
|
|
|
{
|
|
|
|
if (clientMask & (1<<i))
|
|
|
|
{
|
2004-09-21 16:40:43 +02:00
|
|
|
if (m_Clients[i].m_Pipe)
|
|
|
|
m_Clients[i].m_Pipe->Push(pMsg->Copy());
|
2004-08-16 17:19:17 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::QueueMessage(uint batch, CNetMessage *pMsg)
|
|
|
|
{
|
|
|
|
m_Batches[batch].m_Messages.push_back(SMessageSyncEntry(pMsg));
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::SetClientPipe(uint client, IMessagePipeEnd *pipe)
|
|
|
|
{
|
|
|
|
m_Clients[client].m_Pipe=pipe;
|
|
|
|
}
|
|
|
|
|
2005-01-17 05:52:02 +01:00
|
|
|
void CTurnManager::SetTurnLength(uint batch, uint turnLength)
|
|
|
|
{
|
|
|
|
m_Batches[batch].m_TurnLength=turnLength;
|
|
|
|
}
|
|
|
|
|
2004-08-16 17:19:17 +02:00
|
|
|
uint CTurnManager::GetTurnLength()
|
|
|
|
{
|
|
|
|
return m_Batches[0].m_TurnLength;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CTurnManager::Initialize(size_t numClients)
|
|
|
|
{
|
|
|
|
m_Clients.resize(numClients);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CTurnManager::RecordBatch(uint batch)
|
|
|
|
{
|
|
|
|
IterateBatch(batch, RecordIterator, m_pRecord);
|
|
|
|
CEndCommandBatch msg;
|
|
|
|
m_pRecord->WriteMessage(&msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint CTurnManager::RecordIterator(CNetMessage *pMsg, uint clientMask, void *userdata)
|
|
|
|
{
|
|
|
|
CGameRecord *pRecord=(CGameRecord *)userdata;
|
|
|
|
|
|
|
|
pRecord->WriteMessage(pMsg);
|
|
|
|
|
|
|
|
return clientMask;
|
|
|
|
}
|
|
|
|
|
|
|
|
CSinglePlayerTurnManager::CSinglePlayerTurnManager()
|
|
|
|
{}
|
|
|
|
|
|
|
|
void CSinglePlayerTurnManager::NewTurn()
|
|
|
|
{
|
|
|
|
RecordBatch(2);
|
|
|
|
|
|
|
|
RotateBatches();
|
|
|
|
ClearBatch(2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CSinglePlayerTurnManager::QueueLocalCommand(CNetMessage *pMsg)
|
|
|
|
{
|
|
|
|
QueueMessage(2, pMsg);
|
|
|
|
}
|