Seite 74 von 180 ErsteErste ... 246470717273747576777884124174 ... LetzteLetzte
Ergebnis 1.096 bis 1.110 von 2699

Thema: Der SDK-Fragen-Thread

  1. #1096
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    71 sind aber nichts im Vergleich zu den Einheiten.

    Die "DefaultUnit" werden, wie Ramkhamhaeng geschrieben hat, gelöst. Kannst dir das zum Beispiel mal ansehen.

    Ach die redundante Variable für den String, wie Ramkhamhaeng schrieb, werden nach den nachträglichen lesen geleert. Die Redundanz existiert also nur beim Spielstart.

    Zitat Zitat von Kathy Beitrag anzeigen
    Um es etwas zu präzisieren: Ich habe in der Datei Civ4BuildInfos.xml einen neuen Eintrag für "UnitType" gemacht, aber diese Inhalte werden, obwohl im SDK definiert, nicht eingelesen. Der Eintrag wird schlicht nicht erkannt, ich nehme an, weil UnitInfos.xml erst nach BuildInfos.xml geladen wird, was ja ganz logisch ist, da die Build für die UnitInfo.xml schon bekannt sein müssen.
    Das ist absolut der Fall. Suche mal nach CvXMLLoadUtility::LoadPreMenuGlobals() in der Datei CvXMLLoadUtilitySet.cpp. Dort die Reihenfolge nicht ändern!

    Manche sachen werden auch erst in der CvXMLLoadUtility::LoadPostMenuGlobals() geladen. Das heißt, sie werden erst beim Starten einer Partie geladen.

  2. #1097
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Ich habe irgendwie den Wurm drin. So sieht es im SDK aus
    Code:
    bool CvPlot::canBuild(BuildTypes eBuild, PlayerTypes ePlayer, bool bTestVisible) const
    {
    	ImprovementTypes eImprovement;
    	ImprovementTypes eFinalImprovementType;
    	//Kathy Plant Feature Beginn
    	FeatureTypes eFeaturePlantType;
    	//Kathy Plant Feature End
    	RouteTypes eRoute;
    	bool bValid;
    (...)
    	//Kathy Build Tower beginn
    
    	if (GC.getBuildInfo(eBuild).getTowerUnit() != -1)//Überspringe alle Builds, bei denen es keinen Eintrag in TowerUnitTypes gibt - also Straße, Farmen etc, Removes
    	{
    		CvPlayerAI pPlayer;
    		pPlayer = GET_PLAYER(getOwnerINLINE());Ermittelt den Besitzer eines Plots
    		CivilizationTypes ePlayerCiv = pPlayer.getCivilizationType();Gibt die Zivilisation des Besitzers zurücl
    		UnitTypes eTowerUnitType = (UnitTypes)(GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit()));Soll ermitteln: Den Unittype, der bei dieser Zivilisation für die Unitclas rauskommt, die in der entsprechenden Build-Info im Tag "ToweUnit" gespeichert ist.
    
    		if (isWater())
    		{
    			if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_LAND)Darum geht es hier eigentlich: Ein Bauauftrag soll nur mäglich sein, wenn die Domain der gebauten Einheit der Art des Plots entspricht
    			{
    				return false;
    			}
    			if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_IMMOBILE)
    			{
    				return false;
    			}
    		}
    		else
    		{
    			if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_SEA)
    			{
    				return false;
    			}
    		}
    
    		if (!bTestVisible)
    		{
    			if (GET_PLAYER(ePlayer).getTeam() != getTeam())
    			{
    				return false;
    			}
    		}
    
    		bValid = true;
    	}
    //Kathy Build Tower end
    Und immer, wenn jetzt ein Baufahrzeug kommt, stürzt das Spiel ab. Außer, es steht in der Stadt, wo es sowieso nichts bauen kann. Ich sehe aber meinen Fehler nicht. Habe ich irgendwo einen offensichtlichen Denkfehler?

    Edit: @ruvicfan: Habe deinen Beitrag noch nicht gesehen gehabt, als ich das hier gepostet habe.
    Geändert von Kathy (02. Februar 2014 um 17:17 Uhr)

  3. #1098
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Wahrscheinlich wird der Code canBuild einfach in einer Stadt nicht ausgeführt.

    Siehe oben mein Beitrag.

  4. #1099
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Ich kann dir nicht ganz folgen. Der Code, den ich jetzt gepostet habe, setzt ja was ganz anderes vorraus als dein Post oben. Ich habe dort versucht, entsprechend der Ladereihenfolge vorzugehen, das heißt, in der BuildInfo.xml ist jetzt eine Unitclass gespeichert. Diese soll dann erst, wenn es ums bauen geht, in eine Einheit übersetzt werden, damit deren Domain geprüft werden kann. Der Vorteil in diesem Fall ist auch, dass Zivilisationen, die wirklich eine UU in diesem Bereich haben, diese auch bauen können. Darum scheint mit dieses Vorgehen ohnehin besser, als den Weg über eine bestimmte Einheit zu gehen. Aber irgendwo ist in meinem neuen Code der Wurm drin. Und ich wüsste gerne, wo.

  5. #1100
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Deine Lösung ist der beste Ansatz.

  6. #1101
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    War das jetzt Ironie?

    Sie funktioniert leider nicht. Da ist irgendwo ein Denkfehler drin.

  7. #1102
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.017
    Das war kein Ironie. Ohne Code kann ich dir nicht helfen.

  8. #1103
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Dear Code ist doch da oben Oder brauchst du noch anderen Code, der davor ausgeführt wird?

    Zur Präzision: getTowerUnit() soll in dre Theorie eine Unitclass zurückgeben.
    CvInfos.h:
    Code:
    		//Kathy Build tower Beginn
    	int getTowerUnit() const;				// Exposed to Python
    	//Kathy Build tower Beginn
    CvInfos.cpp:
    Code:
    	//Kathy Buld tower Beginn
    	pXML->GetChildXmlValByName(szTextVal, "TowerUnitType");
    	m_iUnitclass = pXML->FindInInfoClass(szTextVal);
    	//Kathy Buld tower ENd
    Code:
    //Kathy Build Tower Beginn
    int CvBuildInfo::getTowerUnit() const	
    {
    	return m_iUnitclass;
    }
    //Kathy Build Tower End
    So, zu guter Letzt noch der überarbeitete Code.
    Code:
    bool CvPlot::canBuild(BuildTypes eBuild, PlayerTypes ePlayer, bool bTestVisible) const
    {
    	ImprovementTypes eImprovement;
    	ImprovementTypes eFinalImprovementType;
    	//Kathy Plant Feature Beginn
    	FeatureTypes eFeaturePlantType;
    	//Kathy Plant Feature End
    	RouteTypes eRoute;
    	bool bValid;
    
    (...)//unveränderter Originalcode, kann ich nachreichen, wenn es von Belang sein sollte.
    	//Kathy Build Tower beginn
    
    	if (GC.getBuildInfo(eBuild).getTowerUnit() != NO_UNITCLASS)//Wähle nur Builds, die auch einen Eintrag unter TowerUnit haben. TowerUnit ist eine Unitclass!
    	{
    		if (getOwnerINLINE() != -1)//Auf Felden ohne Besitzer kann keine ToweUnit gebaut werden
    		{
    			CvPlayerAI pPlayer;
    			pPlayer = GET_PLAYER(getOwnerINLINE());//Ermittle den Besitzer des Plats
    			CivilizationTypes ePlayerCiv = pPlayer.getCivilizationType();//Ermittle die Zivilisation des Besitzers
    			UnitTypes eTowerUnitType = (UnitTypes)(GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit()));//Suche die zur Unitclass (aus der BuildInfo) gehörende Einheit der Zivilisation ePlayerCiv
    
    			if (isWater())
    			{
    				if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_LAND)
    				{
    					return false;
    				}
    				if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_IMMOBILE)
    				{
    					return false;
    				}
    			}
    			else
    			{
    				if ( GC.getUnitInfo(eTowerUnitType).getDomainType() == DOMAIN_SEA)
    				{
    					return false;
    				}
    			}
    
    			if (!bTestVisible)
    			{
    				if (GET_PLAYER(ePlayer).getTeam() != getTeam())
    				{
    					return false;
    				}
    			}
    
    			bValid = true;
    		}
    	}
    //Kathy Build Tower end
    Geändert von Kathy (02. Februar 2014 um 18:38 Uhr)

  9. #1104
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Fehlt eventuell im Textblock
    getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit())
    etwas vor
    GC.getBuildInfo(eBuild).getTowerUnit()
    ?
    Wenn das eine Einheit wäre, müsste da ja noch
    (UnitTypes)
    stehen, wie sieht das bei einer Unitclass aus?

  10. #1105
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    So, bin wieder da. Die Klasse statt der Unit zu nehmen war eine gute Idee!
    Zum aktuellen Fehler:
    Wie ich schon schrieb () musst du den Typ noch nutzen, um den InfoTyp zu holen. Du kannst nicht einfach den Integerwert casten

    Also statt
    Code:
    UnitTypes eTowerUnitType = (UnitTypes)(GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit()));
    so was:

    Code:
    UnitTypes eTowerUnitType = (UnitTypes) GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit());
     if (eTowerUnitType != NO_UNIT)
    	CvUnitInfo& kUnit = GC.getUnitInfo(eTowerUnitType);
    //hier dann weiterarbeiten
    }

  11. #1106
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Also so?
    Code:
    	if (GC.getBuildInfo(eBuild).getTowerUnit() != NO_UNITCLASS)
    	{
    		if (getOwnerINLINE() != -1)
    		{
    			CvPlayerAI pPlayer;
    			pPlayer = GET_PLAYER(getOwnerINLINE());
    			CivilizationTypes ePlayerCiv = pPlayer.getCivilizationType();
    			UnitTypes eTowerUnitType = (UnitTypes)(GC.getCivilizationInfo(ePlayerCiv).getCivilizationUnits(GC.getBuildInfo(eBuild).getTowerUnit()));
    			if (eTowerUnitType != NO_UNIT)
    			{
    				CvUnitInfo& kUnit = GC.getUnitInfo(eTowerUnitType);
    
    				if (isWater())
    				{
    					if ( kUnit.getDomainType() == DOMAIN_LAND)
    					{
    						return false;
    					}
    					if ( kUnit.getDomainType() == DOMAIN_IMMOBILE)
    					{
    						return false;
    					}
    				}
    				else
    				{
    					if ( kUnit.getDomainType() == DOMAIN_SEA)
    					{
    						return false;
    					}
    				}
    					
    				if (!bTestVisible)
    				{
    					if (GET_PLAYER(ePlayer).getTeam() != getTeam())
    					{
    						return false;
    					}
    				}
    
    				bValid = true;
    
    			}
    
    		}
    	}
    //Kathy Build Tower end

  12. #1107
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ja, so müsste es meiner Meinung nach gehen.

  13. #1108
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Leider ist er beim Test gerade wieder abgestürzt.

  14. #1109
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Kannst du den Debugger benutzen? Ein Breakpoint könnte helfen.

  15. #1110
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    17.023
    Kann ich, aber dann wohl eher morgen. Bis mein Computer das Spiel zum Debuggen geladen hat braucht er immer ewig lange.

Seite 74 von 180 ErsteErste ... 246470717273747576777884124174 ... LetzteLetzte

Berechtigungen

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