Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions GeneralsMD/Code/GameEngine/Include/GameLogic/Weapon.h
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,9 @@ struct HistoricWeaponDamageInfo
};

typedef std::list<HistoricWeaponDamageInfo> HistoricWeaponDamageList;
#if !RETAIL_COMPATIBLE_CRC
typedef std::hash_map<NameKeyType, WeaponTemplate*, rts::hash<NameKeyType>, rts::equal_to<NameKeyType> > WeaponTemplateMap;
#endif

//-------------------------------------------------------------------------------------------------
class WeaponTemplate : public MemoryPoolObject
Expand Down Expand Up @@ -886,7 +889,12 @@ class WeaponStore : public SubsystemInterface
WeaponBonus m_bonus; ///< the weapon bonus to use
};

// IamInnocent 1/1/26 - Added Weapon Templates registering in HashMap format for efficient Searching: https://github.com/TheSuperHackers/GeneralsGameCode/issues/1933
#if RETAIL_COMPATIBLE_CRC
std::vector<WeaponTemplate*> m_weaponTemplateVector;
#else
WeaponTemplateMap m_weaponTemplateHashMap;
#endif
std::list<WeaponDelayedDamageInfo> m_weaponDDI;
};

Expand Down
51 changes: 51 additions & 0 deletions GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Weapon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1577,12 +1577,22 @@ WeaponStore::~WeaponStore()
{
deleteAllDelayedDamage();

#if RETAIL_COMPATIBLE_CRC
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
{
WeaponTemplate* wt = m_weaponTemplateVector[i];
deleteInstance(wt);
}
m_weaponTemplateVector.clear();
#else
for (WeaponTemplateMap::iterator it = m_weaponTemplateHashMap.begin(); it != m_weaponTemplateHashMap.end(); ++it)
{
WeaponTemplate* wt = it->second;
if (wt)
deleteInstance(wt);
}
m_weaponTemplateHashMap.clear();
#endif
}

//-------------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1641,9 +1651,16 @@ const WeaponTemplate *WeaponStore::findWeaponTemplate( const char* name ) const
WeaponTemplate *WeaponStore::findWeaponTemplatePrivate( NameKeyType key ) const
{
// search weapon list for name
/// IamInnocent 1/1/26 - Added Weapon Templates registering in HashMap format for efficient Searching: https://github.com/TheSuperHackers/GeneralsGameCode/issues/1933
#if RETAIL_COMPATIBLE_CRC
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
if( m_weaponTemplateVector[ i ]->getNameKey() == key )
return m_weaponTemplateVector[i];
#else
WeaponTemplateMap::const_iterator it = m_weaponTemplateHashMap.find(key);
if(it != m_weaponTemplateHashMap.end())
return it->second;
#endif

return NULL;

Expand All @@ -1661,7 +1678,11 @@ WeaponTemplate *WeaponStore::newWeaponTemplate(AsciiString name)
WeaponTemplate *wt = newInstance(WeaponTemplate);
wt->m_name = name;
wt->m_nameKey = TheNameKeyGenerator->nameToKey( name );
#if RETAIL_COMPATIBLE_CRC
m_weaponTemplateVector.push_back(wt);
#else
m_weaponTemplateHashMap[wt->m_nameKey] = wt;
#endif

return wt;
}
Expand Down Expand Up @@ -1710,18 +1731,27 @@ void WeaponStore::deleteAllDelayedDamage()
void WeaponStore::resetWeaponTemplates( void )
{

#if RETAIL_COMPATIBLE_CRC
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
{
WeaponTemplate* wt = m_weaponTemplateVector[i];
wt->reset();
}
#else
for (WeaponTemplateMap::iterator it = m_weaponTemplateHashMap.begin(); it != m_weaponTemplateHashMap.end(); ++it)
{
WeaponTemplate* wt = it->second;
wt->reset();
}
#endif

}

//-------------------------------------------------------------------------------------------------
void WeaponStore::reset()
{
// clean up any overriddes.
#if RETAIL_COMPATIBLE_CRC
for (size_t i = 0; i < m_weaponTemplateVector.size(); ++i)
{
WeaponTemplate *wt = m_weaponTemplateVector[i];
Expand All @@ -1732,6 +1762,18 @@ void WeaponStore::reset()
deleteInstance(override);
}
}
#else
for (WeaponTemplateMap::iterator it = m_weaponTemplateHashMap.begin(); it != m_weaponTemplateHashMap.end(); ++it)
{
WeaponTemplate* wt = it->second;
if (wt->isOverride())
{
WeaponTemplate *override = wt;
wt = wt->friend_clearNextTemplate();
deleteInstance(override);
}
}
#endif

deleteAllDelayedDamage();
resetWeaponTemplates();
Expand Down Expand Up @@ -1759,12 +1801,21 @@ void WeaponStore::postProcessLoad()
return;
}

#if RETAIL_COMPATIBLE_CRC
for (size_t i = 0; i < m_weaponTemplateVector.size(); i++)
{
WeaponTemplate* wt = m_weaponTemplateVector[i];
if (wt)
wt->postProcessLoad();
}
#else
for (WeaponTemplateMap::iterator it = m_weaponTemplateHashMap.begin(); it != m_weaponTemplateHashMap.end(); ++it)
{
WeaponTemplate* wt = it->second;
if (wt)
wt->postProcessLoad();
}
#endif

}

Expand Down