1
1
forked from 0ad/0ad

# improve robustness of simulation and EntityManager code

also const-correctness fixes in EntityFormation
+build

This was SVN commit r6502.
This commit is contained in:
janwas 2008-11-22 16:50:03 +00:00
parent 343fa4fea5
commit 213743b73d
4 changed files with 67 additions and 38 deletions

View File

@ -40,11 +40,6 @@ CEntityFormation::~CEntityFormation()
}
}
size_t CEntityFormation::GetSlotCount()
{
return m_base->m_numSlots;
}
void CEntityFormation::SwitchBase( CFormation*& base )
{
std::vector<CEntity*> copy;
@ -186,7 +181,7 @@ void CEntityFormation::ResetAngleDivs()
m_angleDivs[i] = false;
}
void CEntityFormation::SelectAllUnits()
void CEntityFormation::SelectAllUnits() const
{
for ( size_t i=0; i<m_base->m_numSlots; ++i )
{
@ -195,7 +190,13 @@ void CEntityFormation::SelectAllUnits()
}
}
CEntityList CEntityFormation::GetEntityList()
// (cannot be declared inline in the header due to use of CFormation (m_base)
size_t CEntityFormation::GetSlotCount() const
{
return m_base->m_numSlots;
}
CEntityList CEntityFormation::GetEntityList() const
{
CEntityList ret;
for ( size_t i=0; i<m_base->m_numSlots; i++ )
@ -206,7 +207,7 @@ CEntityList CEntityFormation::GetEntityList()
return ret;
}
CVector2D CEntityFormation::GetSlotPosition( size_t order )
CVector2D CEntityFormation::GetSlotPosition( size_t order ) const
{
if ( IsValidOrder(order) )
return CVector2D ( m_base->m_slots[order].rankOff, m_base->m_slots[order].fileOff );

View File

@ -20,23 +20,50 @@ public:
CEntityFormation( CFormation*& base, size_t index );
~CEntityFormation();
size_t GetEntityCount() { return m_numEntities; }
float GetSpeed() { return m_speed; }
size_t GetSlotCount();
size_t GetEntityCount() const
{
return m_numEntities;
}
float GetSpeed() const
{
return m_speed;
}
size_t GetSlotCount() const;
CEntityList GetEntityList();
CVector2D GetSlotPosition( size_t order );
CVector2D GetPosition() { return m_position; }
CFormation* GetBase() { return m_base; }
CEntityList GetEntityList() const;
CVector2D GetSlotPosition( size_t order ) const;
CVector2D GetPosition() const
{
return m_position;
}
CFormation* GetBase()
{
return m_base;
}
void BaseToMovement();
void SelectAllUnits();
void SelectAllUnits() const;
inline void SetDuplication( bool duplicate ) { m_duplication=duplicate; }
inline bool IsDuplication() { return m_duplication; }
inline void SetLock( bool lock ){ m_locked=lock; }
inline bool IsLocked() { return m_locked; }
inline bool IsValidOrder(size_t order) { return ( order < GetSlotCount() ); }
inline void SetDuplication( bool duplicate )
{
m_duplication=duplicate;
}
inline bool IsDuplication() const
{
return m_duplication;
}
inline void SetLock( bool lock )
{
m_locked=lock;
}
inline bool IsLocked() const
{
return m_locked;
}
inline bool IsValidOrder(size_t order) const
{
return ( order < GetSlotCount() );
}
private:
size_t m_numEntities;

View File

@ -208,6 +208,7 @@ HEntity CEntityManager::Create(CEntityTemplate* base, CVector3D position, float
pos = m_nextalloc;
m_nextalloc++;
debug_assert(m_entities[pos].m_entity == 0);
m_entities[pos].m_entity = new CEntity( base, position, orientation, actorSelections, building );
if( m_collisionPatches)
m_entities[pos].m_entity->UpdateCollisionPatch();

View File

@ -195,13 +195,15 @@ void CSimulation::Simulate()
void RandomizeLocations(const CEntityOrder& order, const std::vector<HEntity> &entities, bool isQueued)
{
std::vector<HEntity>::const_iterator it;
float radius = 2.0f * sqrt( (float)entities.size() - 1 );
CSimulation* sim = g_Game->GetSimulation();
for (it = entities.begin(); it < entities.end(); it++)
for (std::vector<HEntity>::const_iterator it = entities.begin(); it < entities.end(); it++)
{
if(!*it)
continue;
float _x, _y;
CEntityOrder randomizedOrder = order;
@ -229,13 +231,14 @@ void RandomizeLocations(const CEntityOrder& order, const std::vector<HEntity> &e
void FormationLocations(const CEntityOrder& order, const std::vector<HEntity> &entities, bool isQueued)
{
CVector2D upvec(0.0f, 1.0f);
std::vector<HEntity>::const_iterator it = entities.begin();
CEntityFormation* formation = (*it)->GetFormation();
const CVector2D upvec(0.0f, 1.0f);
const CEntityFormation* formation = entities.front()->GetFormation();
for (; it != entities.end(); it++)
for (std::vector<HEntity>::const_iterator it = entities.begin(); it != entities.end(); it++)
{
if(!*it)
continue;
CEntityOrder orderCopy = order;
CVector2D posDelta = orderCopy.m_target_location - formation->GetPosition();
CVector2D formDelta = formation->GetSlotPosition( (*it)->m_formationSlot );
@ -264,18 +267,15 @@ void FormationLocations(const CEntityOrder& order, const std::vector<HEntity> &e
void QueueOrder(const CEntityOrder& order, const std::vector<HEntity> &entities, bool isQueued)
{
std::vector<HEntity>::const_iterator it;
for (it = entities.begin(); it < entities.end(); it++)
for (std::vector<HEntity>::const_iterator it = entities.begin(); it < entities.end(); it++)
{
if (*it)
{
if( !isQueued ) {
(*it)->ClearOrders();
}
if (!*it)
continue;
(*it)->PushOrder( order );
}
if( !isQueued )
(*it)->ClearOrders();
(*it)->PushOrder( order );
}
}