Black Whole
Dancing Condor
Ok now I am lost.
All I wanted to do is to create a new XML tag, which allows buildings to create commerce from features in the city radius.
Here are the code parts:
BuildinsSchema.xml
BuildingInfos.xml
CvInfos.cpp
CvInfos.h
CvCity.cpp
I alreday looked through the forum but nothing helped. FeatureInfos are loaded before BuildingInfos, so there isn't a problem, I guess. Has anyone an idea?
If you need anything I'll post it here.
All I wanted to do is to create a new XML tag, which allows buildings to create commerce from features in the city radius.
Here are the code parts:
BuildinsSchema.xml
Code:
<ElementType name="BonusYieldModifiers" content="eltOnly">
<element type="BonusYieldModifier" minOccurs="0" maxOccurs="*"/>
</ElementType>
[COLOR="Lime"]<!--RFCA start-->[/COLOR]
<ElementType name="FeatureCommerceChange" content="eltOnly">
<element type="FeatureType"/>
<element type="CommerceChanges"/>
</ElementType>
<ElementType name="FeatureCommerceChanges" content="eltOnly">
<element type="FeatureCommerceChange" minOccurs="0" maxOccurs="*"/>
</ElementType>
[COLOR="Lime"]<!--RFCA end-->[/COLOR]
<ElementType name="ImprovementFreeSpecialist" content="eltOnly">
<element type="ImprovementType"/>
<element type="iFreeSpecialistCount"/>
</ElementType>
BuildingInfos.xml
Code:
<BonusYieldModifiers/>
<FeatureCommerceChanges>
<FeatureCommerceChange>
<FeatureType>FEATURE_FOREST</FeatureType>
<iCommerce>0</iCommerce>
<iCommerce>0</iCommerce>
<iCommerce>2</iCommerce>
</FeatureCommerceChange>
</FeatureCommerceChanges>
<ImprovementFreeSpecialists/>
CvInfos.cpp
Code:
.
.
.
m_ppaiBonusYieldModifier(NULL),
m_ppaiFeatureCommerceChange(NULL)[COLOR="Lime"] //RFCA[/COLOR]
....
-----------------------------------------
...
[COLOR="Lime"]//RFCA START[/COLOR]
if (m_ppaiFeatureCommerceChange != NULL)
{
for(int i=0;i<GC.getNumFeatureInfos();i++)
{
SAFE_DELETE_ARRAY(m_ppaiFeatureCommerceChange[i]);
}
SAFE_DELETE_ARRAY(m_ppaiFeatureCommerceChange);
}
[COLOR="Lime"] //RFCA END[/COLOR]
...
--------------------------------------------------
...
[COLOR="Lime"]//RFCA START[/COLOR]
int CvBuildingInfo::getFeatureCommerceChange(int i, int j) const
{
FAssertMsg(i < GC.getFeatureInfos(), "Index out of bounds");
FAssertMsg(i > -1, "Index out of bounds");
FAssertMsg(j < NUM_COMMERCE_TYPES, "Index out of bounds");
FAssertMsg(j > -1, "Index out of bounds");
return m_ppaiFeatureCommerceChange ? m_ppaiFeatureCommerceChange[i][j] : -1;
}
int* CvBuildingInfo::getFeatureCommerceChangeArray(int i) const
{
FAssertMsg(i < GC.getNumFeatureInfos(), "Index out of bounds");
FAssertMsg(i > -1, "Index out of bounds");
return m_ppaiFeatureCommerceChange[i];
}
[COLOR="Lime"]//RFCA END[/COLOR]
...
------------------------------------------------------
...
[COLOR="Lime"]//RFCA START[/COLOR]
if (m_ppaiFeatureCommerceChange != NULL)
{
for(i=0;i<GC.getNumFeatureInfos();i++)
{
SAFE_DELETE_ARRAY(m_ppaiFeatureCommerceChange[i]);
}
SAFE_DELETE_ARRAY(m_ppaiFeatureCommerceChange);
}
m_ppaiFeatureCommerceChange = new int*[GC.getNumFeatureInfos()];
for(i=0;i<GC.getNumFeatureInfos();i++)
{
m_ppaiFeatureCommerceChange[i] = new int[NUM_COMMERCE_TYPES];
stream->Read(NUM_COMMERCE_TYPES, m_ppaiFeatureCommerceChange[i]);
}
[COLOR="Lime"] //RFCA END[/COLOR]
...
----------------------------------------------------------
...
[COLOR="Lime"] //RFCA START[/COLOR]
for(i=0;i<GC.getNumFeatureInfos();i++)
{
stream->Write(NUM_COMMERCE_TYPES, m_ppaiFeatureCommerceChange[i]);
}
[COLOR="Lime"]//RFCA[/COLOR]
...
----------------------------------------------------
...
pXML->Init2DIntList(&m_ppaiFeatureCommerceChange, GC.getNumFeatureInfos(), NUM_COMMERCE_TYPES);
if (gDLL->getXMLIFace()->SetToChildByTagName(pXML->GetXML(),"FeatureCommerceChanges"))
{
iNumChildren = gDLL->getXMLIFace()->GetNumChildren(pXML->GetXML());
if (gDLL->getXMLIFace()->SetToChildByTagName(pXML->GetXML(),"FeatureCommerceChange"))
{
for(int j=0;j<iNumChildren;j++)
{
pXML->GetChildXmlValByName(szTextVal, "FeatureType");
int k = pXML->FindInInfoClass(szTextVal);
if (k > -1)
{
// delete the array since it will be reallocated
SAFE_DELETE_ARRAY(m_ppaiFeatureCommerceChange[k]);
if (gDLL->getXMLIFace()->SetToChildByTagName(pXML->GetXML(),"CommerceChanges"))
{
// call the function that sets the commerce change variable
pXML->SetCommerce(&m_ppaiFeatureCommerceChange[k]);
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
else
{
pXML->InitList(&m_ppaiFeatureCommerceChange[k], NUM_COMMERCE_TYPES);
}
}
if (!gDLL->getXMLIFace()->NextSibling(pXML->GetXML()))
{
break;
}
}
// set the current xml node to it's parent node
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
// set the current xml node to it's parent node
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
CvInfos.h
Code:
...
[COLOR="Lime"] //RFCA START[/COLOR]
int getFeatureCommerceChange(int i, int j) const; // Exposed to Python
int* getFeatureCommerceChangeArray(int i) const;
[COLOR="Lime"]//RFCA END[/COLOR]
...
------------------------------------------------------------------
...
int** m_ppaiFeatureCommerceChange; [COLOR="Lime"]//RFCA[/COLOR]
CvCity.cpp
Code:
int CvCity::getBuildingCommerceByBuilding(CommerceTypes eIndex, BuildingTypes eBuilding) const
{
int iCommerce;
FAssertMsg(eIndex >= 0, "eIndex expected to be >= 0");
FAssertMsg(eIndex < NUM_COMMERCE_TYPES, "eIndex expected to be < NUM_COMMERCE_TYPES");
FAssertMsg(eBuilding >= 0, "eBuilding expected to be >= 0");
FAssertMsg(eBuilding < GC.getNumBuildingInfos(), "GC.getNumBuildingInfos expected to be >= 0");
iCommerce = 0;
if (getNumBuilding(eBuilding) > 0)
{
CvBuildingInfo& kBuilding = GC.getBuildingInfo(eBuilding);
if (!(kBuilding.isCommerceChangeOriginalOwner(eIndex)) || (getBuildingOriginalOwner(eBuilding) == getOwnerINLINE()))
{
iCommerce += kBuilding.getObsoleteSafeCommerceChange(eIndex) * getNumBuilding(eBuilding);
if (getNumActiveBuilding(eBuilding) > 0)
{
iCommerce += (GC.getBuildingInfo(eBuilding).getCommerceChange(eIndex) + [COLOR="Lime"][B]GC.getBuildingInfo(eBuilding).getFeatureCommerceChange(eIndex, eIndex)[/B][/COLOR] + getBuildingCommerceChange((BuildingClassTypes)GC.getBuildingInfo(eBuilding).getBuildingClassType(), eIndex)) * getNumActiveBuilding(eBuilding); [COLOR="Lime"]//RFCA[/COLOR]
if (GC.getBuildingInfo(eBuilding).getReligionType() != NO_RELIGION)
{
if (GC.getBuildingInfo(eBuilding).getReligionType() == GET_PLAYER(getOwnerINLINE()).getStateReligion())
{
iCommerce += GET_PLAYER(getOwnerINLINE()).getStateReligionBuildingCommerce(eIndex) * getNumActiveBuilding(eBuilding);
}
}
if (GC.getBuildingInfo(eBuilding).getGlobalReligionCommerce() != NO_RELIGION)
{
//Rhye - start (max commerce from a shrine)
//iCommerce += (GC.getReligionInfo((ReligionTypes)(GC.getBuildingInfo(eBuilding).getGlobalReligionCommerce())).getGlobalReligionCommerce(eIndex) * GC.getGameINLINE().countReligionLevels((ReligionTypes)(GC.getBuildingInfo(eBuilding).getGlobalReligionCommerce())));
iCommerce += std::min(MAX_COM_SHRINE, (GC.getReligionInfo((ReligionTypes)(GC.getBuildingInfo(eBuilding).getGlobalReligionCommerce())).getGlobalReligionCommerce(eIndex) * GC.getGameINLINE().countReligionLevels((ReligionTypes)(GC.getBuildingInfo(eBuilding).getGlobalReligionCommerce()))));
//Rhye - end
}
if (GC.getBuildingInfo(eBuilding).getGlobalCorporationCommerce() != NO_CORPORATION)
{
iCommerce += (GC.getCorporationInfo((CorporationTypes)(GC.getBuildingInfo(eBuilding).getGlobalCorporationCommerce())).getHeadquarterCommerce(eIndex) * GC.getGameINLINE().countCorporationLevels((CorporationTypes)(GC.getBuildingInfo(eBuilding).getGlobalCorporationCommerce()))) * getNumActiveBuilding(eBuilding);
}
}
if ((GC.getBuildingInfo(eBuilding).getCommerceChangeDoubleTime(eIndex) != 0) &&
(getBuildingOriginalTime(eBuilding) != MIN_INT) &&
((GC.getGameINLINE().getGameTurnYear() - getBuildingOriginalTime(eBuilding)) >= GC.getBuildingInfo(eBuilding).getCommerceChangeDoubleTime(eIndex)))
{
return (iCommerce * 2);
}
return iCommerce;
}
}
return 0;
}
I alreday looked through the forum but nothing helped. FeatureInfos are loaded before BuildingInfos, so there isn't a problem, I guess. Has anyone an idea?
If you need anything I'll post it here.