In irgendeinem Tread hatte ich einmal Hilfe erfragt für das Popup-Fenster, das erscheinen soll, wenn der Stadtstaat die HI fragt, ob sie neuer Vasall werden soll. Ich finde diesen verdammten Tread nicht, aber das Popup (das damals soweit ich mich erinnere auch nicht perfekt funktionierte - damals kam der falsche Einleitungstext) funktioniert bei mir immer noch nicht. Die KI beginnt zwar die Diplomatie, bietet aber keine Vasallierung an (was sie laut meinem Code tun sollte, und zwar auch, wenn sie eigentlich nicht daran interessiert ist - ihr Wille SOLL an dieser Stelle überschreiben werden, da sie als Stadtstaat schließlich keine "freie" KI ist). Es wäre einfacher, wenn die KI zwangsweise den neuen Hegemon annehmen würde, aber einige User wollen halt auch nicht jeden dahergelaufenen Stadtstaat als Vasall, und so unterstütze ich diese Lösung. Nur funktioniert sie nicht.
Hier ist der Code:
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);
//Test: New (siehe Assing Vassal)
item.m_iData = 1;
//Test: New End (siehe Assing Vassal)
if (kLoopPlayer.canTradeItem(kMasterPlayer.getID(), item, false))
{
//Test: New (siehe Assing Vassal)
ourList.clear();
theirList.clear();
//Test: New End(siehe Assing Vassal)
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_CHANGE"));
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
Er gleicht weitgehend dem, was beim Handel "assignVassal" angeboten wird.
Trotzdem sieht das öffnende Fenster so aus:
Und zwar auch im Testspiel, wenn die betreffende KI tendenziell bereit ist, sich vasallieren zu lassen (anders als Fidel hier - wobei auch der laut dem Sinn meines Codes an dieser Stelle seine Unterwerfung anbieten sollte).