Seite 180 von 180 ErsteErste ... 80130170176177178179180
Ergebnis 2.686 bis 2.699 von 2699

Thema: Der SDK-Fragen-Thread

  1. #2686
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Es gibt noch "AI_disbandUnit" - damit werden Einheiten aufgelöst, wenn ein Streik vorkommt etc. Das dient dazu, auszuwählen, welche Einheit am wenigsten wertvoll ist. Allerdings ist das auch keine KI-Entscheidung, sondern nur eine Bewertung.

    Ausgelöst wird es bei allen iPass außer 1, wo "noDisband" zu true wird, ober bei iPass 2 und 3, bei denen bValid nur bei "bAnyWar" und "bUnderBudget" true wird. Wie allerdings welcher Einheit ein iPass zugeordnet wird, verstehe ich auch 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

  2. #2687
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    22.397
    Kurze Frage: um die maximale Spieleranzahl zu ändern, muss nur MAX_CIV_PLAYERS angepasst werden?

  3. #2688
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Es gab glaube ich noch irgendeine (banale) Änderung. Vielleicht irre ich mich auch. Vielleicht war es auch so, dass irgendwelche Szenario-Files per Editor angepasst werden mussten, damit die Zahl übereinstimmt.

    Die Änderung muss auf jeden Fall in CvDefines.h gemacht werden - warum man die nicht auch in die GlobalDefines.xml geschrieben hat, ist mir ein Rätsel.
    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

  4. #2689
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.015
    Das Problem gibt es mit Szenarien/Karten mit vordefinierten Spielern. Es müssen mindestens genau so viele Spielereinträge hinterlegt sein wie es maximal gibt. Diese können auch leer sein, aber die Einträge müssen vorhanden sein. Sonst kam es zu Abstürzen? Ist zu lange her.

  5. #2690
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Die Änderung in CvDefines.h müsste ausreichen. Ab 255 (oder 127...) Spielern wird es problematisch, weil bestimmte Datenstrukturen nur ein Byte fassen.

    Zitat Zitat von Kathy Beitrag anzeigen
    Die Änderung muss auf jeden Fall in CvDefines.h gemacht werden - warum man die nicht auch in die GlobalDefines.xml geschrieben hat, ist mir ein Rätsel.
    Im SDK-Code ist sogar schon vorgegeben, dass man den Wert auch dynamisch verwenden kann, wenn man _USRDLL „nicht definiert“.
    Code:
    #ifdef _USRDLL
    #define MAX_CIV_PLAYERS												(18)
    #else
    #define MAX_CIV_PLAYERS												(CvGlobals::getInstance().getMaxCivPlayers())
    #endif
    Da aber viele Array-Größen und Code-Optimierungen von der Größe abhängen kann ich nachvollziehen, dass der Wert fest vorgegeben wurde.

    Zitat Zitat von rucivfan Beitrag anzeigen
    Das Problem gibt es mit Szenarien/Karten mit vordefinierten Spielern. Es müssen mindestens genau so viele Spielereinträge hinterlegt sein wie es maximal gibt. Diese können auch leer sein, aber die Einträge müssen vorhanden sein. Sonst kam es zu Abstürzen? Ist zu lange her.

    Ja, das Problem existiert in BTS, aber der Parser der Szenario-Datei ist in Python geschrieben und wurde in PAE schon vor vielen Jahren verbessert. Der kann auch Szenarien mit zu vielen/zu wenigen Spielereinträgen verarbeiten.

  6. #2691
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Hat jemand eine elegante Idee, wie ich eine Gruppe Landeinheiten von normalen Transportschiffen ausschließen kann?
    Der Hintergrund: In meiner derzeitigen Story lade ich jede Runde "Schlachtflugzeuge" (Vorläufer von Hubschraubern - genau wie diese als Landeinheiten im Spiel geführt) auf "Dampfschiffe". Damit können sie drei Felder weit transportiert werden und sich - wenn sie in der Vorrunde geladen wurde - dann selbst mit ihrem Bewegungsradius bewegen. Da Hubschrauber und "Tiefflieger" (alle Flugzeuge, die wie Hubschrauber als Landeinheiten geführt sind) sie sich auf Küstenfelder bewegen können, kostet die Anlandung nur einen Bewegungspunkt, die können mit 4 also immer noch zwei Felder ins Feindesland rein ziehen, dabei einmal angreifen und dann wieder auf der Dampfschiff zurück, das sie wieder in meinen Hafen bringt.
    Ich würde aber gerne diese Einheiten auf Flugzeugträger laden lassen, einfach weil so ein Flugzeug besser vom Träger als von einem normalen Schiff (das könnte ja auch eine Galeone sein) starten kann. Ich denke, wenn ich bei der Einheit "Carrier" die Werte änderte von:

    Code:
    			<SpecialCargo>SPECIALUNIT_FIGHTER</SpecialCargo>
    			<DomainCargo>DOMAIN_AIR</DomainCargo>
    zu
    Code:
    			<SpecialCargo>SPECIALUNIT_FIGHTER</SpecialCargo>
    			<DomainCargo>NONE</DomainCargo>
    und allen Tieffliegern SPECIALUNIT_FIGHTER gebe, können die Träger sie laden (genau wie Lufteinheiten, die als SPECIALUNIT_FIGHTER markiert sind). Das würde die Träger enorm aufwerten, denn bisher baue ich sie nicht.
    Nur: Wie kann ich effektiv verhindern, dass Transportschiffe Einheiten mit "SPECIALUNIT_FIGHTER" laden können? Allen anderen Einheiten eine eigene SPECIALUNIT_NORMAL_LAND geben (und Transportschiffe darauf einschränken) geht nicht, da dann solche Schiffe keine SPECIALUNIT_PEOPLE mehr laden könnten.

    Ich werde also irgendwie SDK brauchen - aber wie wäre es elegant? Einen Tag <SpecialCargoForbidden> definieren, und dann allen Landtransportern damit verbieten SPECIALUNIT_FIGHTER zu laden? Könnte eine elegante Lösung sein, zumal ich damit Hubschrauberträgern und Amphibischen Landungsschiffen diese Einheitenkategorie doch erlauben könnte.
    Oder eher sowas wie "bNoLandCargo" bei den Flugzeugen, womit ich dann verbieten würde, dass Einheiten mit diesem Tag auf Schiffe, die DomainCargo>DOMAIN_LAND laden, aufladen kann, obwohl sie DOMAIN_LAND sind?
    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. #2692
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Ich habe jetzt versucht, es so zu lösen. Hubschrauber-Einheiten können immer noch auf normalen Transporter transportiert werden, sollen aber, wenn sie auf Wasser ausgeladen werden und nicht auf einem passenden Träger sind ( ->isNoHelicopterAttackFrom(), das funktioniert) nicht angreifen und nur 1 Feld, also zum Anlanden, bewegt werden.

    Code:
    void CvUnit::setTransportUnit(CvUnit* pTransportUnit)
    {
    	CvUnit* pOldTransportUnit;
    
    	pOldTransportUnit = getTransportUnit();
    
    	if (pOldTransportUnit != pTransportUnit)
    	{
    		if (pOldTransportUnit != NULL)
    		{
    			pOldTransportUnit->changeCargo(-1);
    		}
    
    		if (pTransportUnit != NULL)
    		{
    			FAssertMsg(pTransportUnit->cargoSpaceAvailable(getSpecialUnitType(), getDomainType()) > 0, "Cargo space is expected to be available");
    
    			joinGroup(NULL, true); // Because what if a group of 3 tries to get in a transport which can hold 2...
    
    			m_transportUnit = pTransportUnit->getIDInfo();
    
    			if (getDomainType() != DOMAIN_AIR)
    			{
    				getGroup()->setActivityType(ACTIVITY_SLEEP);
    			}
    
    			if (GC.getGameINLINE().isFinalInitialized())
    			{
    				finishMoves();
    			}
    
    			pTransportUnit->changeCargo(1);
    			pTransportUnit->getGroup()->setActivityType(ACTIVITY_AWAKE);
    		}
    		else
    		{
    			//Kathy beginn Carrier Restriction
    			if ( m_pUnitInfo->isCanMoveAllTerrain())
    			{
    				if (pOldTransportUnit != NULL)
    				{
    					if (pOldTransportUnit->isNoHelicopterAttackFrom() )
    					{
    						CvPlot& kPlot = *(plot());
    						if ( kPlot.isWater() )
    						{
    							if ( getMoves() == 0)  
    							{
    								setMoves(maxMoves()-1 );
    								setMadeAttack(true);
    
    							}
    						}
    					}
    				}
    			}
    			//Kathy End Carrier Restricton
    			m_transportUnit.reset();
    
    			getGroup()->setActivityType(ACTIVITY_AWAKE);
    
    		}
    
    #ifdef _DEBUG
    		std::vector<CvUnit*> aCargoUnits;
    		if (pOldTransportUnit != NULL)
    		{
    			pOldTransportUnit->getCargoUnits(aCargoUnits);
    		}
    		if (pTransportUnit != NULL)
    		{
    			pTransportUnit->getCargoUnits(aCargoUnits);
    		}
    #endif
    
    	}
    }
    Das funktioniert auch - aber nur, wenn ich die Einheit über den "Entlade-Button" auslade. Wenn ich die Einheiten über eine Bewegung auslade, haben sie ihre volle Bewegung und können angreifen. Kann mir jemand erklären, warum?
    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

  8. #2693
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Mein Gedanke war noch, dass es hieran liegen muss:
    Code:
    void CvUnit::setXY(int iX, int iY, bool bGroup, bool bUpdate, bool bShow, bool bCheckPlotVisible)
    {
    	CLLNode<IDInfo>* pUnitNode;
    	CvCity* pOldCity;
    	CvCity* pNewCity;
    	CvCity* pWorkingCity;
    	CvUnit* pTransportUnit;
    	CvUnit* pLoopUnit;
    	CvPlot* pOldPlot;
    	CvPlot* pNewPlot;
    	CvPlot* pLoopPlot;
    	CLinkList<IDInfo> oldUnits;
    	ActivityTypes eOldActivityType;
    	int iI;
    
    	// OOS!! Temporary for Out-of-Sync madness debugging...
    	if (GC.getLogging())
    	{
    		if (gDLL->getChtLvl() > 0)
    		{
    			char szOut[1024];
    			sprintf(szOut, "Player %d Unit %d (%S's %S) moving from %d:%d to %d:%d\n", getOwnerINLINE(), getID(), GET_PLAYER(getOwnerINLINE()).getNameKey(), getName().GetCString(), getX_INLINE(), getY_INLINE(), iX, iY);
    			gDLL->messageControlLog(szOut);
    		}
    	}
    
    	FAssert(!at(iX, iY));
    	FAssert(!isFighting());
    	FAssert((iX == INVALID_PLOT_COORD) || (GC.getMapINLINE().plotINLINE(iX, iY)->getX_INLINE() == iX));
    	FAssert((iY == INVALID_PLOT_COORD) || (GC.getMapINLINE().plotINLINE(iX, iY)->getY_INLINE() == iY));
    
    	if (getGroup() != NULL)
    	{
    		eOldActivityType = getGroup()->getActivityType();
    	}
    	else
    	{
    		eOldActivityType = NO_ACTIVITY;
    	}
    
    	setBlockading(false);
    
    	if (!bGroup || isCargo())
    	{
    		joinGroup(NULL, true);
    		bShow = false;
    	}
    
    	pNewPlot = GC.getMapINLINE().plotINLINE(iX, iY);
    
    	if (pNewPlot != NULL)
    	{
    		pTransportUnit = getTransportUnit();
    
    		if (pTransportUnit != NULL)
    		{
    			if (!(pTransportUnit->atPlot(pNewPlot)))
    			{
    				setTransportUnit(NULL);
    			}
    		}
    
    		if (canFight())
    		{
    			oldUnits.clear();
    
    			pUnitNode = pNewPlot->headUnitNode();
    
    			while (pUnitNode != NULL)
    			{
    				oldUnits.insertAtEnd(pUnitNode->m_data);
    				pUnitNode = pNewPlot->nextUnitNode(pUnitNode);
    			}
    
    			pUnitNode = oldUnits.head();
    
    			while (pUnitNode != NULL)
    			{
    				pLoopUnit = ::getUnit(pUnitNode->m_data);
    				pUnitNode = oldUnits.next(pUnitNode);
    
    				if (pLoopUnit != NULL)
    				{
    					if (isEnemy(pLoopUnit->getTeam(), pNewPlot) || pLoopUnit->isEnemy(getTeam()))
    					{
    						if (!pLoopUnit->canCoexistWithEnemyUnit(getTeam()))
    						{
    							if (NO_UNITCLASS == pLoopUnit->getUnitInfo().getUnitCaptureClassType() && pLoopUnit->canDefend(pNewPlot))
    							{
    								pLoopUnit->jumpToNearestValidPlot(); // can kill unit
    							}
    							else
    							{
    								if (!m_pUnitInfo->isHiddenNationality() && !pLoopUnit->getUnitInfo().isHiddenNationality())
    								{
    									GET_TEAM(pLoopUnit->getTeam()).changeWarWeariness(getTeam(), *pNewPlot, GC.getDefineINT("WW_UNIT_CAPTURED"));
    									GET_TEAM(getTeam()).changeWarWeariness(pLoopUnit->getTeam(), *pNewPlot, GC.getDefineINT("WW_CAPTURED_UNIT"));
    									GET_TEAM(getTeam()).AI_changeWarSuccess(pLoopUnit->getTeam(), GC.getDefineINT("WAR_SUCCESS_UNIT_CAPTURING"));
    								}
    
    								if (!isNoCapture())
    								{
    									pLoopUnit->setCapturingPlayer(getOwnerINLINE());
    								}
    
    								pLoopUnit->kill(false, getOwnerINLINE());
    							}
    						}
    					}
    				}
    			}
    		}
    
    		if (pNewPlot->isGoody(getTeam()))
    		{
    			GET_PLAYER(getOwnerINLINE()).doGoody(pNewPlot, this);
    		}
    
    	}
    
    	pOldPlot = plot();
    
    	if (pOldPlot != NULL)
    	{
    		pOldPlot->removeUnit(this, bUpdate && !hasCargo());
    
    		pOldPlot->changeAdjacentSight(getTeam(), visibilityRange(), false, this, true);
    
    		pOldPlot->area()->changeUnitsPerPlayer(getOwnerINLINE(), -1);
    		pOldPlot->area()->changePower(getOwnerINLINE(), -(m_pUnitInfo->getPowerValue()));
    
    		if (AI_getUnitAIType() != NO_UNITAI)
    		{
    			pOldPlot->area()->changeNumAIUnits(getOwnerINLINE(), AI_getUnitAIType(), -1);
    		}
    
    		if (isAnimal())
    		{
    			pOldPlot->area()->changeAnimalsPerPlayer(getOwnerINLINE(), -1);
    		}
    
    		if (pOldPlot->getTeam() != getTeam() && (pOldPlot->getTeam() == NO_TEAM || !GET_TEAM(pOldPlot->getTeam()).isVassal(getTeam())))
    		{
    			GET_PLAYER(getOwnerINLINE()).changeNumOutsideUnits(-1);
    		}
    
    		setLastMoveTurn(GC.getGameINLINE().getTurnSlice());
    
    		pOldCity = pOldPlot->getPlotCity();
    
    		if (pOldCity != NULL)
    		{
    			if (isMilitaryHappiness())
    			{
    				pOldCity->changeMilitaryHappinessUnits(-1);
    			}
    		}
    
    		pWorkingCity = pOldPlot->getWorkingCity();
    
    		if (pWorkingCity != NULL)
    		{
    			if (canSiege(pWorkingCity->getTeam()))
    			{
    				pWorkingCity->AI_setAssignWorkDirty(true);
    			}
    		}
    
    		if (pOldPlot->isWater())
    		{
    			for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++)
    			{
    				pLoopPlot = plotDirection(pOldPlot->getX_INLINE(), pOldPlot->getY_INLINE(), ((DirectionTypes)iI));
    
    				if (pLoopPlot != NULL)
    				{
    					if (pLoopPlot->isWater())
    					{
    						pWorkingCity = pLoopPlot->getWorkingCity();
    
    						if (pWorkingCity != NULL)
    						{
    							if (canSiege(pWorkingCity->getTeam()))
    							{
    								pWorkingCity->AI_setAssignWorkDirty(true);
    							}
    						}
    					}
    				}
    			}
    		}
    
    		if (pOldPlot->isActiveVisible(true))
    		{
    			pOldPlot->updateMinimapColor();
    		}
    
    		if (pOldPlot == gDLL->getInterfaceIFace()->getSelectionPlot())
    		{
    			gDLL->getInterfaceIFace()->verifyPlotListColumn();
    
    			gDLL->getInterfaceIFace()->setDirty(PlotListButtons_DIRTY_BIT, true);
    		}
    	}
    
    	if (pNewPlot != NULL)
    	{
    		m_iX = pNewPlot->getX_INLINE();
    		m_iY = pNewPlot->getY_INLINE();
    	}
    	else
    	{
    		m_iX = INVALID_PLOT_COORD;
    		m_iY = INVALID_PLOT_COORD;
    	}
    
    	FAssertMsg(plot() == pNewPlot, "plot is expected to equal pNewPlot");
    
    	if (pNewPlot != NULL)
    	{
    		pNewCity = pNewPlot->getPlotCity();
    
    		if (pNewCity != NULL)
    		{
    			if (isEnemy(pNewCity->getTeam()) && !canCoexistWithEnemyUnit(pNewCity->getTeam()) && canFight())
    			{
    				GET_TEAM(getTeam()).changeWarWeariness(pNewCity->getTeam(), *pNewPlot, GC.getDefineINT("WW_CAPTURED_CITY"));
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                      06/14/09                                jdog5000      */
    /*                                                                                              */
    /* General AI                                                                                   */
    /************************************************************************************************/
    /* original bts code
    				GET_TEAM(getTeam()).AI_changeWarSuccess(pNewCity->getTeam(), GC.getDefineINT("WAR_SUCCESS_CITY_CAPTURING"));
    */
    				// Double war success if capturing capital city, always a significant blow to enemy
    				// pNewCity still points to old city here, hasn't been acquired yet
    				GET_TEAM(getTeam()).AI_changeWarSuccess(pNewCity->getTeam(), (pNewCity->isCapital() ? 2 : 1)*GC.getWAR_SUCCESS_CITY_CAPTURING());
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/
    
    				PlayerTypes eNewOwner = GET_PLAYER(getOwnerINLINE()).pickConqueredCityOwner(*pNewCity);
    
    				if (NO_PLAYER != eNewOwner)
    				{
    					GET_PLAYER(eNewOwner).acquireCity(pNewCity, true, false, true); // will delete the pointer
    					pNewCity = NULL;
    				}
    			}
    		}
    
    		//update facing direction
    		if(pOldPlot != NULL)
    		{
    			DirectionTypes newDirection = estimateDirection(pOldPlot, pNewPlot);
    			if(newDirection != NO_DIRECTION)
    				//Ramkhamhaeng - Formationswechsel für Riverboat beginn
    			{//Kathy: Nur für Schiffe auf FLussfeldern
    				if (pNewPlot->isRiver() && getDomainType() == DOMAIN_SEA)
    				{
    					update_river_formation(newDirection);
    				}//Kathy: Nur für Schiffe auf FLussfeldern
    				m_eFacingDirection = newDirection;
    			}//Ramkhamhaeng - Formationswechsel für Riverboat end
    
    //				m_eFacingDirection = newDirection;	//original code
    		}
    
    		//update cargo mission animations
    		if (isCargo())
    		{
    			if (eOldActivityType != ACTIVITY_MISSION)
    			{
    				getGroup()->setActivityType(eOldActivityType);
    			}
    		}
    
    		setFortifyTurns(0);
    
    		pNewPlot->changeAdjacentSight(getTeam(), visibilityRange(), true, this, true); // needs to be here so that the square is considered visible when we move into it...
    
    		pNewPlot->addUnit(this, bUpdate && !hasCargo());
    
    		pNewPlot->area()->changeUnitsPerPlayer(getOwnerINLINE(), 1);
    		pNewPlot->area()->changePower(getOwnerINLINE(), m_pUnitInfo->getPowerValue());
    
    		if (AI_getUnitAIType() != NO_UNITAI)
    		{
    			pNewPlot->area()->changeNumAIUnits(getOwnerINLINE(), AI_getUnitAIType(), 1);
    		}
    
    		if (isAnimal())
    		{
    			pNewPlot->area()->changeAnimalsPerPlayer(getOwnerINLINE(), 1);
    		}
    
    		if (pNewPlot->getTeam() != getTeam() && (pNewPlot->getTeam() == NO_TEAM || !GET_TEAM(pNewPlot->getTeam()).isVassal(getTeam())))
    		{
    			GET_PLAYER(getOwnerINLINE()).changeNumOutsideUnits(1);
    		}
    
    		if (shouldLoadOnMove(pNewPlot))
    		{
    			load();
    		}
    
    		for (iI = 0; iI < MAX_CIV_TEAMS; iI++)
    		{
    			if (GET_TEAM((TeamTypes)iI).isAlive())
    			{
    				if (!isInvisible(((TeamTypes)iI), false))
    				{
    					if (pNewPlot->isVisible((TeamTypes)iI, false))
    					{
    						GET_TEAM((TeamTypes)iI).meet(getTeam(), true);
    					}
    				}
    			}
    		}
    
    		pNewCity = pNewPlot->getPlotCity();
    
    		if (pNewCity != NULL)
    		{
    			if (isMilitaryHappiness())
    			{
    				pNewCity->changeMilitaryHappinessUnits(1);
    			}
    		}
    
    		pWorkingCity = pNewPlot->getWorkingCity();
    
    		if (pWorkingCity != NULL)
    		{
    			if (canSiege(pWorkingCity->getTeam()))
    			{
    				pWorkingCity->verifyWorkingPlot(pWorkingCity->getCityPlotIndex(pNewPlot));
    			}
    		}
    
    		if (pNewPlot->isWater())
    		{
    			for (iI = 0; iI < NUM_DIRECTION_TYPES; iI++)
    			{
    				pLoopPlot = plotDirection(pNewPlot->getX_INLINE(), pNewPlot->getY_INLINE(), ((DirectionTypes)iI));
    
    				if (pLoopPlot != NULL)
    				{
    					if (pLoopPlot->isWater())
    					{
    						pWorkingCity = pLoopPlot->getWorkingCity();
    
    						if (pWorkingCity != NULL)
    						{
    							if (canSiege(pWorkingCity->getTeam()))
    							{
    								pWorkingCity->verifyWorkingPlot(pWorkingCity->getCityPlotIndex(pLoopPlot));
    							}
    						}
    					}
    				}
    			}
    		}
    
    		if (pNewPlot->isActiveVisible(true))
    		{
    			pNewPlot->updateMinimapColor();
    		}
    
    		if (GC.IsGraphicsInitialized())
    		{
    			//override bShow if check plot visible
    			if(bCheckPlotVisible && pNewPlot->isVisibleToWatchingHuman())
    				bShow = true;
    
    			if (bShow)
    			{
    				QueueMove(pNewPlot);
    			}
    			else
    			{
    				SetPosition(pNewPlot);
    			}
    		}
    
    		if (pNewPlot == gDLL->getInterfaceIFace()->getSelectionPlot())
    		{
    			gDLL->getInterfaceIFace()->verifyPlotListColumn();
    
    			gDLL->getInterfaceIFace()->setDirty(PlotListButtons_DIRTY_BIT, true);
    		}
    	}
    
    	if (pOldPlot != NULL)
    	{
    		if (hasCargo())
    		{
    			pUnitNode = pOldPlot->headUnitNode();
    
    			while (pUnitNode != NULL)
    			{
    				pLoopUnit = ::getUnit(pUnitNode->m_data);
    				pUnitNode = pOldPlot->nextUnitNode(pUnitNode);
    
    				if (pLoopUnit->getTransportUnit() == this)
    				{
    					pLoopUnit->setXY(iX, iY, bGroup, false);
    				}
    			}
    		}
    	}
    
    	if (bUpdate && hasCargo())
    	{
    		if (pOldPlot != NULL)
    		{
    			pOldPlot->updateCenterUnit();
    			pOldPlot->setFlagDirty(true);
    		}
    
    		if (pNewPlot != NULL)
    		{
    			pNewPlot->updateCenterUnit();
    			pNewPlot->setFlagDirty(true);
    		}
    	}
    
    	FAssert(pOldPlot != pNewPlot);
    	GET_PLAYER(getOwnerINLINE()).updateGroupCycle(this);
    
    	setInfoBarDirty(true);
    
    	if (IsSelected())
    	{
    		if (isFound())
    		{
    			gDLL->getInterfaceIFace()->setDirty(GlobeLayer_DIRTY_BIT, true);
    			gDLL->getEngineIFace()->updateFoundingBorder();
    		}
    
    		gDLL->getInterfaceIFace()->setDirty(ColoredPlots_DIRTY_BIT, true);
    	}
    
    	//update glow
    	if (pNewPlot != NULL)
    	{
    		gDLL->getEntityIFace()->updateEnemyGlow(getUnitEntity());
    	}
    
    	// report event to Python, along with some other key state
    	CvEventReporter::getInstance().unitSetXY(pNewPlot, this);
    }
    Aber hier sehe ich keinen Ansatzpunkt. setTransportUnit wird hier auch aufgerufen, und ich sehe nichts, was danach meine Moves wieder mit einem (höheren) Wert überschreibt.
    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. #2694
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Ich habe die Frage mal nach hier verschoben, weil sie eben keine allgemeine Modding-Frage ist, sondern ins SDK gehört
    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

  10. #2695
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    Ich glaube, ich habe es. Da beim Entladen vor "setTransportUnit" schon die Bewegungskosten abgezogen wurden, gilt "getMoves() == 0" nicht mehr.
    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. #2696
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.015
    Zitat Zitat von Kathy Beitrag anzeigen
    Ich glaube, ich habe es. Da beim Entladen vor "setTransportUnit" schon die Bewegungskosten abgezogen wurden, gilt "getMoves() == 0" nicht mehr.
    getMoves ist 0, wenn keine Bewegung war? finishMoves(); wird sehr wahrscheinlich vorher ausgelöst. Das ist so ein Punkt, wo es besser ist, eine Methode "Wurde nicht bewegt" ("!hasMoved()"?) zu haben als so ein Vergleich.
    Geändert von rucivfan (17. September 2023 um 14:12 Uhr)

  12. #2697
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    "getMoves" ist 0, wenn 0 Bewegungen durchgeführt worden sind. Ich brauche das an dieser Stelle, um zu verhindern, dass eine Einheit, die beladen wurde (dabei wird mit "finish Moves() die Bewegung auf MaxMoves() gesetzt) durch das Ausladen noch einmal 1 Bewegungspunkt bekommt.
    Meine Lösung ist nun: if ( getMoves() != maxMoves())
    Dann greift das immer, wenn die entladene Einheit noch irgendwelche Bewegungspunkte hat. Einziger Nachteil: Wenn man durch Bewegung entlädt und schon 1 verbraucht hat, kann man sich immer noch einmal bewegen. Aber damit kann ich leben.
    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

  13. #2698
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Kathy Beitrag anzeigen
    Einziger Nachteil: Wenn man durch Bewegung entlädt und schon 1 verbraucht hat, kann man sich immer noch einmal bewegen. Aber damit kann ich leben.
    Um das zu verhindern könntest du vielleicht einfach pNewPlot mit pOldPlot vergleichen.

    Code:
    if (pNewPlot == pOldPlot) {
        setMoves(maxMoves()-1 ); // Kann sich noch minimal bewegen
    }else{
      setMoves(maxMoves() );
    }
    setMadeAttack(true);

  14. #2699
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.916
    In setTransportUnit gibt es aber doch keinen "pOldPlot" mehr - oder habe ich da etwas übersehen? Und in CvUnit::setXY will ich das lieber nicht haben, wegen möglicher Kollateralschäden.
    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 180 von 180 ErsteErste ... 80130170176177178179180

Berechtigungen

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