2004-07-27 23:00:53 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
|
|
|
|
#include <timer.h>
|
|
|
|
|
|
|
|
#include "Simulation.h"
|
2004-08-16 17:19:17 +02:00
|
|
|
#include "TurnManager.h"
|
2004-07-27 23:00:53 +02:00
|
|
|
#include "Game.h"
|
|
|
|
#include "EntityManager.h"
|
|
|
|
#include "Scheduler.h"
|
2004-08-16 17:19:17 +02:00
|
|
|
#include "Network/NetMessage.h"
|
|
|
|
#include "CLogger.h"
|
2004-09-21 16:40:43 +02:00
|
|
|
#include "CConsole.h"
|
2004-12-12 20:43:55 +01:00
|
|
|
#include "Unit.h"
|
|
|
|
#include "Model.h"
|
2004-07-27 23:00:53 +02:00
|
|
|
|
|
|
|
#include "gui/CGUI.h"
|
|
|
|
|
2004-09-21 16:40:43 +02:00
|
|
|
extern CConsole *g_Console;
|
|
|
|
|
2004-07-27 23:00:53 +02:00
|
|
|
CSimulation::CSimulation(CGame *pGame):
|
|
|
|
m_pGame(pGame),
|
|
|
|
m_pWorld(pGame->GetWorld()),
|
2004-08-16 17:19:17 +02:00
|
|
|
m_pTurnManager((g_SinglePlayerTurnManager=new CSinglePlayerTurnManager())),
|
2004-07-27 23:00:53 +02:00
|
|
|
m_DeltaTime(0)
|
|
|
|
{}
|
|
|
|
|
2004-08-16 17:19:17 +02:00
|
|
|
CSimulation::~CSimulation()
|
|
|
|
{
|
|
|
|
delete g_SinglePlayerTurnManager;
|
|
|
|
g_SinglePlayerTurnManager=NULL;
|
|
|
|
}
|
|
|
|
|
2004-07-27 23:00:53 +02:00
|
|
|
void CSimulation::Initialize(CGameAttributes *pAttribs)
|
2004-07-31 17:57:18 +02:00
|
|
|
{
|
2004-08-16 17:19:17 +02:00
|
|
|
m_pTurnManager->Initialize(m_pGame->GetNumPlayers());
|
|
|
|
|
2004-11-11 08:09:32 +01:00
|
|
|
g_EntityManager.InitializeAll();
|
2004-07-31 17:57:18 +02:00
|
|
|
}
|
2004-07-27 23:00:53 +02:00
|
|
|
|
|
|
|
void CSimulation::Update(double frameTime)
|
|
|
|
{
|
|
|
|
m_DeltaTime += frameTime;
|
2004-08-16 17:19:17 +02:00
|
|
|
|
2004-07-27 23:00:53 +02:00
|
|
|
if( m_DeltaTime >= 0.0 )
|
|
|
|
{
|
|
|
|
// A new simulation frame is required.
|
|
|
|
MICROLOG( L"calculate simulation" );
|
|
|
|
Simulate();
|
2004-08-16 17:19:17 +02:00
|
|
|
m_DeltaTime -= (m_pTurnManager->GetTurnLength()/1000.0);
|
2004-07-27 23:00:53 +02:00
|
|
|
if( m_DeltaTime >= 0.0 )
|
|
|
|
{
|
|
|
|
// The desired sim frame rate can't be achieved. Settle for process & render
|
|
|
|
// frames as fast as possible.
|
|
|
|
m_DeltaTime = 0.0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-08-16 17:19:17 +02:00
|
|
|
Interpolate(frameTime, ((1000.0*m_DeltaTime) / (float)m_pTurnManager->GetTurnLength()) + 1.0);
|
2004-07-27 23:00:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CSimulation::Interpolate(double frameTime, double offset)
|
|
|
|
{
|
|
|
|
const std::vector<CUnit*>& units=m_pWorld->GetUnitManager()->GetUnits();
|
|
|
|
for (uint i=0;i<units.size();++i)
|
2004-07-28 17:07:54 +02:00
|
|
|
units[i]->GetModel()->Update((float)frameTime);
|
2004-07-27 23:00:53 +02:00
|
|
|
|
2004-07-28 17:07:54 +02:00
|
|
|
g_EntityManager.interpolateAll((float)offset);
|
2004-07-27 23:00:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CSimulation::Simulate()
|
|
|
|
{
|
2004-08-16 17:19:17 +02:00
|
|
|
g_Scheduler.update(m_pTurnManager->GetTurnLength());
|
|
|
|
g_EntityManager.updateAll( m_pTurnManager->GetTurnLength() );
|
|
|
|
|
|
|
|
m_pTurnManager->NewTurn();
|
|
|
|
m_pTurnManager->IterateBatch(0, TranslateMessage, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
uint CSimulation::TranslateMessage(CNetMessage *pMsg, uint clientMask, void *userdata)
|
|
|
|
{
|
|
|
|
CSimulation *pSimulation=(CSimulation *)userdata;
|
|
|
|
|
|
|
|
CEntityOrder entOrder;
|
|
|
|
switch (pMsg->GetType())
|
|
|
|
{
|
|
|
|
case NMT_GotoCommand:
|
|
|
|
CGotoCommand *msg=(CGotoCommand *)pMsg;
|
|
|
|
entOrder.m_type=CEntityOrder::ORDER_GOTO;
|
2004-08-20 16:03:49 +02:00
|
|
|
entOrder.m_data[0].location.x=(float)msg->m_TargetX;
|
|
|
|
entOrder.m_data[0].location.y=(float)msg->m_TargetY;
|
2004-08-16 17:19:17 +02:00
|
|
|
CEntity *ent=msg->m_Entity;
|
2004-11-11 08:09:32 +01:00
|
|
|
ent->pushOrder( entOrder );
|
2004-08-16 17:19:17 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return clientMask;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint CSimulation::GetMessageMask(CNetMessage *pMsg, uint oldMask, void *userdata)
|
|
|
|
{
|
|
|
|
CSimulation *pSimulation=(CSimulation *)userdata;
|
|
|
|
// Pending a complete visibility/minimal-update implementation, we'll
|
|
|
|
// simply select the first 32 connected clients ;-)
|
|
|
|
return 0xffffffff;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CSimulation::QueueLocalCommand(CNetMessage *pMsg)
|
|
|
|
{
|
|
|
|
m_pTurnManager->QueueLocalCommand(pMsg);
|
2004-07-27 23:00:53 +02:00
|
|
|
}
|