Seite 175 von 180 ErsteErste ... 75125165171172173174175176177178179 ... LetzteLetzte
Ergebnis 2.611 bis 2.625 von 2699

Thema: Der SDK-Fragen-Thread

  1. #2611
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Danke für die Codeänderungen. Habe es gerade mal in mein Repo aufgenommen, aber zwei Codeblöcke sind identisch. Copy&Paste-Fehler beim Zweiten?
    Zitat Zitat von Kathy Beitrag anzeigen
    Damit die Schiffe angreifen und verteidigen können und nicht am Rundenende wieder versetzt werden:
    Und damit man auch sieht, welchen Chancen das Schiff bei einem Angriff auf Land hat:

    In meinem Code war noch ein Fehler:
    Statt
    Code:
    		// Reset to default
    		setFormationType("FORMATION_TYPE_MACHINE");
    sollte der Wert lieber auf NULL gesetzt werden, um die ursprüngliche Formation wiederherzustellen.
    MACHINE stimmt ja nur für einen Teil der Einheiten.
    Code:
    		// Reset to default
    		setFormationType(NULL);
    Geändert von Ramkhamhaeng (18. August 2018 um 07:43 Uhr)

  2. #2612
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Stimmt, der eine sollte in CvGameTextMgr.cpp sein, unter bool CvGameTextMgr::setCombatPlotHelp(CvWStringBuffer &szString, CvPlot* pPlot).
    Da scheine ich insgesamt eine von der Orginialversion abweichende Codestelle zu haben, die rucivfan gebastelt hat. Ich hoffe, dass mein Code überhaupt mit deinem kompatibel ist. Mein Code lautet
    Code:
    bool CvGameTextMgr::setCombatPlotHelp(CvWStringBuffer &szString, CvPlot* pPlot)
    {
    	PROFILE_FUNC();
    
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                         05/22/08                             jdog5000      */
    /*                                                                                              */
    /* DEBUG                                                                                        */
    /************************************************************************************************/
    	if (gDLL->altKey() && (gDLL->getChtLvl() > 0))
    	{
    		setPlotHelp( szString, pPlot );
    		return true;
    	}
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                          END                                               */
    /************************************************************************************************/
    	CvUnit* pAttacker;
    	CvUnit* pDefender;
    	CvWString szTempBuffer;
    	CvWString szOffenseOdds;
    	CvWString szDefenseOdds;
    	bool bValid;
    	int iModifier;
    
    	if (gDLL->getInterfaceIFace()->getLengthSelectionList() == 0)
    	{
    		return false;
    	}
    
    	bValid = false;
    
    	// rucivfan_bug_fix rbf[
    	// old code[
    	//bValid = false;
    	//switch (gDLL->getInterfaceIFace()->getSelectionList()->getDomainType())
    	//{
    	//case DOMAIN_SEA:
    	//	bValid = pPlot->isWater();
    	//	break;
    
    	//case DOMAIN_AIR:
    	//	bValid = true;
    	//	break;
    
    	//case DOMAIN_LAND:
    	//	bValid = !(pPlot->isWater());
    	//	break;
    
    	//case DOMAIN_IMMOBILE:
    	//	break;
    
    	//default:
    	//	FAssert(false);
    	//	break;
    	//}
    
    	//if (!bValid)
    	//{
    	//	return false;
    	//}
    	// ] old code
    	// ]rucivfan_bug_fix rbf
    
    	int iOdds;
    	pAttacker = gDLL->getInterfaceIFace()->getSelectionList()->AI_getBestGroupAttacker(pPlot, false, iOdds);
    
    	if (pAttacker == NULL)
    	{
    		pAttacker = gDLL->getInterfaceIFace()->getSelectionList()->AI_getBestGroupAttacker(pPlot, false, iOdds, true);
    	}
    
    	if (pAttacker != NULL)
    	{
    		// rucivfan_bug_fix rbf[
    		// new code[
    		bValid = false;
    		switch (gDLL->getInterfaceIFace()->getSelectionList()->getDomainType())
    		{
    		case DOMAIN_SEA:
    //			bValid = pPlot->isWater();	//Original Coce
    			//Kathy beginn Riverboat
    			bValid = pPlot->isWater() || pAttacker->isAmphib() && pPlot->isRiver();
    			//Kathy End Riverboat
    
    			break;
    
    		case DOMAIN_AIR:
    			bValid = true;
    			break;
    
    		case DOMAIN_LAND:
    			bValid = !(pPlot->isWater()) || pAttacker->canMoveAllTerrain();
    			break;
    
    		case DOMAIN_IMMOBILE:
    			break;
    
    		default:
    			FAssert(false);
    			break;
    		}
    
    		if (!bValid)
    		{
    			return false;
    		}
    		// ] new code
    		// ]rucivfan_bug_fix rbf
    		pDefender = pPlot->getBestDefender(NO_PLAYER, pAttacker->getOwnerINLINE(), pAttacker, false, NO_TEAM == pAttacker->getDeclareWarMove(pPlot));
    
    		if (pDefender != NULL && pDefender != pAttacker && pDefender->canDefend(pPlot) && pAttacker->canAttack(*pDefender))
    		{
    			if (pAttacker->getDomainType() != DOMAIN_AIR)
    			{
    				int iCombatOdds = getCombatOdds(pAttacker, pDefender);
    
    				if (pAttacker->combatLimit() >= GC.getMAX_HIT_POINTS())
    				{
    					if (iCombatOdds > 999)
    					{
    						szTempBuffer = L"> 99.9";
    					}
    					else if (iCombatOdds < 1)
    					{
    						szTempBuffer = L"&lt; 0.1";
    					}
    					else
    					{
    						szTempBuffer.Format(L"%.1f", ((float)iCombatOdds) / 10.0f);
    					}
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS", szTempBuffer.GetCString()));
    				}
    
    
    				int iWithdrawal = 0;
    
    				if (pAttacker->combatLimit() < GC.getMAX_HIT_POINTS())
    				{
    					iWithdrawal += 100 * iCombatOdds;
    				}
    
    				iWithdrawal += std::min(100, pAttacker->withdrawalProbability()) * (1000 - iCombatOdds);
    
    				if (iWithdrawal > 0 || pAttacker->combatLimit() < GC.getMAX_HIT_POINTS())
    				{
    					if (iWithdrawal > 99900)
    					{
    						szTempBuffer = L"&gt; 99.9";
    					}
    					else if (iWithdrawal < 100)
    					{
    						szTempBuffer = L"&lt; 0.1";
    					}
    					else
    					{
    						szTempBuffer.Format(L"%.1f", iWithdrawal / 1000.0f);
    					}
    
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_RETREAT", szTempBuffer.GetCString()));
    				}
    
    				//szTempBuffer.Format(L"AI odds: %d%%", iOdds);
    				//szString += NEWLINE + szTempBuffer;
    			}
    
    			szOffenseOdds.Format(L"%.2f", ((pAttacker->getDomainType() == DOMAIN_AIR) ? pAttacker->airCurrCombatStrFloat(pDefender) : pAttacker->currCombatStrFloat(NULL, NULL)));
    			szDefenseOdds.Format(L"%.2f", pDefender->currCombatStrFloat(pPlot, pAttacker));
    			szString.append(NEWLINE);
    			szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_ODDS_VS", szOffenseOdds.GetCString(), szDefenseOdds.GetCString()));
    
    			szString.append(L' ');//XXX
    
    			szString.append(gDLL->getText("TXT_KEY_COLOR_POSITIVE"));
    
    			szString.append(L' ');//XXX
    
    			iModifier = pAttacker->getExtraCombatPercent();
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
    			}
    
    			iModifier = pAttacker->unitClassAttackModifier(pDefender->getUnitClassType());
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitClassInfo(pDefender->getUnitClassType()).getTextKeyWide()));
    			}
    
    			if (pDefender->getUnitCombatType() != NO_UNITCOMBAT)
    			{
    				iModifier = pAttacker->unitCombatModifier(pDefender->getUnitCombatType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitCombatInfo(pDefender->getUnitCombatType()).getTextKeyWide()));
    				}
    			}
    
    			iModifier = pAttacker->domainModifier(pDefender->getDomainType());
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getDomainInfo(pDefender->getDomainType()).getTextKeyWide()));
    			}
    
    			if (pPlot->isCity(true, pDefender->getTeam()))
    			{
    				iModifier = pAttacker->cityAttackModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", iModifier));
    				}
    			}
    
    			if (pPlot->isHills())
    			{
    				iModifier = pAttacker->hillsAttackModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", iModifier));
    				}
    			}
    
    			if (pPlot->getFeatureType() != NO_FEATURE)
    			{
    				iModifier = pAttacker->featureAttackModifier(pPlot->getFeatureType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
    				}
    			}
    			else
    			{
    				iModifier = pAttacker->terrainAttackModifier(pPlot->getTerrainType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
    				}
    			}
    
    			iModifier = pAttacker->getKamikazePercent();
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_KAMIKAZE_MOD", iModifier));
    			}
    			//Kathy Beginn Eifer
    			iModifier = pAttacker->getReligiousBonus();
    			if (iModifier != 0)
    			{
    				if ( GET_PLAYER(pAttacker->getOwnerINLINE()).getStateReligion() != GET_PLAYER(pDefender->getOwnerINLINE()).getStateReligion())
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_RELIGIOUS_MOD", iModifier));
    				}
    			}
    			//Kathy End Eifer
    			//Kathy Beginn Original Owner
    			if ( pAttacker->getOriginalOwner() != pAttacker->getOwner() )
    			{
    				if ( pAttacker->getOriginalOwner() == pDefender->getOwner() )
    				{
    					iModifier = -25;
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_ORIGINAL_OWNER_MOD", iModifier));
    				}
    			}
    			//Kathy End Original Owner
    			
    			if (pDefender->isAnimal())
    			{
    				iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getAnimalCombatModifier();
    
    				iModifier += pAttacker->getUnitInfo().getAnimalCombatModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_UNIT_ANIMAL_COMBAT_MOD", iModifier));
    				}
    			}
    
    			if (pDefender->isBarbarian())
    			{
    				iModifier = -GC.getHandicapInfo(GC.getGameINLINE().getHandicapType()).getBarbarianCombatModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_UNIT_BARBARIAN_COMBAT_MOD", iModifier));
    				}
    			}
    
    			if (!(pDefender->immuneToFirstStrikes()))
    			{
    				if (pAttacker->maxFirstStrikes() > 0)
    				{
    					if (pAttacker->firstStrikes() == pAttacker->maxFirstStrikes())
    					{
    						if (pAttacker->firstStrikes() == 1)
    						{
    							szString.append(NEWLINE);
    							szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
    						}
    						else
    						{
    							szString.append(NEWLINE);
    							szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pAttacker->firstStrikes()));
    						}
    					}
    					else
    					{
    						szString.append(NEWLINE);
    						szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pAttacker->firstStrikes(), pAttacker->maxFirstStrikes()));
    					}
    				}
    			}
    
    			if (pAttacker->isHurt())
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HP", pAttacker->currHitPoints(), pAttacker->maxHitPoints()));
    			}
    
    			szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
    
    			szString.append(L' ');//XXX
    
    			szString.append(gDLL->getText("TXT_KEY_COLOR_NEGATIVE"));
    
    			szString.append(L' ');//XXX
    
    			if (!(pAttacker->isRiver()))
    			{
    				if (pAttacker->plot()->isRiverCrossing(directionXY(pAttacker->plot(), pPlot)))
    				{
    					iModifier = GC.getRIVER_ATTACK_MODIFIER();
    
    					if (iModifier != 0)
    					{
    						szString.append(NEWLINE);
    						szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_RIVER_MOD", -(iModifier)));
    					}
    				}
    			}
    
    			if (!(pAttacker->isAmphib()))
    			{
    				if (!(pPlot->isWater()) && pAttacker->plot()->isWater())
    				{
    					iModifier = GC.getAMPHIB_ATTACK_MODIFIER();
    
    					if (iModifier != 0)
    					{
    						szString.append(NEWLINE);
    						szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_AMPHIB_MOD", -(iModifier)));
    					}
    				}
    			}
    
    			iModifier = pDefender->getExtraCombatPercent();
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_EXTRA_STRENGTH", iModifier));
    			}
    
    			iModifier = pDefender->unitClassDefenseModifier(pAttacker->getUnitClassType());
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitClassInfo(pAttacker->getUnitClassType()).getTextKeyWide()));
    			}
    
    			if (pAttacker->getUnitCombatType() != NO_UNITCOMBAT)
    			{
    				iModifier = pDefender->unitCombatModifier(pAttacker->getUnitCombatType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getUnitCombatInfo(pAttacker->getUnitCombatType()).getTextKeyWide()));
    				}
    			}
    
    			iModifier = pDefender->domainModifier(pAttacker->getDomainType());
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_MOD_VS_TYPE", iModifier, GC.getDomainInfo(pAttacker->getDomainType()).getTextKeyWide()));
    			}
    			//Kathy Beginn Eifer
    
    			iModifier = pDefender->getReligiousBonus();
    			if (iModifier != 0)
    			{
    				if ( GET_PLAYER(pAttacker->getOwnerINLINE()).getStateReligion() != GET_PLAYER(pDefender->getOwnerINLINE()).getStateReligion())
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_RELIGIOUS_MOD", iModifier));
    				}
    			}			
    			//Kathy End Eifer
    			//Kathy Beginn Original Owner
    			if ( pDefender->getOriginalOwner() != pDefender->getOwner() )
    			{
    				if ( pDefender->getOriginalOwner() == pAttacker->getOwner() )
    				{
    					iModifier = -25;
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_ORIGINAL_OWNER_MOD", iModifier));
    				}
    			}
    			//Kathy End Original Owner
    
    			if (!(pDefender->noDefensiveBonus()))
    			{
    				iModifier = pPlot->defenseModifier(pDefender->getTeam(), (pAttacker != NULL) ? pAttacker->ignoreBuildingDefense() : true);
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_TILE_MOD", iModifier));
    				}
    			}
    
    			iModifier = pDefender->fortifyModifier();
    
    			if (iModifier != 0)
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_FORTIFY_MOD", iModifier));
    			}
    
    			if (pPlot->isCity(true, pDefender->getTeam()))
    			{
    				iModifier = pDefender->cityDefenseModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_CITY_MOD", iModifier));
    				}
    			}
    
    			if (pPlot->isHills())
    			{
    				iModifier = pDefender->hillsDefenseModifier();
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HILLS_MOD", iModifier));
    				}
    			}
    
    			if (pPlot->getFeatureType() != NO_FEATURE)
    			{
    				iModifier = pDefender->featureDefenseModifier(pPlot->getFeatureType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getFeatureInfo(pPlot->getFeatureType()).getTextKeyWide()));
    				}
    			}
    			else
    			{
    				iModifier = pDefender->terrainDefenseModifier(pPlot->getTerrainType());
    
    				if (iModifier != 0)
    				{
    					szString.append(NEWLINE);
    					szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_UNIT_MOD", iModifier, GC.getTerrainInfo(pPlot->getTerrainType()).getTextKeyWide()));
    				}
    			}
    
    			if (!(pAttacker->immuneToFirstStrikes()))
    			{
    				if (pDefender->maxFirstStrikes() > 0)
    				{
    					if (pDefender->firstStrikes() == pDefender->maxFirstStrikes())
    					{
    						if (pDefender->firstStrikes() == 1)
    						{
    							szString.append(NEWLINE);
    							szString.append(gDLL->getText("TXT_KEY_UNIT_ONE_FIRST_STRIKE"));
    						}
    						else
    						{
    							szString.append(NEWLINE);
    							szString.append(gDLL->getText("TXT_KEY_UNIT_NUM_FIRST_STRIKES", pDefender->firstStrikes()));
    						}
    					}
    					else
    					{
    						szString.append(NEWLINE);
    						szString.append(gDLL->getText("TXT_KEY_UNIT_FIRST_STRIKE_CHANCES", pDefender->firstStrikes(), pDefender->maxFirstStrikes()));
    					}
    				}
    			}
    
    			if (pDefender->isHurt())
    			{
    				szString.append(NEWLINE);
    				szString.append(gDLL->getText("TXT_KEY_COMBAT_PLOT_HP", pDefender->currHitPoints(), pDefender->maxHitPoints()));
    			}
    
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                      06/20/08                                jdog5000      */
    /*                                                                                              */
    /* DEBUG                                                                                        */
    /************************************************************************************************/
    			szString.append(gDLL->getText("TXT_KEY_COLOR_REVERT"));
    
    /* original code
    			if ((gDLL->getChtLvl() > 0))
    */
    			// Only display this info in debug mode so game can be played with cheat code entered
    			if( GC.getGameINLINE().isDebugMode() )
    			{
    				szTempBuffer.Format(L"\nStack Compare Value = %d",
    					gDLL->getInterfaceIFace()->getSelectionList()->AI_compareStacks(pPlot, false));
    				szString.append(szTempBuffer);
    
    				if( pPlot->getPlotCity() != NULL )
    				{
    					szTempBuffer.Format(L"\nBombard turns = %d",
    						gDLL->getInterfaceIFace()->getSelectionList()->getBombardTurns(pPlot->getPlotCity()));
    					szString.append(szTempBuffer);
    				}
    				
    				int iOurStrengthDefense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getOurPlotStrength(pPlot, 1, true, false);
    				int iOurStrengthOffense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getOurPlotStrength(pPlot, 1, false, false);
    				szTempBuffer.Format(L"\nPlot Strength(Ours)= d%d, o%d", iOurStrengthDefense, iOurStrengthOffense);
    				szString.append(szTempBuffer);
    				int iEnemyStrengthDefense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getEnemyPlotStrength(pPlot, 1, true, false);
    				int iEnemyStrengthOffense = GET_PLAYER(GC.getGameINLINE().getActivePlayer()).AI_getEnemyPlotStrength(pPlot, 1, false, false);
    				szTempBuffer.Format(L"\nPlot Strength(Enemy)= d%d, o%d", iEnemyStrengthDefense, iEnemyStrengthOffense);
    				szString.append(szTempBuffer);
    			}
    /************************************************************************************************/
    /* BETTER_BTS_AI_MOD                       END                                                  */
    /************************************************************************************************/
    
    			return true;
    		}
    	}
    
    	return false;
    }
    Wichtig ist hier der Teil, der mit "Riverboat" gekennzeichnet ist, andere Änderungen von mir beziehen sich auf Variablen, die nicht jeder hat.
    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. #2613
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich bin bisher allerdings noch nicht dazu gekommen, das mit der Grafikverschiebung auch bei mir zu implementieren und zu testen.
    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. #2614
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich habe deinen Code einmal kopiert und an einer Stelle abgeändert, damit es nur Schiffe auf den Flüssen betrifft:
    Code:
    		//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
    		}
    Was ist bisher nicht verstehe: Wie wird bei dir bei update_river_formation die richtige Flussseite ausgesucht? Wenn ich das richtig verstehe, wird im Moment noch bei dir immer FORMATION_RIVER_ON_LEFT_SIDE_CCW gesetzt. FORMATION_RIVER_ON_LEFT_SIDE_CW kommt nie vor, wozu ist das da?

    Wenn ich dich also richtig verstehe, muss ich noch FORMATION_RIVER_ON_RIGHT_SIDE und alles dazwischen definieren, ist das korrekt? Und bei update_river_formation muss ich entsprechend eine if-Funktion konstruieren, die schaut, wo der Fluss liegt?
    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. #2615
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    In deinem Code gibt es in "FORMATION_RIVER_ON_LEFT_SIDE_CCW" jede Menge FORMATION_TYPE_RIVER_(direction)_CCW, aber in Formations Info.xml sind nur FORMATION_TYPE_RIVER_(direction)_CW. Das führt dann zum Absturz, sobald ein Schiff auf ein Flussfeld fährt. Sollte es statt CCW immer CW heißen, oder sind die unterschiedlich, und wenn ja, in welchem Wert?
    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. #2616
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Kathy Beitrag anzeigen
    Was ist bisher nicht verstehe: Wie wird bei dir bei update_river_formation die richtige Flussseite ausgesucht? Wenn ich das richtig verstehe, wird im Moment noch bei dir immer FORMATION_RIVER_ON_LEFT_SIDE_CCW gesetzt. FORMATION_RIVER_ON_LEFT_SIDE_CW kommt nie vor, wozu ist das da?
    Ich habe mich dafür entschieden im Beispielcode in allen Varianten die Einheit auf der linken/westlichen Kante nach Süden auszurichten,
    damit es leichter ist sich zu orientieren. Wann du dich in die eine Richtung wendest (CCW=counter clock wise) oder in die andere (CW=clock wise) ist eine Entscheidung, die ich dir überlassen wollte.

    Wenn ich dich also richtig verstehe, muss ich noch FORMATION_RIVER_ON_RIGHT_SIDE und alles dazwischen definieren, ist das korrekt? Und bei update_river_formation muss ich entsprechend eine if-Funktion konstruieren, die schaut, wo der Fluss liegt?
    Ja, das ist korrekt. Problematischer wird es dann wenn ein Feld mehr als eine Flusskante hat. Man möchte ja nicht, dass die Einheit plötzlich zu einem anderen Fluss „springt“ während man auf einem anderen entlang fährt.

    In deinem Code gibt es in "FORMATION_RIVER_ON_LEFT_SIDE_CCW" jede Menge FORMATION_TYPE_RIVER_(direction)_CCW, aber in Formations Info.xml sind nur FORMATION_TYPE_RIVER_(direction)_CW. Das führt dann zum Absturz, sobald ein Schiff auf ein Flussfeld fährt. Sollte es statt CCW immer CW heißen, oder sind die unterschiedlich, und wenn ja, in welchem Wert?
    Oje, dann habe ich beim Kopieren einen Fehler gemacht.
    Bitte schaue mal in Assets/XML/Units nach. Da gibt es ein Skript "formationen_berechnen.py". Wenn man das aufruft sollte es formationen_out.xml berechnen, wo entweder alle Werte oder nur CW oder nur CCW eingetragen sind. Das müsstest du dann in das XML von Civ4 übertragen.
    Habe gerade keinen Zugriff drauf.

    Edit:
    Für die anderen Kanten musst du mal probieren E,S,W,N sowie NE,SE,SW,NW in dem Array zyklisch zu vertauschen. Müsste dann eigentlich die anderen Werte ergeben, wobei ichs mir gerade nicht im Kopf vorstellen kann ^^
    Geändert von Ramkhamhaeng (19. August 2018 um 16:52 Uhr)

  7. #2617
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich habe nun die CCW-Formationen gefunden (und frage mich, warum die Suchfunktion sie mir gestern nicht gezeigt hat, sie sind nämlich genau da, wo sie sein sollten).
    Allerdings frage ich mich nun, warum das gestern bei mir abgestürzt ist.

    Edit: ich kapiere es nicht ganz. Jetzt stürzt auch nichts mehr ab, weder, wenn ich die Einheit bewege noch, wenn ich sie im Weltenbauer auf den Fluss setze. Alles scheint okay zu sein. Dann kann ich jetzt rotieren.
    Geändert von Kathy (19. August 2018 um 11:59 Uhr)
    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. #2618
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich mache Fortschritte. Die Orientierung am Fluss klappt mittlerweile in fast allen Situationen.



    Was noch nicht ganz klappt, ist die Ausrichtung in Fahrtrichtung. Aber schon jetzt ist das mehr, als ich überhaupt für möglich gehalten hätte. Vielen Dank für deine Vorlagen, ohne das wäre das nie gelungen.
    Angehängte Grafiken Angehängte Grafiken
    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. #2619
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Inzwischen parken alle Schiffe in der richtigen Ecke. Wobei ich wirklich nur nach der Position zum Fluss gehe, nicht nach der Frage, ob es der selbe Fluss ist, auf dem das Schiff schon vorher war. Und die Ausrichtung je nach Marschrichtung fehlt auch noch. Aber hier ist mein Code, falls du ihn wissen möchtest:
    Code:
    	// Westkante + Ausrichtung nach Süden
    	// Reihenfolge muss mit der von DirectionTypes uebereinstimmen
    static const char FORMATION_RIVER_ON_LEFT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    	};
    	// Westkante + Ausrichtung nach Norden
    	// Reihenfolge muss mit der von DirectionTypes uebereinstimmen
    static const char FORMATION_RIVER_ON_LEFT_SIDE_CW[8][32] = {
    		"FORMATION_TYPE_RIVER_N_CW",
    		"FORMATION_TYPE_RIVER_NE_CW",
    		"FORMATION_TYPE_RIVER_E_CW",
    		"FORMATION_TYPE_RIVER_SE_CW",
    		"FORMATION_TYPE_RIVER_S_CW",
    		"FORMATION_TYPE_RIVER_SW_CW",
    		"FORMATION_TYPE_RIVER_W_CW",
    		"FORMATION_TYPE_RIVER_NW_CW",
    	};
    	// Südwestecke + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_LOWER_LEFT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    	};
    
    	// Südkante + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_LOWER_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    	};
    	// Südostecke + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_LOWER_RIGHT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    	};
    	// Ostkante + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_RIGHT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    	};
    	// Nordwestecke + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_UPPER_RIGHT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    	};
    	// Nordkante + Ausrichtung nach Norde
    static const char FORMATION_RIVER_ON_UPPER_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    	};
    	// Nordostecke + Ausrichtung nach Norden
    static const char FORMATION_RIVER_ON_UPPER_LEFT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_NW_CCW",
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    	};
    
    void CvUnit::update_river_formation(DirectionTypes eFacingDirection)
    {
    	if( eFacingDirection != NO_DIRECTION )
    	{
    		//Kathy: Formation je nach River-Ausrichtung
    		CvPlot* pPlot = plot();
    
    		if ( NULL != pPlot )
    		{
    			if ( pPlot->isWOfRiver() )
    			{
    				setFormationType(FORMATION_RIVER_ON_RIGHT_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on Right
    			}
    			else if ( pPlot->isNOfRiver() )
    			{
    				setFormationType(FORMATION_RIVER_ON_LOWER_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on South
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_NORTH))->isNOfRiver() ) //Heißt: der eigene Plot ist südlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_UPPER_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on North
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_WEST))->isWOfRiver() ) //Heißt: der eigene Plot ist östlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_LEFT_SIDE_CCW[(int)eFacingDirection]);
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_SOUTHWEST))->isWOfRiver() && plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_WEST))->isNOfRiver() ) //Heißt: der eigene Plot ist nordwestlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_LOWER_LEFT_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on Südwest
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_EAST))->isNOfRiver() && plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_SOUTH))->isWOfRiver() ) //Heißt: der eigene Plot ist nordöstlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_LOWER_RIGHT_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on Südost
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_NORTHEAST))->isNOfRiver() && plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_NORTH))->isWOfRiver() ) //Heißt: der eigene Plot ist südwestlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_UPPER_RIGHT_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on Nordost
    			}
    			else if ( plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_NORTHWEST))->isNOfRiver() && plotDirection(getX_INLINE(), getY_INLINE(), (DIRECTION_NORTHWEST))->isWOfRiver() ) //Heißt: der eigene Plot ist südöstlich des Flusses
    			{
    				setFormationType(FORMATION_RIVER_ON_UPPER_LEFT_SIDE_CCW[(int)eFacingDirection]); //Anpassen! River on Nordwest
    			}
    			else // Bedeutet: Kein Fluss in der Nähe
    			{
    				setFormationType("FORMATION_TYPE_MACHINE");
    	
    			}
    		//Kathy: Formation je nach River-Ausrichtung End
    		}
    	}
    	else
    	{
    		// Reset to default
    		setFormationType("FORMATION_TYPE_MACHINE");
    	}
    	// Todo: Call Python function for rescaling if unit swaps river status.
    }
    //Ramkhamhaeng - Formationswechsel für Riverboat end
    Clockwise habe ich bisher nicht im Gebrauch, alles ist Counter Clockwise.
    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. #2620
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Na das sieht doch schon mal ganz gut aus
    Zitat Zitat von Kathy Beitrag anzeigen

    Was noch nicht ganz klappt, ist die Ausrichtung in Fahrtrichtung.
    Das müsste sich so realisieren lassen:
    1. Du speicherst in der Einheit die Orientierungs-Information (Ob sie gegen oder mit dem Uhrzeigersinn fährt).
    Theoretisch kann man das auch aus dem Formatierungs-String ableiten, aber dann muss man deren Benennung sehr streng einhalten... Man spart also Redundanz aber dafür wird der Code fehleranfälliger...

    2. Die Einheiten springen niemals über Plots. Daher gibt es eine Stelle im Code (move?!) an der man auf die zwei Felder eines Zuges, Quellfeld und Zielfeld zugreifen kann.

    3. Steht eine Einheit an einer Kante, so gibt die Orientierung ihr drei Felder, vor bei der man die Bewegung als vorwärts interpretieren kann. Ist das Zielfeld darunter, so behält man die derzeitige Orientierung bei, anderenfalls invertiert man sie.

  11. #2621
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Bisher bin ich vor allem zeitlich nicht dazu gekommen, mich darum zu kümmern. Ich denke, dass es insgesamt einfach machbar ist, wenn ich wie folgt vorgehe:

    Code:
    	// Westkante + Ausrichtung nach Süden
    	// Reihenfolge muss mit der von DirectionTypes uebereinstimmen
    static const char FORMATION_RIVER_ON_LEFT_SIDE_CCW[8][32] = {
    		"FORMATION_TYPE_RIVER_N_CCW",
    		"FORMATION_TYPE_RIVER_NE_CCW",
    		"FORMATION_TYPE_RIVER_E_CCW",
    		"FORMATION_TYPE_RIVER_SE_CCW",
    		"FORMATION_TYPE_RIVER_S_CCW",
    		"FORMATION_TYPE_RIVER_SW_CCW",
    		"FORMATION_TYPE_RIVER_W_CCW",
    		"FORMATION_TYPE_RIVER_NW_CCW",
    	};
    Jeder Eintrag in diesem Block bezieht sich auf eine Ausrichtung der Einheit.

    Die Einträge sind je in der Reihenfolge, in der die DIRECTIONS in der GlobalTypes.xml stehen.
    Code:
    		<DirectionType>DIRECTION_NORTH</DirectionType>
    		<DirectionType>DIRECTION_NORTHEAST</DirectionType>
    		<DirectionType>DIRECTION_EAST</DirectionType>
    		<DirectionType>DIRECTION_SOUTHEAST</DirectionType>
    		<DirectionType>DIRECTION_SOUTH</DirectionType>
    		<DirectionType>DIRECTION_SOUTHWEST</DirectionType>
    		<DirectionType>DIRECTION_WEST</DirectionType>
    		<DirectionType>DIRECTION_NORTHWEST</DirectionType>
    Nun ist die letzte Bewegungsrichtung der Einheit ja genau darüber codiert. Kommt die Einheit von Süden, ist DIRECTION_NORTH. Das heißt, alle Bewegungen, die von Süden kommen (und nicht nach Süden ausgerichtet sein sollen) muss ich nur umändern auf _CW statt _CCW. Im Fall einer Westkante wären das DIRECTION_NORTH, DIRECTION_NORTHWEST und DIRECTION_NORTHEAST. Einzig bei WEST und EAST ist das nicht klar, währen die SOUTH-Directions ja alle für eine Bewegung von norden nach Süden und daher eine nach Süden ausgerichtete Formation stehen. Analog muss ich das bei allen anderen Bewegungen machen. Alle DIRECTIONS, die eine Ausrichtung im Uhrzeigersinn sinnvoll erscheinen lassen, genau danach ausrichten. Problematisch sind eben die Fälle, wo die Bewegung "Quer" zum Fluss war. Eine Ausrichtung DIRECTION_WEST sollte bei einer Westkante theoretisch nicht vorkommen, da das Schiff nicht von Osten (wo meistens ein Landfeld liegt) kommen kann. Aber es kann immer mal passieren, dass das doch auftritt. Eine Ausrichtung DIRECTION_EAST hieße in diesem konkreten Fall, dass das Schiff den Fluss gerade überquert hat, also weder nördlich noch südlich diesem gefolgt ist. In diesen Spezialfällen werde ich vermutlich einfach die CCW-Ausrichtung beibehalten oder jeweils eine von beiden Möglichkeiten anpassen.

    Edit: In dem alterierenden System sind es immer die Einträge
    "FORMATION_TYPE_RIVER_N_CCW",
    "FORMATION_TYPE_RIVER_NE_CCW",
    "FORMATION_TYPE_RIVER_E_CCW",
    die betroffen sind. Aber ich prüfe noch, ob ich richtig liege.

    Edit²: In meinem, nicht allumfassenden Test hat sich diese Änderung als korrekt dargestellt, mit Ausnahme einer Flussabzweigung, wo das Schiff sich an mehreren Flussarmen ausrichten konnte.
    Geändert von Kathy (21. August 2018 um 21:38 Uhr)
    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. #2622
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich habe ein Problem mit den Flussschiffen. Wobei ich nicht einmal weiß, ob es daran liegt, aber seit ich sie im Spiel habe, tritt das Problem auf: Wenn ich im Weltenbauer Schiffe setze, z.B. um Animationen zu treten, stürzt das Spiel sehr häufig ab. Um zu schauen, ob es einen Zusammenhang gibt. Hast du die Modifikation auch schon einmal bei dir getestet, und gibt es ähnliche Probleme?
    Es wäre sehr schade, wenn ich die Modifikation wegen Stabilitätsproblemen wieder entfernen müsste, denn sie sieht echt gut aus.
    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. #2623
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ich habe es leider selber noch nicht einbauen können. Es könnte wirklich eine Absturzmöglichkeit bestehen, da ich es ja so eingebaut hatte, dass der String als Pointer auf einen festen (externen) String realisiert ist. (Damit nicht für jede Einheit ein String initialisiert wird).

    Vielleicht gibt es doch noch eine übersehene Stelle bei der der Pointer nicht korrekt gesetzt ist?!
    Zum Testen/Als Lösung könnte man den Pointer auch in std::string umschreiben.

  14. #2624
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.995
    Ich bin nicht sicher, ob ich das verstehe, was du da schreibst.
    Seltsamerweise ist der Fehler nicht (oder nicht nach für mich nachvollziehbaren Kriterien) reproduzierbar. Mal stürzt es ab, mal nicht. Wenn der Pionter nicht korrekt ist, müsste es doch bei irgendeiner Stelle immer abstürzen, oder?
    Ich setze die Einheiten auf den Ozean (wo dein Code eigentlich gar nicht aufgerufen werden sollte - weil a) das Feld kein Flussfeld ist und b) die Einheit keine alte Ausrichtung hatte.
    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

  15. #2625
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ich will damit sagen, dass die Variable m_pFormationType scheinbar nicht immer mit NULL initialisiert ist.

    Nach deinem Beitrag habe ich mir nochmal den Code, den ich damals gepostet habe, angeschaut. Anscheinend habe ich damals die Stelle im Konstruktor von CvUnit vergessen.
    Füge bitte in CvUnit:CvUnit() noch m_pFormationType = NULL ein.
    Anderenfalls ist der Wert zufällig und dann kann es zum Zugriffsfehler kommen.

    Ich hatte eigentlich vermutet, dass es trotz dem Wert im Konstruktor irgendwie zum Zufallswert kommt, aber wenn er gar nicht erst initialisiert wird...

Seite 175 von 180 ErsteErste ... 75125165171172173174175176177178179 ... LetzteLetzte

Berechtigungen

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