Sinnvoller wäre es wohl, in onCityAcquired zu checken, ob der vorherige Besitzer noch Städte hat (falls nein -> tot).
Sinnvoller wäre es wohl, in onCityAcquired zu checken, ob der vorherige Besitzer noch Städte hat (falls nein -> tot).
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Wenn der Vorbesitzer also wirklich tot sein sollte, müsste ich danach checken: War er Vasall von jemand. Ist das möglich?
Schließlich müsste ich danach checken, ob er eine bestimmte Eigenschaft hätte, dann kann ich seinem Hegemon die Techs wegnehmen.
Also:
PHP-Code:
def onCityAcquired(self, argsList):
'City Acquired'
iPreviousOwner,iNewOwner,pCity,bConquest,bTrade = argsList
CvUtil.pyPrint('City Acquired Event: %s' %(pCity.getName()))
###Beginn Unterstützung verloren###
if iPreviousOwner.hatKeineWeiterenStädteMehr ### wie formuliere ich das?
if iPreviousOwner.isVasallVonJemand ###wie frage ich das ab?
pHegemon=gc.getTeamHegemon ###muss natürlich auch irgenwie anders sein
if iPreviousOwner..hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_PRODUCTIVE")):
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_PRODUCTIVE"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
###End Unterstützung verloren###
Zuerst:
hatKeineWeiterenStädteMehr:PHP-Code:
pPreviousOwner = gc.getPlayer(iPreviousOwner)
(Oder wird numCities erst nach onCityAcquired angepasst? Dann wäre == 1)PHP-Code:
pPreviousOwner.getNumCities() == 0
isVasallVonJemand:
(Wie kommt man an NUM_TEAMS?)PHP-Code:
pPreviousTeam = gc.getTeam(pPreviousOwner.getTeam())
if any(pPreviousTeam.isVassal(i) for i in range(NUM_TEAMS)):
getTeamHegomon:
Wie immer ohne Gewähr.PHP-Code:
gc.getTeam(next(pPreviousTeam.isVassal(i) for i in range(NUM_TEAMS)))
Würde es nicht reichen, da 18 (standardspiel) oder die Max. Spielerzahl aus der jeweiligen .dll einzugeben? Oder stürzt er dann ab, wenn es weniger Teams gibt?(Wie kommt man an NUM_TEAMS?)
Weiß ich nicht - könnte man ausprobieren. Dann würde ich gc.getMAX_CIV_TEAMS() benutzen.
Ach ja, xrange (statt range) wäre wahrscheinlich so ganz prinzipiell besser.
Na gut, aber dass ein "Stadtstaat" ohne Städte keinen Bonus mehr bringt, ist durchaus plausibel.
Da stimme ich Delnan zu, von der Logik her bringt das schon Sinn. Allerdings habe ich gerade ein weiteres Problem entdeckt, das ich bislang übersehen habe: Angenommen, ich habe zwei Stadtstaaten mit der selben Eigenschaft als Vasallen, z.B. 2x Militärisch, dann würde ich, sobald ich einen verliere, die Unterstützung durch den 2. ebenfalls verlieren. Der Fall dürfte zwar selten sein, aber er ist möglich. Hat jemand eine Idee, wie man das verhindern könnte?
Die (unschöne) Idee die ich habe, ist: Wenn ein Stadtstaat mit einem bestimmten Attribut stirbt,
Oder hat jemand eine elegantere Idee?PHP-Code:
### Vasallenbonus entziehen beginn ###
pPreviousOwner = gc.getPlayer(iPreviousOwner)
if pPreviousOwner.getNumCities() == 0:
pPreviousTeam = gc.getTeam(pPreviousOwner.getTeam())
if any(pPreviousTeam.isVassal(i) for i in range(gc.getMAX_CIV_TEAMS())):
pHegemon = gc.getTeam(next(pPreviousTeam.isVassal(i) for i in range(gc.getMAX_CIV_TEAMS())))
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_PRODUCTIVE")):
###...dann muss an dieser Stelle geprüft werden, ob pHegemon nicht noch einen verbleibenden Vasallen mit dem entsprechenden Trait hat.###
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_PRODUCTIVE"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
Ich sehe da jetzt vom Effekt her keinen Unterschied .
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Ja, du hast recht, ich habe es undeutlich ausgedrückt. Es muss natürlich nicht nur geprüft werden, ob es noch einen zweiten Vasall gibt, es darf natürlich auch nur für den Fall, dass dem nicht so ist, der Vorteil entzogen werden.
Also
Wie gehe ich am besten durch die anderen Spieler, muss ich da irgendwie loopen, oder was wäre am elegantesten?PHP-Code:
if pHegemon.isMaster (?) von anderem pPlayer mit TRAIT_STADTSTAAT_PRODUCTIVE:
break ###oder anderswie: Mach nix###
else Entziehe Vorteil
Bevor ich weiter über das Problem nachdenke, dass eventuell, zwei Vasallen mit dem selben Trait vorhanden sein könnten:
Mein Test für die Funktion ergibt im Spiel folgenden Fehler:
Es geht um diese Zeile:
in diesem Code.PHP-Code:
if any(pPreviousTeam.isVassal(i) for i in range(gc.getMAX_CIV_TEAMS())):
PHP-Code:
### Vasallenbonus entziehen beginn ###
pPreviousOwner = gc.getPlayer(iPreviousOwner)
if pPreviousOwner.getNumCities() == 0:
pPreviousTeam = gc.getTeam(pPreviousOwner.getTeam())
if any(pPreviousTeam.isVassal(i) for i in range(gc.getMAX_CIV_TEAMS())):
pHegemon = gc.getTeam(next(pPreviousTeam.isVassal(i) for i in range(gc.getMAX_CIV_TEAMS())))
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_PRODUCTIVE")):
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_PRODUCTIVE"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_MERKANTILE")):
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_MERKANTILE"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_MARITIME")):
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_MARITIME"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_MILITARY")):
pHegemon.setHasTech(gc.getInfoTypeForString("TECH_SUPPORT_STADTSTAATEN_MILITARY"),False,gc.getTeam(iMaster).getLeaderID(),False,True)
if pPreviousOwner.hasTrait(gc.getInfoTypeForString("TRAIT_STADTSTAAT_ARTISTIC")):
(loopCity, iter) = pHegemon.firstCity(false)
while(loopCity):
loopCity.setNumRealBuilding(gc.getCivilizationInfo(pHegemon.getCivilizationType()).getCivilizationBuildings(gc.getInfoTypeForString("BUILDINGCLASS_SUPPORT_STADTSTAAT_ARTISTIC")),0)
(loopCity, iter) = pHegemon.nextCity(iter, false)
if pHegemon.isHuman():
CyInterface().addImmediateMessage(CyTranslator().getText("TXT_KEY_VASALLENGESCHENK_SUPPORT_STADTSTAAT_LOST",()),"" )
### Vasallenbonus entziehen Ende ###
Geändert von Kathy (09. Juni 2011 um 21:03 Uhr)
Ne, oder? ...Tatsache, any gibt's erst seit 2.5
Naja, dann halt per Hand:
Das ganz oben zwischen PyInfo = PyHelpers.PyInfo und # globals (bitte mit Leerzeilen drunter und drüber, für die Lesbarkeit ) einfügen. Einrückung ist so in Ordnung (nur evtl musst du jeweils vier Leerzeichen durch einen Tab ersetzen, falls der sich daran stört).Code:def any(iterable): for item in iterable: if item: return True return False
Geändert von delnan (15. November 2010 um 19:09 Uhr)
Danke, delnan.
Denke, dass ich es heute im Laufe des Tages testen werde.
Sorry erstmal das ich hier einfach reinposte.
Habe mal zwei doofe fragen!!!!
1.) Kathy...stürzt dein Spiel nach dieser Fehlermeldung in der nächtsen Runde ab?!?!?
2.) Ich bekomme eine ähnliche Fehlermeldung bei meinen Mod...nur mit dem zusammenhang "onTechAcquired"....
Zur Info, habe den Techtree erweitert...
Was kann das sein, wie kann ich das beheben?!?!
Bei mir schmiert der Mod nämlich in der nächsten Runde ab!!!!
Habe im Eventmanager mal nach der Funktion geschaut und habe das gefunden...
Kann es sein das da irgendwas nicht passt im Zusammenhang mit meinen Mod???PHP-Code:
def onTechAcquired(self, argsList):
'Tech Acquired'
iTechType, iTeam, iPlayer, bAnnounce = argsList
# Note that iPlayer may be NULL (-1) and not a refer to a player object
# Show tech splash when applicable
if (iPlayer > -1 and bAnnounce and not CyInterface().noTechSplash()):
if (gc.getGame().isFinalInitialized() and not gc.getGame().GetWorldBuilderMode()):
if ((not gc.getGame().isNetworkMultiPlayer()) and (iPlayer == gc.getGame().getActivePlayer())):
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN)
popupInfo.setData1(iTechType)
popupInfo.setText(u"showTechSplash")
popupInfo.addPopup(iPlayer)
if (not self.__LOG_TECH):
return
CvUtil.pyPrint('%s was finished by Team %d'
%(PyInfo.TechnologyInfo(iTechType).getDescription(), iTeam))
Geändert von Monaldinio (02. Dezember 2010 um 11:25 Uhr)
Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!
Neu Version Conflict on Chiron v3.4 BETA - 16.01.16
Patch1 - 07.04.16
Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
Ihr könnt sofort loslegen.
Über Feedback würde ich mich freuen...