CvGameQueries::AreUnitsSameType(UnitTypes, UnitTypes)
- Defined in
- CvGameQueries.cpp, line 200
- Class
- CvGameQueries
- Hook name
CivHooks::CvGameQueries_AreUnitsSameType
Hooks
static bool BeforeCvGameQueries_AreUnitsSameType(UnitTypes eFirstUnitType, UnitTypes eSecondUnitType, bool& result);static void AfterCvGameQueries_AreUnitsSameType(UnitTypes eFirstUnitType, UnitTypes eSecondUnitType, bool& result);static bool ReplaceCvGameQueries_AreUnitsSameType(bool (*original)(UnitTypes, UnitTypes), UnitTypes eFirstUnitType, UnitTypes eSecondUnitType);CivRegisterBefore<CivHooks::CvGameQueries_AreUnitsSameType>(host, &BeforeCvGameQueries_AreUnitsSameType);CivRegisterAfter<CivHooks::CvGameQueries_AreUnitsSameType>(host, &AfterCvGameQueries_AreUnitsSameType);CivRegisterReplace<CivHooks::CvGameQueries_AreUnitsSameType>(host, &ReplaceCvGameQueries_AreUnitsSameType);
Code
200bool CvGameQueries::AreUnitsSameType(UnitTypes eFirstUnitType, UnitTypes eSecondUnitType)201{202 CvUnitEntry* pkFirstUnitInfo = GC.getUnitInfo(eFirstUnitType);203 CvUnitEntry* pkSecondUnitInfo = GC.getUnitInfo(eSecondUnitType);204205 if(pkFirstUnitInfo == NULL || pkSecondUnitInfo == NULL)206 return false;207208 int eFirstDomain = pkFirstUnitInfo->GetDomainType();209 int eSecondDomain = pkSecondUnitInfo->GetDomainType();210211 // antonjs: Added for Smoky Skies scenario. 212 // If unit is DOMAIN_HOVER, its effective domain is a wildcard, equal to the other unit's domain. This prevents HOVER units from disobeying 1UPT.213 if (eFirstDomain == DOMAIN_HOVER && eSecondDomain == DOMAIN_HOVER)214 {215 // Already a match216 }217 else if (eFirstDomain == DOMAIN_HOVER)218 {219 eFirstDomain = eSecondDomain; // Make it a match220 }221 else if (eSecondDomain == DOMAIN_HOVER)222 {223 eSecondDomain = eFirstDomain; // Make it a match224 }225226 // Must be in the same domain227 if(eFirstDomain == eSecondDomain)228 {229 // Conversely air units can always stack230 if(eFirstDomain == DOMAIN_AIR)231 {232 return false;233 }234235 bool bUnit1Combat = false;236 bool bUnit2Combat = false;237238 // Unit 1 is a combat unit?239 if(pkFirstUnitInfo->GetCombat() > 0 || pkFirstUnitInfo->GetRange() > 0)240 {241 bUnit1Combat = true;242 }243244#if defined(MOD_GLOBAL_BREAK_CIVILIAN_1UPT)245 if(MOD_GLOBAL_BREAK_CIVILIAN_1UPT && !bUnit1Combat)246 return false;247#endif248249 // Unit 2 is a combat unit?250 if(pkSecondUnitInfo->GetCombat() > 0 || pkSecondUnitInfo->GetRange() > 0)251 {252 bUnit2Combat = true;253 }254255 // Looped unit matches combat or non-combat type?256 if(bUnit1Combat == bUnit2Combat)257 {258 // Unit is the same domain & combat type, so we have a match259 return true;260 }261 }262263 return false;264}