if (gDLL->getXMLIFace()->SetToChildByTagName(pXML->GetXML(),"CivicAttitudeChanges"))
{
if (pXML->SkipToNextVal())
{
int iTemp = 0;
CvString szTemp = "";
int iNumSibs = gDLL->getXMLIFace()->GetNumChildren(pXML->GetXML());
if (gDLL->getXMLIFace()->SetToChild(pXML->GetXML()))
{
if (iNumSibs > 0)
{
for (int i=0;i<iNumSibs;i++)
{
if (pXML->GetChildXmlVal(szTextVal))
{
m_aszCivicAttitudeforPass3.push_back(szTextVal);
pXML->GetNextXmlVal(&iTemp);
m_aiCivicAttitudeforPass3.push_back(iTemp);
m_aszCivicAttitudeReasonforPass3.push_back(szTextVal);
[COLOR="Red"]pXML->GetNextXmlVal(&szTemp);[/COLOR]
m_aszCivicAttitudeReasonValueforPass3.push_back(szTemp);
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
if (!gDLL->getXMLIFace()->NextSibling(pXML->GetXML()))
{
break;
}
}
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
}
}
gDLL->getXMLIFace()->SetToParent(pXML->GetXML());
}
error C2664: 'bool CvXMLLoadUtility::GetNextXmlVal(std::string &,char *)' : cannot convert parameter 1 from 'CvString *' to 'std::string &' A reference that is not to 'const' cannot be bound to a non-lvalue
pXML->GetNextXmlVal(&szTemp.GetCString());
pXML->GetNextXmlVal([s][COLOR="Red"]&[/COLOR][/s]szTemp);
m_aszCivicAttitudeReasonforPass3.push_back(szTextVal);
pXML->GetNextXmlVal(&szTemp);
m_aszCivicAttitudeReasonValueforPass3.push_back(szTemp);
The key is that references are new and operate on nearly the same principle as why memory addresses are often used: to be able to write to a location passed by the caller.
if (bPlayerContext && GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
CivicTypes eTargetCivic;
CvWString szPlayers;
CvWString szEnemies;
int* paiPlayerDiplomacyChanges;
paiPlayerDiplomacyChanges = new int[MAX_PLAYERS];
szPlayers.Format(L"");
szEnemies.Format(L"");
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
for (int iJ = 0; iJ < GC.getNumCivicInfos(); iJ++)
{
eTargetCivic = ((CivicTypes)iJ);
int iAttitudeChange = GC.getCivicInfo(eCivic).getCivicAttitudeChange(eTargetCivic) + GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCivic);
if (iAttitudeChange != 0)
{
for (int iK = 0; iK < MAX_PLAYERS; iK++)
{
paiPlayerDiplomacyChanges[iK] = 0;
if (GET_PLAYER((PlayerTypes)iK).isAlive())
{
if (GET_TEAM(kPlayer.getTeam()).isHasMet(GET_PLAYER((PlayerTypes)iK).getTeam()))
{
for (int iL = 0; iL < GC.getNumCivicOptionInfos(); iL++)
{
if (GET_PLAYER((PlayerTypes)iK).getCivics((CivicOptionTypes)iL) == eTargetCivic)
{
paiPlayerDiplomacyChanges[iK] += iAttitudeChange;
break;
}
}
}
}
}
bFirst = true;
bool bFriendly = false;
bool bEnemy = false;
bool bEnemiesFirst = true;
for (int iJ = 0; iJ < MAX_PLAYERS; iJ++)
{
if (paiPlayerDiplomacyChanges[iJ] > 0)
{
bFriendly = true;
szPlayers.append(CvWString::format(L"<link=literal>%s</link> (+%d)", gDLL->getText(GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription()), paiPlayerDiplomacyChanges[iJ]));
if (!bFirst)
szPlayers.append(CvWString::format(L", "));
bFirst = false;
}
else if (paiPlayerDiplomacyChanges[iJ] < 0)
{
bEnemy = true;
szEnemies.append(CvWString::format(L"<link=literal>%s</link> (%d)", gDLL->getText(GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription()), paiPlayerDiplomacyChanges[iJ]));
if (!bFirst)
szEnemies.append(CvWString::format(L", "));
bEnemiesFirst = false;
}
}
if (bFriendly)
{
szHelpText.append(CvWString::format(L"%s%c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), szPlayers));
}
if (bEnemy)
{
szHelpText.append(CvWString::format(L"%s%c%s", NEWLINE, gDLL->getSymbolID(BULLET_CHAR), szEnemies));
}
}
}
SAFE_DELETE_ARRAY(paiPlayerDiplomacyChanges);
}
A few quick notes as I need to get to sleep.
- CvString and CvWString start empty (""). No need to reset them unless you are clearing stuff you added previously.
- Since MAX_PLAYERS is a constant, you don't need to use "new" with the array or delete it after.
- You might want to use MAX_CIV_PLAYERS so it doesn't include the barbs. Not a biggie though.
- I don't quite understand your logic here or what you want to have appear. What I expect you want doesn't match the code. I suggest writing psuedocode to make it clear what you want.
- Make sure you take into account losing whatever attitude modifier there is for the civic you'll be leaving.
I don't see where you add the "Damages relations with" portion of the text key. That ought to come just before you append the Civilization Description, in an if (bFIrst) check. That way if there IS something, it will add the text before it does the first name up, and then never again. If there is never anything, it won't add the text at all.
Also, I think if you use %D it will include the + for you automatically on the positive ones. Just less to update at any future change that somehow blends the function to a single statement.
if (bPlayerContext && GC.getGameINLINE().getActivePlayer() != NO_PLAYER)
{
CvPlayer& kPlayer = GET_PLAYER(GC.getGameINLINE().getActivePlayer());
CivicTypes eTargetCivic;
CivicTypes eCurrentCivic = kPlayer.getCivics(GC.getCivicInfo(eCivic).getCivicOption());
int aiPlayerDiplomacyChanges[MAX_CIV_PLAYERS];
for (int iK = 0; iK < MAX_PLAYERS; iK++)
{
aiPlayerDiplomacyChanges[iK] = 0;
if (GET_PLAYER((PlayerTypes)iK).isAlive() && GET_PLAYER((PlayerTypes)iK).getID() != kPlayer.getID())
{
if (GET_TEAM(kPlayer.getTeam()).isHasMet(GET_PLAYER((PlayerTypes)iK).getTeam()))
{
for (int iL = 0; iL < GC.getNumCivicOptionInfos(); iL++)
{
eTargetCivic = GET_PLAYER((PlayerTypes)iK).getCivics((CivicOptionTypes)iL);
//Total attitude change is the total from both sides of the XML minus the total from our current civic setup.
aiPlayerDiplomacyChanges[iK] += GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCivic) + GC.getCivicInfo(eCivic).getCivicAttitudeChange(eTargetCivic) - GC.getCivicInfo(eCurrentCivic).getCivicAttitudeChange(eTargetCivic) - GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCurrentCivic);
}
}
}
}
bFirst = true;
bool bEnemiesFirst = true;
int iPlayerCount = 0;
int iEnemyCount = 0;
CvWString szPlayers;
CvWString szEnemies;
szEnemies.Format(L"");
szPlayers.Format(L"");
for (int iJ = 0; iJ < MAX_CIV_PLAYERS; iJ++)
{
if (aiPlayerDiplomacyChanges[iJ] > 0)
{
if (!bFirst)
szPlayers.append(CvWString::format(L", "));
szPlayers.append(CvWString::format(L"<link=literal>%s</link> (%D)", GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription(), aiPlayerDiplomacyChanges[iJ]));
bFirst = false;
//Resolution Scaling
iPlayerCount++;
if (iEnemyCount > XResolution / 10)
{
szPlayers.append(NEWLINE);
iEnemyCount = 0;
}
}
else if (aiPlayerDiplomacyChanges[iJ] < 0)
{
if (!bEnemiesFirst)
szEnemies.append(CvWString::format(L", "));
szEnemies.append(CvWString::format(L"<link=literal>%s</link> (%d)", GC.getCivilizationInfo(GET_PLAYER((PlayerTypes)iJ).getCivilizationType()).getShortDescription(), aiPlayerDiplomacyChanges[iJ]));
bEnemiesFirst = false;
//Resolution Scaling
iEnemyCount++;
if (iEnemyCount > XResolution / 10)
{
szEnemies.append(NEWLINE);
iEnemyCount = 0;
}
}
}
if (!bFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_BOOSTS_DIPLOMACY"));
szHelpText.append(szPlayers);
}
if (!bEnemiesFirst)
{
szHelpText.append(NEWLINE);
szHelpText.append(gDLL->getSymbolID(BULLET_CHAR));
szHelpText.append(gDLL->getText("TXT_KEY_CIVIC_HURTS_DIPLOMACY"));
szHelpText.append(szEnemies);
}
}
CvWString foo = "foo";
CvWString bar = "bar";
if (foo == bar) {
...
}
if (iPass == 0)
{
CivicTypes eTargetCivic;
CivicTypes eCivic;
int* paiCivicAttitudeChanges = new int[GC.getNumCivicOptionInfos()];
CvWString* paszCivicAttitudeReasons = new CvWString[GC.getNumCivicOptionInfos()];
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
eTargetCivic = GET_PLAYER(eTargetPlayer).getCivics((CivicOptionTypes)iJ);
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
eCivic = GET_PLAYER(ePlayer).getCivics((CivicOptionTypes)iK);
iAttitudeChange = GC.getCivicInfo(eTargetCivic).getCivicAttitudeChange(eCivic);
paiCivicAttitudeChanges[iJ] = iAttitudeChange;
if (iAttitudeChange != 0)
{
paszCivicAttitudeReasons[iJ] = GC.getCivicInfo(eTargetCivic).getCivicAttitudeReason(eCivic);
}
else
{
paszCivicAttitudeReasons[iJ] = "";
}
}
}
[COLOR="Lime"]for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
if (paszCivicAttitudeReasons[iJ] != (CvWString)"")
{
for (int iK = 0; iK < GC.getNumCivicOptionInfos(); iK++)
{
if (iJ != iK)
{
if (paszCivicAttitudeReasons[iJ] == paszCivicAttitudeReasons[iK])
{
paszCivicAttitudeReasons[iK] = "";
paiCivicAttitudeChanges[iJ] += paiCivicAttitudeChanges[iK];
paiCivicAttitudeChanges[iK] = 0;
}
}
}
}
}[/COLOR]
for (int iJ = 0; iJ < GC.getNumCivicOptionInfos(); iJ++)
{
if (paiCivicAttitudeChanges[iJ] != 0 && paszCivicAttitudeReasons[iJ] != (CvWString)"")
{
szBuffer.append(NEWLINE);
szTempBuffer.Format(SETCOLR L"%s" ENDCOLR, TEXT_COLOR((paiCivicAttitudeChanges[iJ] > 0) ? "COLOR_POSITIVE_TEXT" : "COLOR_NEGATIVE_TEXT"), gDLL->getText(paszCivicAttitudeReasons[iJ], paiCivicAttitudeChanges[iJ]).GetCString());
szBuffer.append(szTempBuffer);
}
}
SAFE_DELETE_ARRAY(paiCivicAttitudeChanges);
SAFE_DELETE_ARRAY(paszCivicAttitudeReasons);
}