Seite 169 von 180 ErsteErste ... 69119159165166167168169170171172173179 ... LetzteLetzte
Ergebnis 2.521 bis 2.535 von 2699

Thema: Der SDK-Fragen-Thread

  1. #2521
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Da fällt mir ein, dass ich wahrscheinlich nicht die besste Stelle im Code als Basis nahm… Bei dem Angebot in CvPlayerAI.cpp für die Vasallierung steht folgendes. Bis auf die Kapesellung mit canTradeItem sehe ich da allerdings wenig unterschiede zu deinem jetztigen Code Sollte also schon nah am funktionieren sein.
    Code:
    {
    												setTradeItem(&item, TRADE_VASSAL);
    
    												if (canTradeItem((PlayerTypes)iI, item, true))
    												{
    													ourList.clear();
    													theirList.clear();
    
    													ourList.insertAtEnd(item);
    
    													if (GET_PLAYER((PlayerTypes)iI).isHuman())
    													{
    														if (!(abContacted[GET_PLAYER((PlayerTypes)iI).getTeam()]))
    														{
    															AI_changeContactTimer(((PlayerTypes)iI), CONTACT_PERMANENT_ALLIANCE, GC.getLeaderHeadInfo(getPersonalityType()).getContactDelay(CONTACT_PERMANENT_ALLIANCE));
    															pDiplo = new CvDiploParameters(getID());
    															FAssertMsg(pDiplo != NULL, "pDiplo must be valid");
    															pDiplo->setDiploComment((DiploCommentTypes)GC.getInfoTypeForString("AI_DIPLOCOMMENT_OFFER_VASSAL"));
    															pDiplo->setAIContact(true);
    															pDiplo->setOurOfferList(theirList);
    															pDiplo->setTheirOfferList(ourList);
    															gDLL->beginDiplomacy(pDiplo, (PlayerTypes)iI);
    															abContacted[GET_PLAYER((PlayerTypes)iI).getTeam()] = true;
    														}
    													}
    													else
    													{
    														bool bAccepted = true;
    														TeamTypes eMasterTeam = GET_PLAYER((PlayerTypes)iI).getTeam();
    														for (int iTeam = 0; iTeam < MAX_CIV_TEAMS; iTeam++)
    														{
    															if (GET_TEAM((TeamTypes)iTeam).isAlive())
    															{
    															if (iTeam != getTeam() && iTeam != eMasterTeam && atWar(getTeam(), (TeamTypes)iTeam) && !atWar(eMasterTeam, (TeamTypes)iTeam))
    															{
    																if (GET_TEAM(eMasterTeam).AI_declareWarTrade((TeamTypes)iTeam, getTeam(), false) != NO_DENIAL)
    																{
    																	bAccepted = false;
    																	break;
    																}
    															}
    														}
    														}
    
    														if (bAccepted)
    														{
    															GC.getGameINLINE().implementDeal(getID(), ((PlayerTypes)iI), &ourList, &theirList);
    														}
    													}
    												}
    											}

  2. #2522
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Du hast genau den Punkt getroffen - ich hatte in meinem Test nicht die Technologie für Vasallenstaaten. Nachdem ich mir die im WB gegeben hatte, kontaktierten mich die getesteten Zivilisationen anstandslos.
    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

  3. #2523
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896

  4. #2524
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Ich habe eine Frage zu einem Stück Code, das ich modifiziert habe: Die Abspaltung von Zivilisationen in Übersee. Hier ist der Code aus BtS, modifiziert durch mich an der roten Stelle.
    Code:
    bool CvPlayer::splitEmpire(int iAreaId)
    {
    	PROFILE_FUNC();
    
    	if (!canSplitEmpire())
    	{
    		return false;
    	}
    
    	if (!canSplitArea(iAreaId))
    	{
    		return false;
    	}
    
    	CvArea* pArea = GC.getMapINLINE().getArea(iAreaId);
    	if (NULL == pArea)
    	{
    		return false;
    	}
    
    	PlayerTypes eNewPlayer = getSplitEmpirePlayer(iAreaId);
    	if (eNewPlayer == NO_PLAYER)
    	{
    		return false;
    	}
    
    	bool bPlayerExists = GET_TEAM(GET_PLAYER(eNewPlayer).getTeam()).isAlive();
    	FAssert(!bPlayerExists);
    	if (!bPlayerExists)
    	{
    		int iBestValue = -1;
    		LeaderHeadTypes eBestLeader = NO_LEADER;
    		CivilizationTypes eBestCiv = NO_CIVILIZATION;
    
    		CivLeaderArray aLeaders;
    		if (getSplitEmpireLeaders(aLeaders))
    		{
    			CivLeaderArray::iterator it;
    			for (it = aLeaders.begin(); it != aLeaders.end(); ++it)
    			{
    				int iValue = (1 + GC.getGameINLINE().getSorenRandNum(100, "Choosing Split Personality"));
    
    				if (GC.getCivilizationInfo(getCivilizationType()).getDerivativeCiv() == it->first)
    				{
    					iValue += 1000;
    				}
    				///Derivative CityStates added Beginn
    				if (GC.getCivilizationInfo(getCivilizationType()).getDerivativeCitystate() == it->first)
    				{
    					iValue += 500;
    				}
    				///Derivative CityStates added End
    
    				if (iValue > iBestValue)
    				{
    					iBestValue = iValue;
    					eBestLeader = it->second;
    					eBestCiv = it->first;
    				}
    			}
    		}
    
    		if (eBestLeader == NO_LEADER || eBestCiv == NO_CIVILIZATION)
    		{
    			return false;
    		}
    
    		CvWString szMessage = gDLL->getText("TXT_KEY_MISC_EMPIRE_SPLIT", getNameKey(), GC.getCivilizationInfo(eBestCiv).getShortDescriptionKey(), GC.getLeaderHeadInfo(eBestLeader).getTextKeyWide());
    		for (int i = 0; i < MAX_CIV_PLAYERS; ++i)
    		{
    			if (GET_PLAYER((PlayerTypes)i).isAlive())
    			{
    				if (i == getID() || i == eNewPlayer || GET_TEAM(GET_PLAYER((PlayerTypes)i).getTeam()).isHasMet(getTeam()))
    				{
    					gDLL->getInterfaceIFace()->addMessage((PlayerTypes)i, false, GC.getEVENT_MESSAGE_TIME(), szMessage, "AS2D_REVOLTEND", MESSAGE_TYPE_MAJOR_EVENT, ARTFILEMGR.getInterfaceArtInfo("INTERFACE_CITY_BAR_CAPITAL_TEXTURE")->getPath());
    				}
    			}
    		}
    		GC.getGameINLINE().addReplayMessage(REPLAY_MESSAGE_MAJOR_EVENT, getID(), szMessage, -1, -1, (ColorTypes)GC.getInfoTypeForString("COLOR_HIGHLIGHT_TEXT"));
    
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                      12/30/08                                jdog5000      */
    /*                                                                                              */
    /* Bugfix                                                                                       */
    /************************************************************************************************/
    /*
    		// remove leftover culture from old recycled player
    		for (int iPlot = 0; iPlot < GC.getMapINLINE().numPlotsINLINE(); ++iPlot)
    		{
    			CvPlot* pLoopPlot = GC.getMapINLINE().plotByIndexINLINE(iPlot);
    
    			pLoopPlot->setCulture(eNewPlayer, 0, false, false);
    		}
    */
    		// Clearing plot culture along with many other bits of data now handled by CvGame::addPlayer
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/
    
    		GC.getGameINLINE().addPlayer(eNewPlayer, eBestLeader, eBestCiv);
    		GET_PLAYER(eNewPlayer).setParent(getID());
    		GC.getInitCore().setLeaderName(eNewPlayer, GC.getLeaderHeadInfo(eBestLeader).getTextKeyWide());
    
    		CvTeam& kNewTeam = GET_TEAM(GET_PLAYER(eNewPlayer).getTeam());
    		for (int i = 0; i < GC.getNumTechInfos(); ++i)
    		{
    			if (GET_TEAM(getTeam()).isHasTech((TechTypes)i))
    			{
    				kNewTeam.setHasTech((TechTypes)i, true, eNewPlayer, false, false);
    				if (GET_TEAM(getTeam()).isNoTradeTech((TechTypes)i) || GC.getGameINLINE().isOption(GAMEOPTION_NO_TECH_BROKERING))
    				{
    					kNewTeam.setNoTradeTech((TechTypes)i, true);
    				}
    			}
    		}
    
    		for (int iTeam = 0; iTeam < MAX_TEAMS; ++iTeam)
    		{
    			CvTeam& kLoopTeam = GET_TEAM((TeamTypes)iTeam);
    
    			if (kLoopTeam.isAlive())
    			{
    				kNewTeam.setEspionagePointsAgainstTeam((TeamTypes)iTeam, GET_TEAM(getTeam()).getEspionagePointsAgainstTeam((TeamTypes)iTeam));
    				kLoopTeam.setEspionagePointsAgainstTeam(GET_PLAYER(eNewPlayer).getTeam(), kLoopTeam.getEspionagePointsAgainstTeam(getTeam()));
    			}
    		}
    		kNewTeam.setEspionagePointsEver(GET_TEAM(getTeam()).getEspionagePointsEver());
    
    		GET_TEAM(getTeam()).assignVassal(GET_PLAYER(eNewPlayer).getTeam(), false);
    
    		AI_updateBonusValue();
    	}
    
    	std::vector< std::pair<int, int> > aCultures;
    	for (int iPlot = 0; iPlot < GC.getMapINLINE().numPlotsINLINE(); ++iPlot)
    	{
    		CvPlot* pLoopPlot = GC.getMapINLINE().plotByIndexINLINE(iPlot);
    
    		bool bTranferPlot = false;
    
    		if (!bTranferPlot && pLoopPlot->area() == pArea)
    		{
    			bTranferPlot = true;
    		}
    
    		if (!bTranferPlot)
    		{
    			CvCity* pWorkingCity = pLoopPlot->getWorkingCity();
    			if (NULL != pWorkingCity && pWorkingCity->getOwnerINLINE() == getID() && pWorkingCity->area() == pArea)
    			{
    				bTranferPlot = true;
    			}
    		}
    
    		if (!bTranferPlot && pLoopPlot->isWater() && pLoopPlot->isAdjacentToArea(pArea))
    		{
    			bTranferPlot = true;
    		}
    
    		if (bTranferPlot)
    		{
    			int iCulture = pLoopPlot->getCulture(getID());
    
    			if (bPlayerExists)
    			{
    				iCulture = std::max(iCulture, pLoopPlot->getCulture(eNewPlayer));
    			}
    
    			aCultures.push_back(std::make_pair(iPlot, iCulture));
    		}
    
    		if (pLoopPlot->isRevealed(getTeam(), false))
    		{
    			pLoopPlot->setRevealed(GET_PLAYER(eNewPlayer).getTeam(), true, false, getTeam(), false);
    		}
    	}
    
    	int iLoop;
    	for (CvCity* pLoopCity = firstCity(&iLoop); pLoopCity != NULL; pLoopCity = nextCity(&iLoop))
    	{
    		if (pLoopCity->area() == pArea)
    		{
    			int iCulture = pLoopCity->getCultureTimes100(getID());
    			CvPlot* pPlot = pLoopCity->plot();
    
    			GET_PLAYER(eNewPlayer).acquireCity(pLoopCity, false, true, false);
    
    			if (NULL != pPlot)
    			{
    				CvCity* pCity = pPlot->getPlotCity();
    				if (NULL != pCity)
    				{
    					pCity->setCultureTimes100(eNewPlayer, iCulture, false, false);
    				}
    
    				for (int i = 0; i < GC.getDefineINT("COLONY_NUM_FREE_DEFENDERS"); ++i)
    				{
    					pCity->initConscriptedUnit();
    				}
    			}
    		}
    	}
    
    	for (uint i = 0; i < aCultures.size(); ++i)
    	{
    		CvPlot* pPlot = GC.getMapINLINE().plotByIndexINLINE(aCultures[i].first);
    		pPlot->setCulture(eNewPlayer, aCultures[i].second, true, false);
    		pPlot->setCulture(getID(), 0, true, false);
    
    		for (int iTeam = 0; iTeam < MAX_TEAMS; ++iTeam)
    		{
    			if (pPlot->getRevealedOwner((TeamTypes)iTeam, false) == getID())
    			{
    				pPlot->setRevealedOwner((TeamTypes)iTeam, eNewPlayer);
    			}
    		}
    	}
    
    
    	GC.getGameINLINE().updatePlotGroups();
    
    	return true;
    }
    Wenn ich das richtig sehe, wird für jeden Leader in der Liste (die Liste enthält alle Leader, die einer Civ angehören, die noch nicht im Spiel war) ein Wert iValue von 1 bis 101 ausgewürfelt. Bei der "DerivativeCivilization" wird 1000 addiert, iValue ist also immer von 1001 bis 1101. Das heißt, es ist IMMER größer als iValue von einer Zivilisation, die nicht die abgeleitete Zivilisation dessen ist, der sich spaltet. Das passt zu meinen Beobachtungen uns ist sicher natürlich auch so gewollt.
    Aber: Wenn es schon einen Spieler von dieser Zivilisation gab, haben alle vor meiner Änderung die selbe Chance, auserwählt zu werden (bis auf die Tatsache, dass weiter oben in der Leader-Liste stehende bevorzugt werden, da sie beim selben Zufallswert zuerst gewählt werden).
    Durch meine Änderung soll die Zivilisation, die beim Spieler als "DerivativeCitystate" eingetragen ist, ebenfalls bevorzugt werden, indem zu iValue 500 addiert wird. Dadurch hat diese einen Wert von 501 bis 601 und sollte IMMER genommen werden (ihr Wert ist min. 501, und damit immer höher als 101), wenn sie noch frei ist, und die eigentliche DerivativeCivilization nicht benutzt ist (deren Wert ist ja immer mindestens 1001, also höher als 601). Nur: In meinem Spiel passierte das eben nicht. Obwohl eine Zivilisation sich spaltete, deren Derivative Civ schon existierte, kam nicht die unter "DerivativeCitystate" eingetragene Zivilisation zum Zug, sondern eine andere. Wo ist nun mein Denkfehler?

    Die Liste aLeaders wird wie folgt gefüllt, daran habe ich auch nichts herumgefuscht:
    Code:
    bool CvPlayer::getSplitEmpireLeaders(CivLeaderArray& aLeaders) const
    {
    	aLeaders.clear();
    
    	for (int i = 0; i < GC.getNumCivilizationInfos(); ++i)
    	{
    		bool bValid = true;
    
    		if (getCivilizationType() == i)
    		{
    			bValid = false;
    		}
    
    		if (bValid)
    		{
    			if (!GC.getCivilizationInfo((CivilizationTypes)i).isPlayable() || !GC.getCivilizationInfo((CivilizationTypes)i).isAIPlayable())
    			{
    				bValid = false;
    			}
    		}
    
    		if (bValid)
    		{
    			for (int j = 0; j < MAX_CIV_PLAYERS; ++j)
    			{
    				if (getID() != j && GET_PLAYER((PlayerTypes)j).isEverAlive() && GET_PLAYER((PlayerTypes)j).getCivilizationType() == i)
    				{
    					bValid = false;
    					break;
    				}
    			}
    		}
    
    		if (bValid)
    		{
    			for (int j = 0; j < GC.getNumLeaderHeadInfos(); ++j)
    			{
    				bool bLeaderValid = true;
    				if (!GC.getCivilizationInfo((CivilizationTypes)i).isLeaders(j) && !GC.getGameINLINE().isOption(GAMEOPTION_LEAD_ANY_CIV))
    				{
    					bLeaderValid = false;
    				}
    
    				if (bLeaderValid)
    				{
    					for (int k = 0; k < MAX_CIV_PLAYERS; ++k)
    					{
    						if (GET_PLAYER((PlayerTypes)k).isEverAlive() && GET_PLAYER((PlayerTypes)k).getPersonalityType() == j)
    						{
    							bLeaderValid = false;
    						}
    					}
    				}
    
    				if (bLeaderValid)
    				{
    					aLeaders.push_back(std::make_pair((CivilizationTypes)i, (LeaderHeadTypes)j));
    				}
    			}
    		}
    	}
    
    	return (aLeaders.size() > 0);
    }
    Wobei ich da auch nicht ganz sicher bin: Wird sie da wirklich gefüllt? Für mich sieht das aus, als würde nur ein bool zurückgegeben, aber kein Array.
    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

  5. #2525
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Ich denke, ich habe meinen Denkfehler.
    Code:
    		if (bValid)
    		{
    			if (!GC.getCivilizationInfo((CivilizationTypes)i).isPlayable() || !GC.getCivilizationInfo((CivilizationTypes)i).isAIPlayable())
    			{
    				bValid = false;
    			}
    		}
    bedeutet, dass die Zivilisation ausgeschlossen ist, wenn sie entweder nicht Spielbar oder nicht KI-Spielbar ist. Ich habe das die ganze Zeit falsch gelesen, nämlich in dem Sinne: Wird nicht false, wenn sie Spielbar oder KI-Spielbar ist. Da Stadtstaaten nicht spielbar sind, werden sie hier immer false.
    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

  6. #2526
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Ich habe ein Problem mit meinem aktuelle Mod, und zwar mit dem hier geposteten Spielstand. Das Spiel stürzt beim Rundenwechsel sofort ab. Laut den Logs läuft es mindesten noch bis Hamburg weiter, das in dieser Runde wächst. Der nächste Spieler kommt aber nicht mehr an die Reihe, auch wir zumindest die Anzeige von Frankfurt nicht mehr aktualisiert, was darauf schließen lässt, dass die Runde nicht beendet wird.
    Es ist mir aber weder mit der Debug-Dll noch durch Auswertung der Logs gelungen, das Problem weiter einzukreisen. Die Haltepunkte, die ich bei City:: DoTurn gesetzt habe (bei allen Funktionen, die ich eingefügt habe) werden alle nicht erreicht, vorher gibt es einen unberechigten Zugriff, der ein weiteres Debuggen nicht zulässt. Ich habe keine Ahnung, wie ich das Problem weiter eingrenzen soll. Hat von euch noch jemand eine Idee?
    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

  7. #2527
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.016
    Zitat Zitat von Kathy Beitrag anzeigen
    Ich habe ein Problem mit meinem aktuelle Mod, und zwar mit dem hier geposteten Spielstand. Das Spiel stürzt beim Rundenwechsel sofort ab. Laut den Logs läuft es mindesten noch bis Hamburg weiter, das in dieser Runde wächst. Der nächste Spieler kommt aber nicht mehr an die Reihe, auch wir zumindest die Anzeige von Frankfurt nicht mehr aktualisiert, was darauf schließen lässt, dass die Runde nicht beendet wird.
    Es ist mir aber weder mit der Debug-Dll noch durch Auswertung der Logs gelungen, das Problem weiter einzukreisen. Die Haltepunkte, die ich bei City:: DoTurn gesetzt habe (bei allen Funktionen, die ich eingefügt habe) werden alle nicht erreicht, vorher gibt es einen unberechigten Zugriff, der ein weiteres Debuggen nicht zulässt. Ich habe keine Ahnung, wie ich das Problem weiter eingrenzen soll. Hat von euch noch jemand eine Idee?
    Du kannst das Problem sicher auf die Stadtverarbeitung reduzieren? Müsste nach Hamburg noch eine Stadt kommen? Und bist du sicher, dass der Fehler nicht schon in Hamburg ist? Was meinst du mit Anzeige von Frankfurt? Wäre das die nächste Stadt? WIchtig wäre zu wissen, ob die DoTurn der nächsten Stadt überhaupt erreicht wird. Nur bei eigenen neuen Sachen zu halten, dürfte nicht ausreichen.
    Geändert von rucivfan (28. September 2016 um 12:46 Uhr)

  8. #2528
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Ich kann es nicht sicher reduzieren. Ich kann nur folgende Fakten beobachten:
    1) Der Log arbeitet noch bis Hamburg korrekt (Hamburg has grown...), der Fehler kann aber auch in Hamburg nach dem Wachstum sein
    2) Nach Hamburg kämen noch 4 weitere Städte: Bremen, München, Köln und dann Frankfurt. Dessen Grafikanzeige wird nicht aktualisiert - bei den anderen kann ich es nicht sagen, da sie Forschungspunkte bauen.
    3) Wenn ich Haltepunkte setze und einen Debug-Durchlauf spiele, wird für gar keine Stadt doTurn angezeigt, er meldet vorher schon einen unberechtigten Zugriff, der sich auch nicht überspringen lässt. Ob also Frankfurt oder irgend eine Stadt nach Hamburg noch erreicht wird, kann ich nicht sagen.
    4) Die eigene Forschungs- und Goldanzeige wird auch nicht aktualisiert, woraus ich schließe, dass Player::doTurn auch nicht zum Ende ausgeführt wird, bzw. weder doResearch noch doGold erreicht
    5) Das Auslöschen des nächsten Spielers hat keine Auswirkungen, woraus ich schließe, dass das Spieler nicht der Auslöser ist. Da auch keine Forschungsanzeigen der anderen Spieler aktualisiert werden, denke ich nicht, dass überhaupt ein späterer Spieler das Problem ist. Der Fehler muss irgendwo bei einer der fünf Städte - Hamburg eingeschlossen - oder im Rundenende des Spielers liegen, und zwar im Abschnitt nach dem Loop durch alle Städte und vor doGold. Das aber ist wiederum unlogisch, da doGold und doResearch vor der Schleife mit den Städten liegen. Eventuell wird also das Gold und die Forschung schon berechnet, aber nicht aktualisiert. Das heißt, vielleicht wird auch Frankfurt berechnet und nur die Anzeige (Baufortschrittsbalken und aktuelles Bauprojekt) nicht aktualisiert.
    6) Das Deaktivieren der von mir erstellten Codes "doVerifyCityStateMissionsDone()", "doNewCityStateMissions()" und "GET_TEAM(getTeam()).UpdateVassals(getTeam())" in CvPlayer::doTurn bewirkt nichts, wenn da also Fehler sind, sind sie zumindest nicht für diesen Crash verantwortlich
    7) Eine falsche Einheitengrafik (früher ein häufiger Fehler bei mir) ist wohl auch nicht der Auslöser, denn auch ein Deaktivieren aller Zivilisationsspezifischer Einheitengrafiken behebt den Absturz nicht.
    8) Das Log endet so:
    PY:Berlin has grown
    PY:Hamburg has grown
    load_module CvRandomEventInterface
    Möglicherweise wird also doch das Ende aller Städte erreicht, vermutlich sogar doEvent(). Aber bevor die Anzeige aktualisiert wird, passiert irgend ein Event.

    Denn müsste der Fehler in diesem Block sein:
    Code:
    	doEvents();
    
    	updateEconomyHistory(GC.getGameINLINE().getGameTurn(), calculateTotalCommerce());
    	updateIndustryHistory(GC.getGameINLINE().getGameTurn(), calculateTotalYield(YIELD_PRODUCTION));
    	updateAgricultureHistory(GC.getGameINLINE().getGameTurn(), calculateTotalYield(YIELD_FOOD));
    	updatePowerHistory(GC.getGameINLINE().getGameTurn(), getPower());
    	updateCultureHistory(GC.getGameINLINE().getGameTurn(), countTotalCulture());
    	updateEspionageHistory(GC.getGameINLINE().getGameTurn(), GET_TEAM(getTeam()).getEspionagePointsEver());
    	expireMessages();  // turn log
    
    	gDLL->getInterfaceIFace()->setDirty(CityInfo_DIRTY_BIT, true);
    
    	AI_doTurnPost();
    
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                      07/08/09                                jdog5000      */
    /*                                                                                              */
    /* Debug                                                                                        */
    /************************************************************************************************/
        if( GC.getGameINLINE().isDebugMode() )
    	{
    		GC.getGameINLINE().updateColoredPlots();
    	}
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/
    
    	CvEventReporter::getInstance().endPlayerTurn( GC.getGameINLINE().getGameTurn(),  getID());
    Komischerweise werden aber schon die vorher gesetzten Haltepunkte bei gar keiner Stadt erreicht.
    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

  9. #2529
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.016
    Zitat Zitat von Kathy Beitrag anzeigen
    3) Wenn ich Haltepunkte setze und einen Debug-Durchlauf spiele, wird für gar keine Stadt doTurn angezeigt, er meldet vorher schon einen unberechtigten Zugriff, der sich auch nicht überspringen lässt. Ob also Frankfurt oder irgend eine Stadt nach Hamburg noch erreicht wird, kann ich nicht sagen.
    Es wird dir auch keine Möglichkeit angeboten, zu der Codestelle zu springen? Ohne den Gesamtcode kann man dazu wenig sagen.

  10. #2530
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Leider nein. Man kann sich "Disassembly" anzeigen lassen, aber davon verstehe ich gar nichts.
    Mein Code müsste sich im aktuellen Download von meinem Mod befinden. Oder meinst du den Gesamtcode von BtS? Den habe ich 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

  11. #2531
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Es war eine harte Nuss, und ich weiß nicht, welcher der 5 Fehler es war, aber sie waren alle gleich: Ich habe getCapitalCity abgefragt, ohne danach zu prüfen, ob das Ergebnis auch wirklich existiert. Da das Spiel aber mit "Kompletter Vernichtung" lief, gab es genug Spieler, die ohne Stadt und damit auch ohne Hauptstadt waren. Ich muss dringend auf meine Disziplin bei so etwas achten.
    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

  12. #2532
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.016
    Zitat Zitat von Kathy Beitrag anzeigen
    Es war eine harte Nuss, und ich weiß nicht, welcher der 5 Fehler es war, aber sie waren alle gleich: Ich habe getCapitalCity abgefragt, ohne danach zu prüfen, ob das Ergebnis auch wirklich existiert. Da das Spiel aber mit "Kompletter Vernichtung" lief, gab es genug Spieler, die ohne Stadt und damit auch ohne Hauptstadt waren. Ich muss dringend auf meine Disziplin bei so etwas achten.
    Das sit dringend anzuraten. Die zusätzliche Zeit spart dir mehr Arbeit ein als es sich lohnt darauf zu verzichten.

  13. #2533
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Ich habe mal wieder ein Problem. Ich habe folgendes zu "Unit::Kill" hinzugefügt:
    Code:
    void CvUnit::kill(bool bDelay, PlayerTypes ePlayer)
    {
    	PROFILE_FUNC();
    	
    	CLLNode<IDInfo>* pUnitNode;
    	CvUnit* pTransportUnit;
    	CvUnit* pLoopUnit;
    	CvPlot* pPlot;
    	CvWString szBuffer;
    	PlayerTypes eOwner;
    	PlayerTypes eCapturingPlayer;
    	UnitTypes eCaptureUnitType;
    	//Kathy Beginn Bonus Left
    	BonusTypes eBonusType;
    	//Kathy End Bonus Left
    
    	pPlot = plot();
    	FAssertMsg(pPlot != NULL, "Plot is not assigned a valid value");
    
    	static std::vector<IDInfo> oldUnits;
    	oldUnits.clear();
    	pUnitNode = pPlot->headUnitNode();
    
    	while (pUnitNode != NULL)
    	{
    		oldUnits.push_back(pUnitNode->m_data);
    		pUnitNode = pPlot->nextUnitNode(pUnitNode);
    	}
    
    	for (uint i = 0; i < oldUnits.size(); i++)
    	{
    		pLoopUnit = ::getUnit(oldUnits[i]);
    		
    		if (pLoopUnit != NULL)
    		{
    			if (pLoopUnit->getTransportUnit() == this)
    			{
    				//save old units because kill will clear the static list
    				std::vector<IDInfo> tempUnits = oldUnits;
    
    				if (pPlot->isValidDomainForLocation(*pLoopUnit))
    				{
    					pLoopUnit->setCapturingPlayer(NO_PLAYER);
    				}
    				
    				pLoopUnit->kill(false, ePlayer);
    
    				oldUnits = tempUnits;
    			}
    		}
    	}
    
    	if (ePlayer != NO_PLAYER)
    	{
    		CvEventReporter::getInstance().unitKilled(this, ePlayer);
    
    		if (NO_UNIT != getLeaderUnitType())
    		{
    			for (int iI = 0; iI < MAX_PLAYERS; iI++)
    			{
    				if (GET_PLAYER((PlayerTypes)iI).isAlive())
    				{
    					szBuffer = gDLL->getText("TXT_KEY_MISC_GENERAL_KILLED", getNameKey());
    					gDLL->getInterfaceIFace()->addMessage(((PlayerTypes)iI), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, GC.getEraInfo(GC.getGameINLINE().getCurrentEra()).getAudioUnitDefeatScript(), MESSAGE_TYPE_MAJOR_EVENT);
    				}
    			}
    		}
    		//Kathy Gold Loot Beginn
    		int iGoldLoot;
    		iGoldLoot = m_pUnitInfo->getGoldLoot();
    		
    		if (iGoldLoot > 0)
    		{
    			GET_PLAYER(ePlayer).changeGold(iGoldLoot);
    			szBuffer = gDLL->getText("TXT_KEY_MESSAGE_BARBARENHAEUPTLING", iGoldLoot, m_pUnitInfo->getDescription() );
    			gDLL->getInterfaceIFace()->addMessage(((PlayerTypes)ePlayer), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, GC.getEraInfo(GC.getGameINLINE().getCurrentEra()).getAudioUnitDefeatScript(), MESSAGE_TYPE_MAJOR_EVENT);
    		}
    		//Kathy Gold Loot End
    		//Kathy beginn City State Mission
    		int iCityStateMissionType;
    		iCityStateMissionType = m_pUnitInfo->getCityStateMissionType();
    		
    		if (iCityStateMissionType == 1)
    		{
    			if ( pPlot->getOwner() != NO_PLAYER)
    			{
    				if ( pPlot->getOwner() != ePlayer )
    				{
    					if ( pPlot->getOwner() != eOwner)
    					{
    						PlayerTypes ePlotOwner = pPlot->getOwner();
    						CvPlayer& kPlotOwner = GET_PLAYER(ePlotOwner);
    
    						if ( GC.getCivilizationInfo(kPlotOwner.getCivilizationType()).isCitystate() )
    						{
    							GET_PLAYER(ePlayer).doCityStateReward(ePlotOwner,250);
    						}
    					}
    				}
    			}
    		}		
    		//Kathy end City State Mission
    	}
    Der Teil "GoldLoot" ist schon etwas älter und funktioniert bisher einwandfrei. Was nicht funktioniert, ist der Teil "City State Mission". Er soll triggern, sobald eine Einheit, deren "CityStateMissionType" 1 ist (in meinem Spiel das Barbarencamp) vernichtet wird. Tatsache ist aber, dass das Spiel im Test immer abstürzt. Ich dachte, ich hätte alles ausgeschlossen, was Probleme verursachen kann, aber das funktioniert nicht. Bei Start im Debug-Modus stürzt der Testspielstand schon beim Laden ab, im normalen Modus ließ er sich aber laden.
    Der aufgerufene Code "doCityStateReward" hat bisher auch immer fehlerfrei funktioniert, aber vielleicht habe ich da auch irgend etwas übersehen, was bisher einfach nur nicht zum Absturz führte:

    Achtung Spoiler:
    Code:
    void CvPlayer::doCityStateReward(PlayerTypes eCityState, int iValue)
    {
    	CivilizationTypes eCityStateCiv;
    	eCityStateCiv = GET_PLAYER(eCityState).getCivilizationType();
    	if ( GC.getCivilizationInfo(eCityStateCiv).isCitystate() )
    	{
    		int iAttitudeChange = iValue/250;
    		if (iAttitudeChange > 0)
    		{
    			iAttitudeChange += getAttitudebonusCitystate()/4;
    			GET_PLAYER(eCityState).AI_changeAttitudeExtra( getID(), iAttitudeChange );
    			TeamTypes eTargetTeam;
    			TeamTypes eCityStateTeam;
    			eTargetTeam = getTeam();
    			eCityStateTeam = GET_PLAYER(eCityState).getTeam();
    			GET_TEAM(eTargetTeam).doCityStateDesert(eCityStateTeam);
    		}
    		CvWString szBuffer;
    		CvCity* pRandomCity;
    		int iRandomID = GC.getGameINLINE().getSorenRandNum( getNumCities(),"Vassal land war");
    		pRandomCity = getCity(iRandomID);
    
    		if ( pRandomCity == NULL )
    		{
    			pRandomCity = getCapitalCity();
    		}
    		
    		//Random City darf nicht NULL sein, wenn kein Capital vorhanden!!!
    		if ( pRandomCity != NULL )
    		{
    			if ( GC.getCivilizationInfo(eCityStateCiv).isProductiveCitystate() )
    			{
    				pRandomCity->changeOverflowProduction(iValue,0);
    				szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_PRODUCTIVE", GET_PLAYER((eCityState)).getName() , pRandomCity->getName().GetCString() );
    				gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    			}
    				
    			if ( GC.getCivilizationInfo(eCityStateCiv).isMilitaryCitystate() )
    			{
    				int iX = pRandomCity->getX();
    				int iY = pRandomCity->getY();
    				int iCreateUnits = iValue/100;
    				if (iCreateUnits == 0)
    				{
    					iCreateUnits = 1;
    				}
    				EraTypes ePlayerEra = getCurrentEra();
    			
    				CivilizationTypes ePlayerCiv;
    				ePlayerCiv = GET_PLAYER(getID()).getCivilizationType();
    				CvUnit* pNewUnit;
    				UnitTypes eMercenaryUnit;
    				eMercenaryUnit = (UnitTypes)GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getEraInfo(ePlayerEra).getMercenaryUnitclass() );
    				int iUnit;
    				for (iUnit = 0; iUnit < iCreateUnits; ++iUnit)
    				{
    					pNewUnit = initUnit(eMercenaryUnit, iX , iY, NO_UNITAI);
    					pNewUnit->setOriginalOwner(eCityState);
    				}
    
    				szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_MILITARY", GET_PLAYER((eCityState)).getName() , pRandomCity->getName().GetCString() );
    				gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    			}
    		//Random City darf nicht NULL sein, wenn kein Capital vorhanden!!!
    		
    			if ( GC.getCivilizationInfo(eCityStateCiv).isMaritimCitystate() )
    			{
    				pRandomCity->changeFood(iValue/2);
    				szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_MARITIME", GET_PLAYER((eCityState)).getName() , pRandomCity->getName().GetCString() );
    				gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    			}
    		
    			if ( GC.getCivilizationInfo(eCityStateCiv).isArtisticCitystate() )
    			{
    				pRandomCity->changeCulture(getID(),iValue*3,true,true);
    				szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_ARTISTIC", GET_PLAYER((eCityState)).getName() , pRandomCity->getName().GetCString() );
    				gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    			}
    		}
    
    		if ( GC.getCivilizationInfo(eCityStateCiv).isSteueroase() )
    		{
    			changeGold(iValue*2);
    			szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_MERKANTILE", GET_PLAYER((eCityState)).getName() , iValue*2 );
    			gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    		}
    
    		if ( GC.getCivilizationInfo(eCityStateCiv).isMerkantileCitystate() )
    		{
    			changeGold(iValue*2);
    			szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_MERKANTILE", GET_PLAYER((eCityState)).getName() , iValue*2 );
    			gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    		}
    
    		if ( GC.getCivilizationInfo(eCityStateCiv).isFrommCitystate() )
    		{
    			ReligionTypes eStateReligion = getStateReligion();
    			int iCitiesDone = 0;
    			int iCitiesConvert = iValue/75;
    			if (iCitiesConvert == 0)
    			{
    				iCitiesConvert = 1;
    			}
    			
    			CvCity* pLoopCity;
    			int iLoop;
    			iLoop = 0;
    
    			for ( pLoopCity = GET_PLAYER(getID()).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(getID()).nextCity(&iLoop))
    			{
    				if (!pLoopCity->isHasReligion(eStateReligion))
    				{
    					pLoopCity->setHasReligion(eStateReligion,true,true,true );
    					iCitiesDone +=1;
    					if ( iCitiesDone == iCitiesConvert)
    					{
    						break;
    					}
    				}
    			}
    			szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_FROMM", GET_PLAYER((eCityState)).getName() , iCitiesDone );
    			gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    
    		}
    		
    		if ( GC.getCivilizationInfo(eCityStateCiv).isWiseCitystate() )
    		{
    			TeamTypes eTargetTeam;
    			eTargetTeam = getTeam();
    			TechTypes eCurrentResearch = GET_PLAYER(getID()).getCurrentResearch();
    			GET_TEAM(eTargetTeam).changeResearchProgress(eCurrentResearch, iValue*3/2, getID());
    
    			szBuffer = gDLL->getText("TXT_KEY_MESSAGE_DANKBAR_WISE", GET_PLAYER((eCityState)).getName() , iValue*3/2 );
    			gDLL->getInterfaceIFace()->addMessage((PlayerTypes)this->getID(), false, GC.getEVENT_MESSAGE_TIME(), szBuffer, "AS2D_FIRSTTOTECH", MESSAGE_TYPE_MAJOR_EVENT, NULL, (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"));
    		}
    	}
    
    }
    //Kathy End City-State Missionen


    Aufgerufen - auch in meinem Testspiel - wird dabei die Unterfunktion "doCityStateDesert", die bisher auch reibungslos funktioniert hat:
    Achtung Spoiler:
    Code:
    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, true))
    										{
    											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;
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    }


    Ich habe gerade keine Idee, wie ich das Problem weiter eingrenzen kann.
    Neu eingefügt habe ich die Variable:
    iCityStateMissionType = m_pUnitInfo->getCityStateMissionType();
    Zumindest in der Civilopädie werden diese Daten aber korrekt ausgelesen und der damit verknüpfte Text angezeigt.

    Das hier funktioniert:
    Code:
    	//Kathy Beginn CityState Mission Type
    	if (GC.getUnitInfo(eUnit).getCityStateMissionType() > 0)
    	{
    		if ( GC.getUnitInfo(eUnit).getCityStateMissionType() == 1)
    		{
    			szBuffer.append(NEWLINE);
    			szBuffer.append(gDLL->getText("TXT_KEY_UNIT_BARB_CAMP_HELP"));
    		}
    		else if ( GC.getUnitInfo(eUnit).getCityStateMissionType() == 2)
    		{
    			szBuffer.append(NEWLINE);
    			szBuffer.append(gDLL->getText("TXT_KEY_UNIT_PRINCESS_HELP"));
    		}
    		else if ( GC.getUnitInfo(eUnit).getCityStateMissionType() == 3)
    		{
    			szBuffer.append(NEWLINE);
    			szBuffer.append(gDLL->getText("TXT_KEY_GESANDTER_HELP"));
    		}
    	}
    	//Kathy End CityState Mission Type
    Ich vermute, dass ich irgendwo im ersten Code einen falschen Datentyp auslese, der dann den Crash verursacht.
    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

  14. #2534
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.016
    eOwner wurde noch kein Wert zugeordnet. Nutze einfach getOwner() oder this->getOwner().

  15. #2535
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.016
    Rucivfan, du bist genial. In 10 Minuten den Fehler gefunden, vor dem ich gestern stundenlang saß.

    Und ich bin ein Kamel, dass ich immer so einfache Sachen übersehe.
    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

Seite 169 von 180 ErsteErste ... 69119159165166167168169170171172173179 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •