Was sagt denn die Civilopädie des Mods, was der Mahlstrom macht? Während wir hier im Nebel stochern, hilft ein Blick dort vielleicht, etwas auszuschließen.
Was sagt denn die Civilopädie des Mods, was der Mahlstrom macht? Während wir hier im Nebel stochern, hilft ein Blick dort vielleicht, etwas auszuschließen.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ich stehe vor einem Rätsel. Ich habe eine Python-Funktion in meinem Mod verändert. Wenn ich die jetzt Teste, funktioniert zumindest der erste Schritt davon ganz normal. Wenn ich dann aber den Spielstand laden will, den ich vorher gespeichert habe (und der sich, das habe ich getestet, vorher noch laden ließ) stürzt das Spiel ab. Debugging ergab nur eine kryptische Nachricht wegen einer Zugriffsverletzung. Noch kurioser war, dass sich der Spielstand auch danach nicht mehr lesen ließ.
Kann eine Python-Funktion einen Spielstand zerschießen, den ich gar nicht nach ihrem Ausführen überschrieben habe? Doch wohl eher nicht. Ich kapiere nicht, wie das kommen kann.
Zuerst hatte ich die Befürchtung, dass ich im SDK irgendwelche Mist gebaut hätte und Spielstände generell nicht mehr geladen werden können, aber ein neu erstelltes Spiel konnte ich laden, und ich konnte es auch laden, nachdem ich mir im Weltenbauer meine Testumgebung geschaffen hatte. Nur nach dem Ausführen der Python-Funktion ging es nicht mehr.
Hier ist der Pythoncode, wobei grün die heutigen Änderungen sind. Blau hatte ich zuletzt davor geändert, sollte aber unkritisch sein, da ich diese Änderung auch schon im Code meiner aktiven Story vorgenommen habe, wo ich die Spielstände bisher auch laden konnte.Code:def onCityLost(self, argsList): 'City Lost' city = argsList[0] player = PyPlayer(city.getOwner()) ###Spaltung Anfang### if city.isCapital(): if player.getNumCities() >14: if gc.getMAX_CIV_PLAYERS ()>CyGame().countCivPlayersAlive (): NewID = -1 for NumCiv in xrange (gc.getMAX_PLAYERS ()): PotPlayer = gc.getPlayer(NumCiv) if not PotPlayer.isEverAlive (): NewID = NumCiv break if NewID ==-1: for NumCiv in xrange (gc.getMAX_PLAYERS ()): PotPlayer = gc.getPlayer(NumCiv) if not PotPlayer.isAlive(): NewID = NumCiv break if NewID ==-1: return ###Kathy new: Rebell Civs Beginn iOwnerCiv = gc.getPlayer(city.getOwner()).getCivilizationType() # funktioniert iCiv1 = gc.getCivilizationInfo(iOwnerCiv).getRebellCiv() iCiv2 = gc.getCivilizationInfo(iOwnerCiv).getDerivativeCiv() iCiv3 = gc.getCivilizationInfo(iOwnerCiv).getDerivativeCitystate() # ###Kathy: Eliminiere existierende Civs aus der Liste for NumCiv in xrange (gc.getMAX_PLAYERS ()): LoopPlayer = gc.getPlayer(NumCiv) iLoopCiv = LoopPlayer.getCivilizationType() if ( iCiv1 == iLoopCiv ): iCiv1 = -1 if ( iCiv2 == iLoopCiv ): iCiv2 = -1 if ( iCiv3 == iLoopCiv ): iCiv3 = -1 # ### Kahty: Eliminiere existierende Civs aus der Liste iCiv = -1 if iCiv1 != -1: iCiv = iCiv1 elif iCiv2 != -1: iCiv = iCiv2 elif iCiv3 != -1: iCiv = iCiv3 ###Kathy new: Rebell Civs End if iCiv == -1: iCiv = iOwnerCiv CurCiv = gc.getCivilizationInfo(iCiv) NumLeaders = CurCiv.getNumLeaders() ### dice = gc.getGame().getMapRand() ### LeaderNum = dice.get(NumLeaders , "OracleSayMeTheLeader" ) LeaderNum = gc.getGame().getSorenRandNum(NumLeaders, "OracleSayMeTheLeader" ) LeaderCounter=0 for iLeaders in range(gc.getNumLeaderHeadInfos ()): if CurCiv.isLeaders(iLeaders): if NumLeaders==1: NewLeaderID =iLeaders break else: if LeaderCounter==LeaderNum: NewLeaderID=iLeaders break LeaderCounter=LeaderCounter+1 CyGame().addPlayer(NewID,NewLeaderID,iCiv) pNewPlayer = gc.getPlayer(NewID) iOldPlayer = city.getOwner() OldPlayer = gc.getPlayer(iOldPlayer) NewTeam = gc.getTeam(pNewPlayer.getTeam()) NewTeamID = NewTeam.getID() techcount=0 for techcount in range (gc.getNumTechInfos()): if ((player.getTeam().isHasTech(techcount)==true)): NewTeam.setHasTech(techcount,1,NewID,0,1) ### Age als Grundlage für Stärke des neuen Spielers iAge = pNewPlayer.getCurrentEra () ### Age als Grundlage für Stärke des neuen Spielers iCitiesNewPlayer = OldPlayer.getNumCities()/2 iCityCount = 0 (loopCity, iter) = OldPlayer.firstCity(True) while(loopCity): iCityX = loopCity.getX() iCityY = loopCity.getY() if ( loopCity.isCapital() == false ): pNewPlayer.acquireCity(loopCity,False,True) Defender = loopCity.getConscriptUnit () for i in range(1+iAge/2): pNewPlayer.initUnit( Defender, iCityX,iCityY, UnitAITypes.UNITAI_CITY_DEFENSE, DirectionTypes.DIRECTION_NORTH ) #### Beginn more Units Militia = loopCity.getFoodProducedUnit() for i in range(loopCity.getPopulation()/5 ): pNewPlayer.initUnit(Militia, iCityX,iCityY, UnitAITypes.UNITAI_CITY_DEFENSE, DirectionTypes.DIRECTION_NORTH ) if (iAge > 3 ): CavalryUnit = gc.getInfoTypeForString("UNIT_HORSE_ARCHER") CavalryUnitUpgrade = loopCity.allUpgradesAvailable(CavalryUnit,0) if (CavalryUnitUpgrade != -1): CavalryUnit = CavalryUnitUpgrade for i in range(1+iAge/5): pNewPlayer.initUnit(CavalryUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_NORTH ) if (iAge > 5 ): if loopCity.isCoastal(20): RiverUnit = gc.getInfoTypeForString("UNITCLASS_EINBAUM") RiverUnitUpgrade = loopCity.allUpgradesAvailable(RiverUnit ,0) if (RiverUnitUpgrade != -1): RiverUnit = RiverUnitUpgrade pNewPlayer.initUnit(RiverUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_ATTACK_SEA, DirectionTypes.DIRECTION_NORTH ) if (iAge > 6 ): ArtilleryUnit = gc.getInfoTypeForString("UNIT_OXYBELES") ArtilleryUnitUpgrade = loopCity.allUpgradesAvailable(ArtilleryUnit ,0) if (ArtilleryUnitUpgrade != -1): ArtilleryUnit = ArtilleryUnitUpgrade for i in range(1+iAge/10): pNewPlayer.initUnit(ArtilleryUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_ATTACK_CITY, DirectionTypes.DIRECTION_NORTH ) if (iAge > 10 ): FortUnit = gc.getInfoTypeForString("UNIT_OUTPOST") FortUnitUpgrade = loopCity.allUpgradesAvailable(FortUnit ,0) if (FortUnitUpgrade != -1): FortUnit = FortUnitUpgrade pNewPlayer.initUnit(FortUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_CITY_DEFENSE, DirectionTypes.DIRECTION_NORTH ) if (iAge > 20 ): FlakUnit = gc.getInfoTypeForString("UNIT_LIGHT_AA") FlakUnitUpgrade = loopCity.allUpgradesAvailable(FlakUnit ,0) if (FlakUnitUpgrade != -1): FlakUnit = FlakUnitUpgrade for i in range(1+iAge/6): pNewPlayer.initUnit(FlakUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_CITY_DEFENSE, DirectionTypes.DIRECTION_NORTH ) if (iAge > 21 ): JaegerUnit = gc.getInfoTypeForString("UNIT_DOPPELDECKER") JaegerUnitUpgrade = loopCity.allUpgradesAvailable(JaegerUnit ,0) if (JaegerUnitUpgrade != -1): JaegerUnit = JaegerUnitUpgrade pNewPlayer.initUnit(JaegerUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_DEFENSE_AIR, DirectionTypes.DIRECTION_NORTH ) #### More Units End loopCity.changeCulture(NewID,loopCity.getCulture(iOldPlayer),1) iCityCount = iCityCount+1 if iCityCount == iCitiesNewPlayer: break (loopCity, iter) = OldPlayer.nextCity(iter, true) ###Kathy: Unit Experience, um Auflösung zu verbeiden (loopUnit, iter) = pNewPlayer.firstUnit(true) while(loopUnit): loopUnit.changeExperience(1+iAge/2,30,false,false,false) if (loopUnit.getDomainType() == gc.getInfoTypeForString("DOMAIN_SEA")): loopUnit.setHasPromotion(gc.getInfoTypeForString("PROMOTION_DRILL1"),1) elif (loopUnit.getDomainType() == gc.getInfoTypeForString("DOMAIN_IMMOBILE")): loopUnit.setHasPromotion(gc.getInfoTypeForString("PROMOTION_CITY_GARRISON1"),1) loopUnit.setHasPromotion(gc.getInfoTypeForString("PROMOTION_DRILL1"),1) else: loopUnit.setHasPromotion(gc.getInfoTypeForString("PROMOTION_CITY_GARRISON1"),1) (loopUnit, iter) = (pNewPlayer.nextUnit(iter, true)) ###Kathy: Unit Experience, um Auflösung zu verbeiden pNewPlayer.setGold(player.getGold()/2) PlayerAdjectiv = player.getCivilizationInfo().getDescription () NewPlayerAdjectiv = CurCiv.getDescription () for iPlayer in range (gc.getMAX_CIV_PLAYERS ()): CyInterface().addMessage(iPlayer,False,15,CyTranslator().getText("TXT_KEY_CAPITAL_LOST",(PlayerAdjectiv,NewPlayerAdjectiv)),'',0,'Art/Interface/Buttons/General/warning_popup.dds',ColorTypes(gc.getInfoTypeForString("COLOR_RED")), city.getX(), city.getY(), True,True) ###Spaltung ENDE###
Beim ersten Absturz bekam ich auch einen assert (leider nicht bei weiteren Versuchen, so dass ich es nicht weiterverfolgen konnte.)
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Komischerweise lässt sich der zweite, vermeintlich ebenfalls verseuchte Spielstand jetzt doch wieder laden (und damit meine Testumgebung). Sehr seltsam.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Und auch der Spielstand nach der Spaltung lässt sich laden, wenn ich nach dem Python-Code speichere und ins Hauptmenü gehe. Warum sich Spielstand 2 allerdings nicht aus dem Spiel heraus laden ließ, nachdem ich den Code ausgeführt habe (und Spielstand 1 sogar gar nicht mehr, auch nicht aus dem Hauptmenü) verstehe ich einfach nicht.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
War das chatGPT/CoPilot?
Ich sehe folgendes nicht in der python reference (und kenne es auch selber nicht):
1) pCity.getFoodProducedUnit() bei dir: Militia = loopCity.getFoodProducedUnit()
2) pCity.allUpgradesAvailable() bei dir:
CavalryUnitUpgrade = loopCity.allUpgradesAvailable(CavalryUnit,0)
RiverUnitUpgrade = loopCity.allUpgradesAvailable(RiverUnit ,0)
ArtilleryUnitUpgrade = loopCity.allUpgradesAvailable(ArtilleryUnit ,0)
FortUnitUpgrade = loopCity.allUpgradesAvailable(FortUnit ,0)
FlakUnitUpgrade = loopCity.allUpgradesAvailable(FlakUnit ,0)
JaegerUnitUpgrade = loopCity.allUpgradesAvailable(JaegerUnit ,0)
das musst du bestimmt anders lösen.
Pie's Ancient Europe (PAE)
Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins allerletzte Detail!
Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features, die Spaß machen. Hand drauf!
- Pie's Ancient Europe (VII)
... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden soll ...
1) "getFoodProducedUnit()" habe ich im SDK definiert, das kannst du nicht kennen. Das macht es tatsächlich etwas schwierig, wenn ich mit meinem Code hier arbeite, weil so etwas öfter vorkommt.
2) pCity.allUpgradesAvailable() ist laut API eine Originalfunktion. "allUpgradesAvailable (UnitType eUnit, INT iUpgradeCount)"
Diese beiden Codeteile funktionieren auch wie gewünscht. Das komische war vor allem, dass ich nach der Anwendung dieses Codestück nicht mehr ohne Absturz den vorherigen Spielstand laden konnte - der ja eigentlich durch die Funktion gar nicht verändert werden sollte. Beim zweiten Versuch funktionierten die alten Spielstände wenigstens wieder, nachdem ich das Spiel immer über das Hauptmenü verlassen und den Spielstand geladen hatte. Die Frage, warum das Laden nicht funktioniert hat, kann ich nicht beantworten. Aber es scheint auch kein permanentes Problem zu sein. Hoffe ich. Das Problem hat sich also irgendwie von selbst aufgelöst, auch wenn ich Angst habe, dass es im ungünstigsten Moment wieder auftaucht.
Mit ChatGPT arbeite ich gar nicht, ich versuche zumindest, zu verstehen, was ich mache. Auch wenn mir das nicht immer gelingt.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ah ok, wegen getFoodProducedUnit(). Wenn ich gpt wegen civ4 c++ frage, schmeißt der mir immer funktionen vor, die es gar nicht gibt.
und stimmt, allUpradesAvailable gibt es doch in der python reference. Hab mit () gesucht und da hat ers nicht gefunden. naja wenns nur ein einmaliger Fehler war... vielleicht durhc das Verändern der python Datei während dem Spiel, dann würd ich mir keine Sorgen machen.
Pie's Ancient Europe (PAE)
Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins allerletzte Detail!
Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features, die Spaß machen. Hand drauf!
- Pie's Ancient Europe (VII)
... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden soll ...
Ich glaube, einen Fehler habe ich gefunden:
pNewPlayer.initUnit(CavalryUnitUpgrade, iCityX,iCityY, UnitAITypes.UNITAI_ATTACK, DirectionTypes.DIRECTION_NORTH )
Das müsste meine ich CavalryUnit sein. CavalryUnitUpgrade kann meine ich 0 / leer sein ? Andernfalls ergibt die Zuweisung von CavalryUnit = CavalryUnitUpgrade 2 Zeilen höher wenig Sinn.
Der selber Fehler wird auch für die anderen Einheitentypen wiederholt.
Ich kann mir gut vorstellen, dass in der initUnit Funktion ein assert vorkommt.
Achtung Spoiler:
Gut beobachtet.
Das ist ein Fehler - den hatte ich später gefunden, nachdem es wieder lief.
Und es gab auch noch den Fehler, dass das Flussschiff mit UNITCLASS_ statt UNIT_ initiiert wurde, führte auch zu Problemen.
Aber keiner dieser Fehler sollte eigentlich einen Spielstand zerstören, schlimmstenfalls würde das Spiel an der Stelle abstürzen bzw. es gibt einen Fehler und danach wird der restliche Pythoncode gar nicht mehr ausgeführt.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys