Ich habe ein Problem mit einem Code in meinem Stadtstaaten-Feature. Und war soll unter bestimmten Umständen ein Stadtstaat (eCityState) seinen bisherigen Herrscher verlassen und sich einem anderen Herrscher anschließen, in der Regel, weil dieser nach Erledigung einer Mission bessere Beziehungen zum Stadtstaat hat. Allerdings haben sich einige User gewünscht, dass man den Stadtstaat nicht einfach so aufs Auge gedrückt bekommt, sondern gefragt wird, ob man ihn als Vasall haben will. Das hatte ich so gelöst:
Code:
//Kathy Beginn Citystate-Quests
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 kPlayer = 0; kPlayer < MAX_PLAYERS; kPlayer++)
{
if (GET_PLAYER((PlayerTypes)kPlayer).getTeam() == (TeamTypes)iMasterID)
{
CvWString szBuffer;
PlayerTypes eOldMasterPlayer;
eOldMasterPlayer = ((PlayerTypes)kPlayer);
szBuffer = gDLL->getText("TXT_CITYSTATE_WECHSEL_LOST_TEXT", GET_TEAM((TeamTypes)eCityState).getName().GetCString() , GET_TEAM((TeamTypes)this->getID()).getName().GetCString() );
gDLL->getInterfaceIFace()->addMessage(eOldMasterPlayer, 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);
if (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, false))
{
ourList.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
In meinen Tests hatte das auch funktioniert - oder es sah so aus, als funktioniere es - aber in der Spielpraxis leider nicht. Zuerst dachte ich, es liegt an
if (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, true))
Das erschien mir logisch, denn bei "TestDenial" ergab der Code immer false. Aber auch, nachdem ich "TestDenial" abgestellt habe (siehe oben) schickt der Stadtstaat nach Erledigung der Mission kein Angebot, sich unter meinen Schutz zu begeben. Irgendwie wird der Diplomatie-Teil nicht getriggert. Erkennt jemand hier einen groben Fehler? Für mich war es das erste mal, dass ich etwas mit Diplo gemacht habe, Ramkhamhaeng hatte mir damals große Teile des Codes geliefert.
Edit: Wenn ich mir das so anschaue, kann das eigentlich nie funktioniert haben - kMasterplayer ist menschlich, folglich ergibt (kMasterPlayer.canTradeItem(kLoopPlayer.getID(), item, false)) für TRADE_VASSAL false.
Edit 2: Und genau das war es. Jetzt hat es auch im Spiel funktioniert.