Egal, was ich mache: Es öffnet sich kein Diplo-Fenster. Einmal hatte ich es geschafft, dass eines erschien, aber ohne die Handelsoptionen, und ohne dass danach jemand zum Vasall wurde.
Der modifizierte Code sieht nun so aus:
Code:
void CvTeam::doCityStateDesert(TeamTypes eCityState) const
{
bool bDesert = false;
if ( getID() != GET_TEAM(eCityState).getID() )//Nicht, wenn CityState Teammitglied vom TestTeam ist
{
if ( !GET_TEAM(eCityState).isVassal(getID()) )//Wenn bereits Vasall passiert auch nichts
{
for (int iPlayer = 0; iPlayer < MAX_PLAYERS; iPlayer++)
{
CvPlayer& kLoopPlayer = GET_PLAYER((PlayerTypes)iPlayer);
if (kLoopPlayer.getTeam() == eCityState && kLoopPlayer.isAlive())//Überprüfen aller Spieler im Team, ob ein Stadtstaat dabei ist
{
CivilizationTypes eCityStateCiv = (CivilizationTypes)kLoopPlayer.getCivilizationType();
CvWString szBuffer;
if ( GC.getCivilizationInfo(eCityStateCiv).isCitystate() )
{
bool bNoMaster = true;//Wenn kein alter Master vorhanden: Desertiert immer
int iMasterID = -1;
for (int iI = 0; iI < MAX_CIV_TEAMS; iI++)//Suchen alter Master
{
if (GET_TEAM(eCityState).isVassal((TeamTypes)iI) )
{
bNoMaster = false;
iMasterID = iI;
if ((GET_TEAM(eCityState).AI_getAttitude((TeamTypes)iI) < (GET_TEAM(eCityState).AI_getAttitude(getID()))))
{
bDesert = true;
}
break;
}
}
if ( bDesert || bNoMaster)
{
if (iMasterID != -1)//Ablösen des alten Hegemon
{
GET_TEAM((TeamTypes)iMasterID).freeVassal(eCityState);
GET_TEAM((TeamTypes)eCityState).setVassal((TeamTypes)iMasterID,false,false);
for (int jPlayer = 0; jPlayer < MAX_PLAYERS; jPlayer++)
{
if (GET_PLAYER((PlayerTypes)jPlayer).getTeam() == (TeamTypes)iMasterID)
{
CvWString szBuffer;
PlayerTypes eMasterPlayer;
eMasterPlayer = ((PlayerTypes)jPlayer);
szBuffer = gDLL->getText("TXT_CITYSTATE_WECHSEL_LOST_TEXT", GET_TEAM((TeamTypes)eCityState).getName().GetCString() , GET_TEAM((TeamTypes)this->getID()).getName().GetCString() );
gDLL->getInterfaceIFace()->addMessage(eMasterPlayer, true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_UNITCAPTURE", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), -1, -1);
}
}
}
// assignVassal(eCityState,false); //original Code
for (int jPlayer = 0; jPlayer < MAX_PLAYERS; jPlayer++)
{
if (GET_PLAYER((PlayerTypes)jPlayer).getTeam() == getID() )
{
CvWString szBuffer;
PlayerTypes eMasterPlayer;
eMasterPlayer = ((PlayerTypes)jPlayer);
CvPlayer& kMasterPlayer = GET_PLAYER((PlayerTypes)jPlayer);
//Kathy begin: Ask Humans first
if ( kMasterPlayer.isHuman() )
{
// Ramkhamhaeng Beginn
CLinkList<TradeData> ourList;
CLinkList<TradeData> theirList; // wird nicht gebraucht
TradeData item;
setTradeItem(&item, TRADE_VASSAL);
ourList.insertAtEnd(item);
theirList.insertAtEnd(item);
CvDiploParameters* pDiplo;
pDiplo = new CvDiploParameters(kLoopPlayer.getID());
FAssertMsg(pDiplo != NULL, "pDiplo must be valid");
pDiplo->setDiploComment((DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_OFFER_VASSAL"));
pDiplo->setAIContact(true);
pDiplo->setTheirOfferList(ourList);
pDiplo->setOurOfferList(theirList);
gDLL->beginDiplomacy(pDiplo,eMasterPlayer );
//abContacted[GET_PLAYER((PlayerTypes)iI).getTeam()] = true; //Redundant, aber steht häufig mit im Code.
// Ramkhamhaeng End
}
else
{
assignVassal(eCityState,false);
}
//Kathy end: Ask Humans first
szBuffer = gDLL->getText("TXT_CITYSTATE_WECHSEL_TEXT", GET_TEAM((TeamTypes)eCityState).getName().GetCString() , GET_TEAM((TeamTypes)this->getID()).getName().GetCString() );
gDLL->getInterfaceIFace()->addMessage(eMasterPlayer, true, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_UNITCAPTURE", MESSAGE_TYPE_INFO, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), -1, -1);
break;
}
}
}
}
}
}
}
}
}
//Kathy End Citystate-Quests
Parallel bekomme ich zwei Fehlermeldungen:
Assert Failed
File: CvPlayerAI.cpp
Line: 13265
Expression: AI_getPeacetimeGrantValue(eIndex) >= 0
Message:
Assert Failed
File: CvPlayerAI.cpp
Line: 13267
Expression: iChange > 0
Message:
Beide beziehen sich auf diesen Code:
Code:
void CvPlayerAI::AI_changePeacetimeGrantValue(PlayerTypes eIndex, int iChange)
{
PROFILE_FUNC();
int iI;
FAssertMsg(eIndex >= 0, "eIndex is expected to be non-negative (invalid Index)");
FAssertMsg(eIndex < MAX_PLAYERS, "eIndex is expected to be within maximum bounds (invalid Index)");
if (iChange != 0)
{
m_aiPeacetimeGrantValue[eIndex] = (m_aiPeacetimeGrantValue[eIndex] + iChange);
FAssert(AI_getPeacetimeGrantValue(eIndex) >= 0);
FAssert(iChange > 0);
if (iChange > 0)
{
if (GET_PLAYER(eIndex).getTeam() != getTeam())
{
for (iI = 0; iI < MAX_CIV_TEAMS; iI++)
{
if (GET_TEAM((TeamTypes)iI).isAlive())
{
if (GET_TEAM((TeamTypes)iI).AI_getWorstEnemy() == getTeam())
{
/************************************************************************************************/
/* UNOFFICIAL_PATCH 03/02/10 Sephi */
/* */
/* Bug fix */
/************************************************************************************************/
/* orig bts code
GET_TEAM((TeamTypes)iI).AI_changeEnemyPeacetimeGrantValue(GET_PLAYER(eIndex).getTeam(), iChange);
*/
//make sure that if A trades with B and A is C's worst enemy, C is only mad at B if C has met B before
//A = this
//B = eIndex
//C = (TeamTypes)iI
if (GET_TEAM((TeamTypes)iI).isHasMet(GET_PLAYER(eIndex).getTeam()))
{
GET_TEAM((TeamTypes)iI).AI_changeEnemyPeacetimeGrantValue(GET_PLAYER(eIndex).getTeam(), iChange);
}
/************************************************************************************************/
/* UNOFFICIAL_PATCH END */
/************************************************************************************************/
}
}
}
}
}
}
}
Ich kann aber nicht sehen, wo dieser Code gestartet wird.