Dies ist der gesamte Code. Hier werden, soweit ich verstanden habe, die Einheiten geladen.
Code:
void CvUnit::read(FDataStreamBase* pStream)
{
// Init data before load
reset();
uint uiFlag=0;
pStream->Read(&uiFlag); // flags for expansion
pStream->Read(&m_iID);
pStream->Read(&m_iGroupID);
pStream->Read(&m_iHotKeyNumber);
pStream->Read(&m_iX);
pStream->Read(&m_iY);
pStream->Read(&m_iLastMoveTurn);
pStream->Read(&m_iReconX);
pStream->Read(&m_iReconY);
pStream->Read(&m_iGameTurnCreated);
pStream->Read(&m_iDamage);
pStream->Read(&m_iMoves);
pStream->Read(&m_iExperience);
pStream->Read(&m_iLevel);
pStream->Read(&m_iCargo);
pStream->Read(&m_iCargoCapacity);
pStream->Read(&m_iAttackPlotX);
pStream->Read(&m_iAttackPlotY);
pStream->Read(&m_iCombatTimer);
pStream->Read(&m_iCombatFirstStrikes);
if (uiFlag < 2)
{
int iCombatDamage;
pStream->Read(&iCombatDamage);
}
pStream->Read(&m_iFortifyTurns);
//Kathy beginn Slave Hunter
pStream->Read(&m_iSlaveHunterCount);
//Kathy end Slave Hunter
pStream->Read(&m_iBlitzCount);
pStream->Read(&m_iAmphibCount);
pStream->Read(&m_iRiverCount);
pStream->Read(&m_iEnemyRouteCount);
pStream->Read(&m_iAlwaysHealCount);
pStream->Read(&m_iHillsDoubleMoveCount);
pStream->Read(&m_iImmuneToFirstStrikesCount);
pStream->Read(&m_iExtraVisibilityRange);
pStream->Read(&m_iExtraMoves);
pStream->Read(&m_iExtraMoveDiscount);
pStream->Read(&m_iExtraAirRange);
//Kathy beginn Paratrooper Promotion
pStream->Read(&m_iExtraDropRange);
//Kathy End Paratrooper Promotion
pStream->Read(&m_iExtraIntercept);
pStream->Read(&m_iExtraEvasion);
pStream->Read(&m_iExtraFirstStrikes);
pStream->Read(&m_iExtraChanceFirstStrikes);
pStream->Read(&m_iExtraWithdrawal);
pStream->Read(&m_iExtraCollateralDamage);
pStream->Read(&m_iExtraBombardRate);
pStream->Read(&m_iExtraEnemyHeal);
pStream->Read(&m_iExtraNeutralHeal);
pStream->Read(&m_iExtraFriendlyHeal);
pStream->Read(&m_iSameTileHeal);
pStream->Read(&m_iAdjacentTileHeal);
pStream->Read(&m_iExtraCombatPercent);
pStream->Read(&m_iExtraCityAttackPercent);
pStream->Read(&m_iExtraCityDefensePercent);
pStream->Read(&m_iExtraHillsAttackPercent);
pStream->Read(&m_iExtraHillsDefensePercent);
pStream->Read(&m_iRevoltProtection);
pStream->Read(&m_iCollateralDamageProtection);
pStream->Read(&m_iPillageChange);
pStream->Read(&m_iUpgradeDiscount);
//Kathy Beginn WorkRate-Promotion
pStream->Read(&m_iExtraWorkRate);
//Kathy End WorkRate-Promotion
pStream->Read(&m_iExperiencePercent);
pStream->Read(&m_iKamikazePercent);
//Kathy Beginn Eifer
pStream->Read(&m_iReligiousBonus);
//Kathy End Eifer
pStream->Read(&m_iBaseCombat);
pStream->Read((int*)&m_eFacingDirection);
pStream->Read(&m_iImmobileTimer);
/************************************************************************************************/
/* Afforess Start 08/20/10 */
/* */
/* Advanced Automations */
/************************************************************************************************/
pStream->Read(&m_iSleepTimer);
/************************************************************************************************/
/* Afforess END */
/************************************************************************************************/
pStream->Read(&m_bMadeAttack);
pStream->Read(&m_bMadeInterception);
pStream->Read(&m_bPromotionReady);
pStream->Read(&m_bDeathDelay);
pStream->Read(&m_bCombatFocus);
// m_bInfoBarDirty not saved...
pStream->Read(&m_bBlockading);
if (uiFlag > 0)
{
pStream->Read(&m_bAirCombat);
}
pStream->Read((int*)&m_eOwner);
pStream->Read((int*)&m_eCapturingPlayer);
//Kathy Beginn Original Owner
pStream->Read((int*)&m_eOriginalOwner);
//Kathy End Original Owner
pStream->Read((int*)&m_eUnitType);
FAssert(NO_UNIT != m_eUnitType);
m_pUnitInfo = (NO_UNIT != m_eUnitType) ? &GC.getUnitInfo(m_eUnitType) : NULL;
pStream->Read((int*)&m_eLeaderUnitType);
pStream->Read((int*)&m_combatUnit.eOwner);
pStream->Read(&m_combatUnit.iID);
pStream->Read((int*)&m_transportUnit.eOwner);
pStream->Read(&m_transportUnit.iID);
pStream->Read(NUM_DOMAIN_TYPES, m_aiExtraDomainModifier);
pStream->ReadString(m_szName);
pStream->ReadString(m_szScriptData);
pStream->Read(GC.getNumPromotionInfos(), m_pabHasPromotion);
pStream->Read(GC.getNumTerrainInfos(), m_paiTerrainDoubleMoveCount);
pStream->Read(GC.getNumFeatureInfos(), m_paiFeatureDoubleMoveCount);
pStream->Read(GC.getNumTerrainInfos(), m_paiExtraTerrainAttackPercent);
pStream->Read(GC.getNumTerrainInfos(), m_paiExtraTerrainDefensePercent);
pStream->Read(GC.getNumFeatureInfos(), m_paiExtraFeatureAttackPercent);
pStream->Read(GC.getNumFeatureInfos(), m_paiExtraFeatureDefensePercent);
pStream->Read(GC.getNumUnitCombatInfos(), m_paiExtraUnitCombatModifier);
}
Grün ist die Zeile 13321.
Das Assert scheint sich aber eher auf die blaue Stelle zu beziehen, denn es wird sich beschwert, dass m_eUnitType nicht existiert.
Wobei ich vermute, das liegt daran, dass ich in der Debug.dll zwei Zeilen weiter oben nicht drin habe, die in den .cpp-Dateien drinstehen und die ich für Debug.dll nicht kompiliert habe, sondern nur für Release (weil es eine Fehlerbehebung im Spiel war).
Meine Vermutung ist, dass es irgendwie ein Unit-Objekt gibt, das keinen UnitType hat. Wie das zustande kommen, kann ich mir nicht wirklich vorstellen. Meine Vermutung hier: Ein Python-Ereignis, bei dem durch einen Fehler der Einheitentyp nicht definiert war (weil so ein Python-Ereignis genau in dieser Runde aufgetreten ist, das ich daraufhin geändert habe). Nur dass ich mich wundere, dass dann das Spiel nicht damals schon abgestürzt ist, weil es die Einheiten nicht initiieren konnte.
Meine Frage nun: Wenn ich richtig liege, kann ich in der DLL irgendwie einprogrammieren, dass diese betreffenden Einheiten jetzt beim Laden sofort gelöscht werden, statt das Spiel crashen zu lassen?