For an integer by type
Step 1 CvProperties.h:
struct UnitCombatModifier
{
int iModifier;
UnitCombat eUnitCombat;
};
H files:
Under: class CvPromotionInfo : public CvHotkeyInfo
UnitCombatModifier& getUnitCombatCommunicabilityModifier(int index);
int getNumUnitCombatCommunicabilityModifiers() const;
Under: class CvPromotionInfo :
public CvInfoBase
{
protected:
std::vector<UnitCombatModifier> m_aUnitCombatCommunicabilityModifiers;
Then, in the info cpp:
CvPromotionInfo::~CvPromotionInfo()
{
for (int i=0; i<(int)m_aUnitCombatCommunicabilityModifierTypes.size(); i++)
{
GC.removeDelayedResolution((int*)&m_aUnitCombatCommunicabilityModifierTypes.size[i]));
}
UnitCombatModifier& CvPromotionInfo::getUnitCombatCommunicabilityModifier(int index)
{
FAssertMsg(index < (int)m_aUnitCombatCommunicabilityModifiers.size(), "Index out of bounds");
FAssertMsg(index > -1, "Index out of bounds");
return m_aUnitCombatCommunicabilityModifiers[index];
}
int CvPropertyInfo::getNumUnitCombatCommunicabilityModifiers() const
{
return (int)m_aUnitCombatCommunicabilityModifiers.size();
}
Under: void CvPromotionInfo::read(FDataStreamBase* stream):
make sure the following is located under this declaration:
int iNumElements;
int iElement;
int iElementInt;
[COLOR="Red"] stream->Read(&iNumElements);
m_aUnitCombatCommunicabilityModifierTypes.clear();
for (int i = 0; i < iNumElements; ++i)
{
stream->Read(&iElement);
stream->Read(&iElementInt);
m_aUnitCombatCommunicabilityModifierTypes.push_back(std::make_pair((UnitCombatTypes)iElement, iElementInt));
}[/COLOR] Very concerned this would be entirely incorrect but I can't see how you would've done this since your only examples are in regions that don't require the read(stream).
stream->Write(m_aUnitCombatCommunicabilityModifierTypes.size());
for (UnitCombatModifierArray::iterator it = m_aUnitCombatCommunicabilityModifierTypes.begin(); it != m_aUnitCombatCommunicabilityModifierTypes.end(); ++it)
{
stream->Write((*it).eUnitCombat);
stream->Write((*it).iModifier);
}
CheckSumC(iSum, m_aUnitCombatCommunicabilityModifierTypes);
Under:
bool CvPromotionInfo::read(CvXMLLoadUtility* pXML):
if(gDLL->getXMLIFace()->SetToChildByTagName( pXML->GetXML(), "UnitCombatCommunicabilityModifiers"))
{
int i = 0;
int iNum = gDLL->getXMLIFace()->NumOfChildrenByTagName( pXML->GetXML(), "UnitCombatCommunicabilityModifier" );
m_aUnitCombatCommunicabilityModifiers.resize(iNum); // Important to keep the delayed resolution pointers correct
if(gDLL->getXMLIFace()->SetToChild( pXML->GetXML() ))
{
if (gDLL->getXMLIFace()->LocateFirstSiblingNodeByTagName(pXML->GetXML(), "UnitCombatCommunicabilityModifier"))
{
do
{
pXML->GetChildXmlValByName(&(m_aUnitCombatCommunicabilityModifiers[i].iModifier), "iModifier");
pXML->GetChildXmlValByName(szTextVal, "UnitCombatClass");
GC.addDelayedResolution((int*)&(m_aUnitCombatCommunicabilityModifiers[i].eUnitCombat), szTextVal);
i++;
} while(gDLL->getXMLIFace()->LocateNextSiblingNodeByTagName(pXML->GetXML(), "UnitCombatCommunicabilityModifier"));
}
gDLL->getXMLIFace()->SetToParent( pXML->GetXML() );
}
gDLL->getXMLIFace()->SetToParent( pXML->GetXML() );
}
Under:
void CvPromotionInfo::copyNonDefaults(CvPromotionInfo* pClassInfo, CvXMLLoadUtility* pXML)
if (getNumUnitCombatCommunicabilityModifiers() == 0)
{
int iNum = pClassInfo->getNumUnitCombatCommunicabilityModifiers();
m_aUnitCombatCommunicabilityModifiers.resize(iNum);
for (int i=0; i<iNum; i++)
{
[COLOR="Red"]m_aUnitCombatCommunicabilityModifiers[i] = pClassInfo->getUnitCombatCommunicabilityModifier(i);[/COLOR] (a point of concern... didn't we NOT need this in the previous examples? Why then is it located here in the examples I've found you programmed?)
GC.copyNonDefaultDelayedResolution((int*)&(m_aUnitCombatCommunicabilityModifiers[i].eUnitCombat), (int*)&(pClassInfo->getUnitCombatCommunicabilityModifiers(i).eUnitCombat));
}
}