Jo, da stehen alle Einheitenzüge drin. Auf großen Karten läppert sich das. Davon ist insbesondere das Ende interessant, falls es in einem KI-Zug zum Crash kommt.
Hier brauchen wir vermutlich die python logs, und im PythonErr.log steht ja auch schon das Problem. Die sind immer fies, die unidentifiable C++ exceptions.
Ins Blaue geraten: dem hängt ein Sonderzeichen quer. Aber in update time? Probiert mal, die Uhr auszustellen.
Die Uhr isses nicht.
Kann es was mit dem Juli zu tun haben? Der heisst nämlich bei mir Judentum... hat zwar kein Sonderzeichen, aber das seh ich zum ersten Mal (auf nem Bild weiter oben)
(also wenn man 2 Runden pro Jahr hat gibts ja Januar und Juli normalerweise. Denke Judentum heisst es, weil ich Christ bin, oder so...)
Geändert von brettschmitt (09. Juni 2020 um 01:11 Uhr)
Puh... keine Fehler von meiner Seite
In der updateTime Funktion steht folgendes:
g_szTimeText = localText.getText("TXT_KEY_TIME_TURN", (gc.getGame().getGameTurn(), )) + u" - " + unicode(CyGameTextMgr().getInterfaceTimeStr(ePlayer))
Und ja, das ist im MainInterface und wenns da was hat, dann wird wohl auch nix anderes angezeigt!
Ich schätze mal, der Fehler liegt bei CyGameTextMgr().getInterfaceTimeStr(ePlayer). Wie kann man das beeinflussen? Im XML?
Pie's Ancient Europe (PAE)
Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.
- Pie's Ancient Europe (letztes Update: 22.12.2022)
... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!
Zur weiteren Einschränkung kann man es mal mit Englischer Interface-Sprache statt Deutsch probieren
In der Phase kommt neben Januar und Juli vllt auch noch März (Umlaut!, wobei es ja April sein müsste) und September hinzu.
Ich hab jetzt nochmal ALLE Bilder von mir durchgeschaut...
Es ist IMMER der Sommer, der nicht funktioniert.
Januar geht und Judentum (Juli) geht nur manchmal (nach neuladen vor allem)
Versuche es jetzt mal auf Englisch...
Der Code ist etwas verschachtelt. Glaube man kann es auf die fett markierte Zeile eingrenzen. Irgendwie habe ich was ähnliches für einen Civfanatiker (DarkLunaPhantom) schon mal gefixt
Edit: Ah, wenn getTurnMonthForGame(...) -1 zurückgibt, dann wird getMonthInfo() auf eine Stelle außerhalb des Vektors zugreifen. Da steht dann manchmal zufällig Judentum und manchmal führt es zum Crash.Code:void CvGameTextMgr::setDateStr(CvWString& szString, int iGameTurn, bool bSave, CalendarTypes eCalendar, int iStartYear, GameSpeedTypes eSpeed) { CvWString szYearBuffer; CvWString szWeekBuffer; setYearStr(szYearBuffer, iGameTurn, bSave, eCalendar, iStartYear, eSpeed); switch (eCalendar) { case CALENDAR_DEFAULT: if (0 == (getTurnMonthForGame(iGameTurn + 1, iStartYear, eCalendar, eSpeed) - getTurnMonthForGame(iGameTurn, iStartYear, eCalendar, eSpeed)) % GC.getNumMonthInfos()) { szString = szYearBuffer; } else { int iMonth = getTurnMonthForGame(iGameTurn, iStartYear, eCalendar, eSpeed); if (bSave) { szString = (szYearBuffer + "-" + GC.getMonthInfo((MonthTypes)(iMonth % GC.getNumMonthInfos())).getDescription()); } else { szString = (GC.getMonthInfo((MonthTypes)(iMonth % GC.getNumMonthInfos())).getDescription() + CvString(", ") + szYearBuffer); } } break;
Geändert von Ramkhamhaeng (09. Juni 2020 um 01:49 Uhr)
Geändert von brettschmitt (09. Juni 2020 um 01:52 Uhr)
Ok, dann gilt wohl das aus meinem Edit. Fucking -1 wirds sein
Wird sind kurz davor, aber ich verabschiede mich dann mal mit dem Codeausschnitt in dem ich die Rückgabe von -1 vermute
Code:int getTurnMonthForGame(int iGameTurn, int iStartYear, CalendarTypes eCalendar, GameSpeedTypes eSpeed) { int iTurnMonth; int iTurnCount; int iI; iTurnMonth = iStartYear * GC.getNumMonthInfos(); switch (eCalendar) { case CALENDAR_DEFAULT: iTurnCount = 0; for (iI = 0; iI < GC.getGameSpeedInfo(eSpeed).getNumTurnIncrements(); iI++) { if (iGameTurn > (iTurnCount + GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(iI).iNumGameTurnsPerIncrement)) { iTurnMonth += (GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(iI).iMonthIncrement * GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(iI).iNumGameTurnsPerIncrement); iTurnCount += GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(iI).iNumGameTurnsPerIncrement; } else { iTurnMonth += (GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(iI).iMonthIncrement * (iGameTurn - iTurnCount)); iTurnCount += (iGameTurn - iTurnCount); break; } } if (iGameTurn > iTurnCount) { iTurnMonth += (GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(GC.getGameSpeedInfo(eSpeed).getNumTurnIncrements() - 1).iMonthIncrement * (iGameTurn - iTurnCount)); } break;
Macht aus == einfach >=, dann sollte die -1 nix mehr tun.PHP-Code:
case CALENDAR_DEFAULT:
if (0 == (getTurnMonthForGame
Ansonsten wird es ein Fehler in deiner Spezialgeschwindigkeit sein, wenn du die benutzt.
Vielleicht reichen die Einträge bei der Spezialgeschwindigkeit nicht aus um alle Runden abzudecken.
Mit Spezialgeschwindigkeit meint ihr 2 Runden pro Jahr, oder wie?
Das hab ich in der alten Gamespeed aber auch gehabt. die letzten 100 Jahre waren schon immer Januar und Juli... ohne Probleme. Diesmal kommt es halt einfach schon 50 v.Chr. (statt 400 n.Chr.)
Habt ihr denn jetzt ne Lösung für mich, dass mein Spiel weitergehen kann?
Januar und Juli sollte funktionieren, sogar Wochenschritte, aber wenn in deiner Gamespeed-Definition ein Fehler drin ist, kanns halt sein, dass das Spiel irgendwann keinen richtigen Monat mehr findet.
Mein Vorschlag wär eine SDK-Änderung und eh nur ein Workaround, der das zugrundeliegende Problem wegignoriert, also erstmal bitte normale Fehlersuche betreiben
Häng bitte mal deine Spielgeschwindigkeit an, dann guck ich nachher rein.
Geändert von brettschmitt (09. Juni 2020 um 19:02 Uhr)
11502%12 = 6 --> JuliPHP-Code:
iTurnMonth = iStartYear * GC.getNumMonthInfos() // was steckt da hinter? Ich finde keine Stelle, an der m_paMonthInfo geschrieben wird. Aber wird wohl 12 sein, entsprechend den Einträgen in Civ4MonthInfos.xml.
iTurnCount = 0;
for (iI = 0; iI < 8; iI++)
{
if (967 > (iTurnCount + [50, 300, 300, 150, 150, 100, 400, 50]))
{
iTurnMonth += [12000, 36000, 18000, 3600, 1800, 600, 4800, 1200];
iTurnCount += [50, 300, 300, 150, 150, 100, 400, 50]
}
else //iI = 5, iTurnCount = 1050, iTurnMonth = 72000-5000*12 = 12000
{
iTurnMonth += (6 * (967 - 1050)); = 11502
iTurnCount += (967 - 1050); = 967
break;
}
}
if (iGameTurn > iTurnCount)
{
iTurnMonth += (GC.getGameSpeedInfo(eSpeed).getGameTurnInfo(GC.getGameSpeedInfo(eSpeed).getNumTurnIncrements() - 1).iMonthIncrement * (iGameTurn - iTurnCount));
}
break;
Es scheint weder am Code noch am XML zu liegen...