Hooks
static bool BeforeCvUnit_reset(CvUnit* self, int iID, UnitTypes eUnit, PlayerTypes eOwner, bool bConstructorCall);static void AfterCvUnit_reset(CvUnit* self, int iID, UnitTypes eUnit, PlayerTypes eOwner, bool bConstructorCall);static void ReplaceCvUnit_reset(void (*original)(CvUnit*, int, UnitTypes, PlayerTypes, bool), CvUnit* self, int iID, UnitTypes eUnit, PlayerTypes eOwner, bool bConstructorCall);CivRegisterBefore<CivHooks::CvUnit_reset>(host, &BeforeCvUnit_reset);CivRegisterAfter<CivHooks::CvUnit_reset>(host, &AfterCvUnit_reset);CivRegisterReplace<CivHooks::CvUnit_reset>(host, &ReplaceCvUnit_reset);
Code
860// FUNCTION: reset()861// Initializes data members that are serialized.862void CvUnit::reset(int iID, UnitTypes eUnit, PlayerTypes eOwner, bool bConstructorCall)863{864 VALIDATE_OBJECT865 int iI;866867 FAutoArchive& archive = getSyncArchive();868 archive.clearDelta();869 archive.reset();870871 m_iID = iID;872 m_iHotKeyNumber = -1;873 m_iX = INVALID_PLOT_COORD;874 m_iY = INVALID_PLOT_COORD;875 m_iLastMoveTurn = 0;876 m_iCycleOrder = -1;877#if defined(MOD_API_UNIT_STATS)878 m_iStatsTravelled = 0;879 m_iStatsKilled = 0;880#endif881 m_iDeployFromOperationTurn = -100;882 m_iReconX = INVALID_PLOT_COORD;883 m_iReconY = INVALID_PLOT_COORD;884 m_iReconCount = 0;885 m_iGameTurnCreated = 0;886 m_iDamage = 0;887 m_iMoves = 0;888 m_bImmobile = false;889 m_iExperience = 0;890#if defined(MOD_UNITS_XP_TIMES_100)891 m_iExperienceTimes100 = 0;892#endif893 m_iLevel = 1;894 m_iCargo = 0;895 m_iAttackPlotX = INVALID_PLOT_COORD;896 m_iAttackPlotY = INVALID_PLOT_COORD;897 m_iCombatTimer = 0;898 m_iCombatFirstStrikes = 0;899 m_iCombatDamage = 0;900 m_iFortifyTurns = 0;901 m_bFortifiedThisTurn = false;902 m_iBlitzCount = 0;903 m_iAmphibCount = 0;904 m_iRiverCrossingNoPenaltyCount = 0;905 m_iEnemyRouteCount = 0;906 m_iRivalTerritoryCount = 0;907 m_iMustSetUpToRangedAttackCount = 0;908 m_iRangeAttackIgnoreLOSCount = 0;909 m_iCityAttackOnlyCount = 0;910 m_iCaptureDefeatedEnemyCount = 0;911 m_iRangedSupportFireCount = 0;912 m_iAlwaysHealCount = 0;913 m_iHealOutsideFriendlyCount = 0;914 m_iHillsDoubleMoveCount = 0;915 m_iImmuneToFirstStrikesCount = 0;916 m_iExtraVisibilityRange = 0;917#if defined(MOD_PROMOTIONS_VARIABLE_RECON)918 m_iExtraReconRange = 0;919#endif920 m_iExtraMoves = 0;921 m_iExtraMoveDiscount = 0;922 m_iExtraRange = 0;923 m_iExtraIntercept = 0;924 m_iExtraEvasion = 0;925 m_iExtraFirstStrikes = 0;926 m_iExtraChanceFirstStrikes = 0;927 m_iExtraWithdrawal = 0;928 m_iExtraEnemyHeal = 0;929 m_iExtraNeutralHeal = 0;930 m_iExtraFriendlyHeal = 0;931 m_iSameTileHeal = 0;932 m_iAdjacentTileHeal = 0;933 m_iEnemyDamageChance = 0;934 m_iNeutralDamageChance = 0;935 m_iEnemyDamage = 0;936 m_iNeutralDamage = 0;937 m_iNearbyEnemyCombatMod = 0;938 m_iNearbyEnemyCombatRange = 0;939 m_iExtraCombatPercent = 0;940 m_iAdjacentModifier = 0;941 m_iRangedAttackModifier = 0;942 m_iInterceptionCombatModifier = 0;943 m_iInterceptionDefenseDamageModifier = 0;944 m_iAirSweepCombatModifier = 0;945 m_iAttackModifier = 0;946 m_iDefenseModifier = 0;947 m_iExtraCityAttackPercent = 0;948 m_iExtraCityDefensePercent = 0;949 m_iExtraRangedDefenseModifier = 0;950 m_iExtraHillsAttackPercent = 0;951 m_iExtraHillsDefensePercent = 0;952 m_iExtraOpenAttackPercent = 0;953 m_iExtraOpenRangedAttackMod= 0;954 m_iExtraRoughAttackPercent = 0;955 m_iExtraRoughRangedAttackMod= 0;956 m_iExtraAttackFortifiedMod= 0;957 m_iExtraAttackWoundedMod= 0;958 m_iFlankAttackModifier=0;959 m_iExtraOpenDefensePercent = 0;960 m_iExtraRoughDefensePercent = 0;961 m_iPillageChange = 0;962 m_iUpgradeDiscount = 0;963 m_iExperiencePercent = 0;964 m_iDropRange = 0;965 m_iAirSweepCapableCount = 0;966 m_iExtraNavalMoves = 0;967 m_iKamikazePercent = 0;968 m_eFacingDirection = DIRECTION_SOUTHEAST;969 m_iIgnoreTerrainCostCount = 0;970#if defined(MOD_API_PLOT_BASED_DAMAGE)971 m_iIgnoreTerrainDamageCount = 0;972 m_iIgnoreFeatureDamageCount = 0;973 m_iExtraTerrainDamageCount = 0;974 m_iExtraFeatureDamageCount = 0;975#endif976#if defined(MOD_PROMOTIONS_IMPROVEMENT_BONUS)977 m_iNearbyImprovementCombatBonus = 0;978 m_iNearbyImprovementBonusRange = 0;979 m_eCombatBonusImprovement = NO_IMPROVEMENT;980#endif981#if defined(MOD_PROMOTIONS_CROSS_MOUNTAINS)982 m_iCanCrossMountainsCount = 0;983#endif984#if defined(MOD_PROMOTIONS_CROSS_OCEANS)985 m_iCanCrossOceansCount = 0;986#endif987#if defined(MOD_PROMOTIONS_CROSS_ICE)988 m_iCanCrossIceCount = 0;989#endif990#if defined(MOD_PROMOTIONS_GG_FROM_BARBARIANS)991 m_iGGFromBarbariansCount = 0;992#endif993 m_iRoughTerrainEndsTurnCount = 0;994 m_iEmbarkAbilityCount = 0;995 m_iHoveringUnitCount = 0;996 m_iFlatMovementCostCount = 0;997 m_iCanMoveImpassableCount = 0;998 m_iOnlyDefensiveCount = 0;999 m_iNoDefensiveBonusCount = 0;1000 m_iNoCaptureCount = 0;1001 m_iNukeImmuneCount = 0;1002 m_iAlwaysHealCount = 0;1003 m_iHiddenNationalityCount = 0;1004 m_iAlwaysHostileCount = 0;1005 m_iNoRevealMapCount = 0;1006 m_iCanMoveAllTerrainCount = 0;1007 m_iCanMoveAfterAttackingCount = 0;1008 m_iFreePillageMoveCount = 0;1009 m_iHPHealedIfDefeatEnemy = 0;1010 m_iGoldenAgeValueFromKills = 0;1011 m_iSapperCount = 0;1012 m_iCanHeavyCharge = 0;1013 m_iNumExoticGoods = 0;1014 m_iTacticalAIPlotX = INVALID_PLOT_COORD;1015 m_iTacticalAIPlotY = INVALID_PLOT_COORD;1016 m_iGarrisonCityID = -1; // unused1017 m_iFlags = 0;1018 m_iNumAttacks = 1;1019 m_iAttacksMade = 0;1020 m_iGreatGeneralCount = 0;1021 m_iGreatAdmiralCount = 0;1022#if defined(MOD_PROMOTIONS_AURA_CHANGE)1023 m_iAuraRangeChange = 0;1024 m_iAuraEffectChange = 0;1025#endif1026 m_iGreatGeneralModifier = 0;1027 m_iGreatGeneralReceivesMovementCount = 0;1028 m_iGreatGeneralCombatModifier = 0;1029 m_iIgnoreGreatGeneralBenefit = 0;1030 m_iIgnoreZOC = 0;1031#if defined(MOD_UNITS_NO_SUPPLY)1032 m_iNoSupply = 0;1033#endif1034 m_iHealIfDefeatExcludeBarbariansCount = 0;1035 m_iNumInterceptions = 1;1036 m_iMadeInterceptionCount = 0;1037 m_iEverSelectedCount = 0;10381039 m_bIgnoreDangerWakeup = false;1040 m_iEmbarkedAllWaterCount = 0;1041#if defined(MOD_PROMOTIONS_DEEP_WATER_EMBARKATION)1042 m_iEmbarkedDeepWaterCount = 0;1043#endif1044 m_iEmbarkExtraVisibility = 0;1045 m_iEmbarkDefensiveModifier = 0;1046 m_iCapitalDefenseModifier = 0;1047 m_iCapitalDefenseFalloff = 0;1048 m_iCityAttackPlunderModifier = 0;1049 m_iReligiousStrengthLossRivalTerritory = 0;1050 m_iTradeMissionInfluenceModifier = 0;1051 m_iTradeMissionGoldModifier = 0;10521053 m_bPromotionReady = false;1054 m_bDeathDelay = false;1055 m_bCombatFocus = false;1056 m_bInfoBarDirty = false;1057 m_bNotConverting = false;1058 m_bAirCombat = false;1059 m_bSetUpForRangedAttack = false;1060 m_bEmbarked = false;1061 m_bAITurnProcessed = false;1062 m_bWaitingForMove = false;1063 m_eTacticalMove = NO_TACTICAL_MOVE;10641065 m_eOwner = eOwner;1066 m_eOriginalOwner = eOwner;1067 m_eCapturingPlayer = NO_PLAYER;1068 m_bCapturedAsIs = false;1069 m_eUnitType = eUnit;1070 m_pUnitInfo = (NO_UNIT != m_eUnitType) ? GC.getUnitInfo(m_eUnitType) : NULL;1071 m_iBaseCombat = (NO_UNIT != m_eUnitType) ? m_pUnitInfo->GetCombat() : 0;1072#if defined(MOD_API_EXTENSIONS)1073 m_iBaseRangedCombat = (NO_UNIT != m_eUnitType) ? m_pUnitInfo->GetRangedCombat() : 0;1074#endif1075#if defined(MOD_UNITS_MAX_HP)1076 m_iMaxHitPointsBase = (NO_UNIT != m_eUnitType) ? m_pUnitInfo->GetMaxHitPoints() : GC.getMAX_HIT_POINTS();1077 m_iMaxHitPointsChange = 0;1078 m_iMaxHitPointsModifier = 0;1079#endif1080 m_eLeaderUnitType = NO_UNIT;1081 m_eInvisibleType = NO_INVISIBLE;1082 m_eSeeInvisibleType = NO_INVISIBLE;1083 m_eGreatPeopleDirectiveType = NO_GREAT_PEOPLE_DIRECTIVE_TYPE;1084 m_iCargoCapacity = 0;10851086 m_combatUnit.reset();1087 m_transportUnit.reset();10881089 m_extraDomainModifiers.clear();10901091 for(iI = 0; iI < NUM_DOMAIN_TYPES; iI++)1092 {1093 m_extraDomainModifiers.push_back(0);1094 }10951096#if defined(MOD_PROMOTIONS_UNIT_NAMING)1097 m_strUnitName = "";1098#endif1099 m_strName = "";1100#if defined(MOD_GLOBAL_NO_LOST_GREATWORKS)1101 m_strGreatName = "";1102#endif1103 m_eGreatWork = NO_GREAT_WORK;1104 m_iTourismBlastStrength = 0;1105 m_strNameIAmNotSupposedToBeUsedAnyMoreBecauseThisShouldNotBeCheckedAndWeNeedToPreserveSaveGameCompatibility = "";1106 m_strScriptData ="";1107 m_iScenarioData = 0;11081109 m_unitMoveLocs.clear();11101111 uninitInfos();11121113 // Migrated in from CvSelectionGroup1114 m_iMissionTimer = 0;1115 m_eActivityType = ACTIVITY_AWAKE;1116 m_eAutomateType = NO_AUTOMATE;11171118 m_kLastPath.clear();1119 m_uiLastPathCacheDest = (uint)-1;11201121 m_iMapLayer = DEFAULT_UNIT_MAP_LAYER;1122 m_iNumGoodyHutsPopped = 0;1123 m_iLastGameTurnAtFullHealth = -1;11241125 if(!bConstructorCall)1126 {1127 m_Promotions.Reset();11281129 CvAssertMsg((0 < GC.getNumTerrainInfos()), "GC.getNumTerrainInfos() is not greater than zero but a float array is being allocated in CvUnit::reset");1130 m_terrainDoubleMoveCount.clear();1131#if defined(MOD_PROMOTIONS_HALF_MOVE)1132 m_terrainHalfMoveCount.clear();1133#endif1134 m_terrainImpassableCount.clear();1135 m_extraTerrainAttackPercent.clear();1136 m_extraTerrainDefensePercent.clear();11371138 m_terrainDoubleMoveCount.resize(GC.getNumTerrainInfos());1139#if defined(MOD_PROMOTIONS_HALF_MOVE)1140 m_terrainHalfMoveCount.resize(GC.getNumTerrainInfos());1141#endif1142 m_terrainImpassableCount.resize(GC.getNumTerrainInfos());1143 m_extraTerrainAttackPercent.resize(GC.getNumTerrainInfos());1144 m_extraTerrainDefensePercent.resize(GC.getNumTerrainInfos());11451146 for(int i = 0; i < GC.getNumTerrainInfos(); i++)1147 {1148 m_terrainDoubleMoveCount.setAt(i,0);1149#if defined(MOD_PROMOTIONS_HALF_MOVE)1150 m_terrainHalfMoveCount.setAt(i,0);1151#endif1152 m_terrainImpassableCount.setAt(i,0);1153 m_extraTerrainAttackPercent.setAt(i,0);1154 m_extraTerrainDefensePercent.setAt(i,0);1155 }11561157 CvAssertMsg((0 < GC.getNumFeatureInfos()), "GC.getNumFeatureInfos() is not greater than zero but a float array is being allocated in CvUnit::reset");1158 m_featureDoubleMoveCount.clear();1159#if defined(MOD_PROMOTIONS_HALF_MOVE)1160 m_featureHalfMoveCount.clear();1161#endif1162 m_featureImpassableCount.clear();1163 m_extraFeatureDefensePercent.clear();1164 m_extraFeatureAttackPercent.clear();11651166 m_featureDoubleMoveCount.resize(GC.getNumFeatureInfos());1167#if defined(MOD_PROMOTIONS_HALF_MOVE)1168 m_featureHalfMoveCount.resize(GC.getNumFeatureInfos());1169#endif1170 m_featureImpassableCount.resize(GC.getNumFeatureInfos());1171 m_extraFeatureDefensePercent.resize(GC.getNumFeatureInfos());1172 m_extraFeatureAttackPercent.resize(GC.getNumFeatureInfos());11731174 for(int i = 0; i < GC.getNumFeatureInfos(); i++)1175 {1176 m_featureDoubleMoveCount.setAt(i,0);1177#if defined(MOD_PROMOTIONS_HALF_MOVE)1178 m_featureHalfMoveCount.setAt(i,0);1179#endif1180 m_featureImpassableCount.setAt(i,0);1181 m_extraFeatureAttackPercent.setAt(i,0);1182 m_extraFeatureDefensePercent.setAt(i,0);1183 }11841185#if defined(MOD_API_UNIFIED_YIELDS)1186 m_yieldFromKills.clear();1187 m_yieldFromBarbarianKills.clear();1188 1189 m_yieldFromKills.resize(NUM_YIELD_TYPES);1190 m_yieldFromBarbarianKills.resize(NUM_YIELD_TYPES);11911192 for(int i = 0; i < NUM_YIELD_TYPES; i++)1193 {1194 m_yieldFromKills.setAt(i,0);1195 m_yieldFromBarbarianKills.setAt(i,0);1196 }1197#endif11981199 CvAssertMsg((0 < GC.getNumUnitCombatClassInfos()), "GC.getNumUnitCombatClassInfos() is not greater than zero but an array is being allocated in CvUnit::reset");1200 m_extraUnitCombatModifier.clear();1201 m_extraUnitCombatModifier.resize(GC.getNumUnitCombatClassInfos());1202 for(int i = 0; i < GC.getNumUnitCombatClassInfos(); i++)1203 {1204 m_extraUnitCombatModifier.setAt(i,0);1205 }12061207 m_unitClassModifier.clear();1208 m_unitClassModifier.resize(GC.getNumUnitClassInfos());1209 for(int i = 0; i < GC.getNumUnitClassInfos(); i++)1210 {1211 CvUnitClassInfo* pkUnitClassInfo = GC.getUnitClassInfo((UnitClassTypes)i);1212 if(!pkUnitClassInfo)1213 {1214 continue;1215 }12161217 m_unitClassModifier.setAt(i,0);1218 }12191220 // Migrated in from CvSelectionGroup1221 m_iMissionAIX = INVALID_PLOT_COORD;1222 m_iMissionAIY = INVALID_PLOT_COORD;1223 m_eMissionAIType = NO_MISSIONAI;1224 m_missionAIUnit.reset();12251226 m_eUnitAIType = NO_UNITAI;1227 }1228}