Bazaar developer reference

CvUnitCombat::ResolveRangedUnitVsCombat(const CvCombatInfo &, uint)

Defined in
CvUnitCombat.cpp, line 874
Class
CvUnitCombat
Hook name
CivHooks::CvUnitCombat_ResolveRangedUnitVsCombat

Hooks

static bool BeforeCvUnitCombat_ResolveRangedUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void AfterCvUnitCombat_ResolveRangedUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID);static void ReplaceCvUnitCombat_ResolveRangedUnitVsCombat(void (*original)(const CvCombatInfo&, uint), const CvCombatInfo& kCombatInfo, uint uiParentEventID);CivRegisterBefore<CivHooks::CvUnitCombat_ResolveRangedUnitVsCombat>(host, &BeforeCvUnitCombat_ResolveRangedUnitVsCombat);CivRegisterAfter<CivHooks::CvUnitCombat_ResolveRangedUnitVsCombat>(host, &AfterCvUnitCombat_ResolveRangedUnitVsCombat);CivRegisterReplace<CivHooks::CvUnitCombat_ResolveRangedUnitVsCombat>(host, &ReplaceCvUnitCombat_ResolveRangedUnitVsCombat);

Code

874void CvUnitCombat::ResolveRangedUnitVsCombat(const CvCombatInfo& kCombatInfo, uint uiParentEventID)875{876	bool bTargetDied = false;877	int iDamage = kCombatInfo.getDamageInflicted(BATTLE_UNIT_ATTACKER);878//	int iExperience = kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER);879//	int iMaxXP = kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER);880	bool bBarbarian = false;881882	CvUnit* pkAttacker = kCombatInfo.getUnit(BATTLE_UNIT_ATTACKER);883	CvAssert_Debug(pkAttacker);884885	CvPlot* pkTargetPlot = kCombatInfo.getPlot();886	CvAssert_Debug(pkTargetPlot);887888	ICvUserInterface2* pkDLLInterface = GC.GetEngineUserInterface();889	CvString strBuffer;890891	if(pkTargetPlot)892	{893		if(!pkTargetPlot->isCity())894		{895			// Unit896			CvUnit* pkDefender = kCombatInfo.getUnit(BATTLE_UNIT_DEFENDER);897			CvAssert_Debug(pkDefender != NULL);898			if(pkDefender)899			{900				bBarbarian = pkDefender->isBarbarian();901902				if(pkAttacker)903				{904					// Defender died905#if defined(MOD_UNITS_MAX_HP)906					if(iDamage + pkDefender->getDamage() >= pkDefender->GetMaxHitPoints())907#else908					if(iDamage + pkDefender->getDamage() >= GC.getMAX_HIT_POINTS())909#endif910					{911						if(pkAttacker->getOwner() == GC.getGame().getActivePlayer())912						{913							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR_AND_DEATH", pkAttacker->getNameKey(), pkDefender->getNameKey());914							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);915							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());916						}917918						strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR_AND_DEATH", pkDefender->getNameKey(), pkAttacker->getNameKey());919						CvNotifications* pNotifications = GET_PLAYER(pkDefender->getOwner()).GetNotifications();920						if(pNotifications)921						{922							Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");923							pNotifications->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), pkDefender->getX(), pkDefender->getY(), (int) pkDefender->getUnitType(), pkDefender->getOwner());924						}925926						bTargetDied = true;927928#if !defined(NO_ACHIEVEMENTS)929						CvPlayerAI& kAttackerOwner = GET_PLAYER(pkAttacker->getOwner());930						kAttackerOwner.GetPlayerAchievements().KilledUnitWithUnit(pkAttacker, pkDefender);931#endif932933						ApplyPostCombatTraitEffects(pkAttacker, pkDefender);934935						if(bBarbarian)936						{937							pkDefender->DoTestBarbarianThreatToMinorsWithThisUnitsDeath(pkAttacker->getOwner());938						}939940#if !defined(NO_ACHIEVEMENTS)941						//One Hit942#if defined(MOD_UNITS_MAX_HP)943						if(pkDefender->GetCurrHitPoints() == pkDefender->GetMaxHitPoints() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())944#else945						if(pkDefender->GetCurrHitPoints() == GC.getMAX_HIT_POINTS() && pkAttacker->isHuman() && !GC.getGame().isGameMultiPlayer())946#endif947						{948							gDLL->UnlockAchievement(ACHIEVEMENT_ONEHITKILL);949						}950#endif951					}952					// Nobody died953					else954					{955						if(pkAttacker->getOwner() == GC.getGame().getActivePlayer())956						{957							strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ATTACK_BY_AIR", pkAttacker->getNameKey(), pkDefender->getNameKey(), iDamage);958							pkDLLInterface->AddMessage(uiParentEventID, pkAttacker->getOwner(), true, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_GREEN"), pkTargetPlot->getX(), pkTargetPlot->getY()*/);959							MILITARYLOG(pkAttacker->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkDefender->getOwner());960						}961						strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_ARE_ATTACKED_BY_AIR", pkDefender->getNameKey(), pkAttacker->getNameKey(), iDamage);962					}963964					//red icon over attacking unit965					if(pkDefender->getOwner() == GC.getGame().getActivePlayer())966					{967						pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkAttacker->m_pUnitInfo->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkAttacker->getX(), pkAttacker->getY(), true, true*/);968						MILITARYLOG(pkDefender->getOwner(), strBuffer.c_str(), pkDefender->plot(), pkAttacker->getOwner());969					}970					//white icon over defending unit971					//pkDLLInterface->AddMessage(uiParentEventID, pkDefender->getOwner(), false, 0, ""/*, "AS2D_COMBAT", MESSAGE_TYPE_DISPLAY_ONLY, pkDefender->getUnitInfo().GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_WHITE"), pkDefender->getX(), pkDefender->getY(), true, true*/);972973					//set damage but don't update entity damage visibility974#if defined(MOD_API_UNIT_STATS)975					pkDefender->changeDamage(iDamage, pkAttacker->getOwner(), pkAttacker->GetID());976#else977					pkDefender->changeDamage(iDamage, pkAttacker->getOwner());978#endif979980					// Update experience981#if defined(MOD_UNITS_XP_TIMES_100)982					pkDefender->changeExperienceTimes100(100 * 983#else984					pkDefender->changeExperience(985#endif986					    kCombatInfo.getExperience(BATTLE_UNIT_DEFENDER),987					    kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_DEFENDER),988					    true,989					    kCombatInfo.getInBorders(BATTLE_UNIT_DEFENDER),990					    kCombatInfo.getUpdateGlobal(BATTLE_UNIT_DEFENDER));991				}992993				pkDefender->setCombatUnit(NULL);994				if(!CvUnitMission::IsHeadMission(pkDefender, CvTypes::getMISSION_WAIT_FOR()))		// If the top mission was not a 'wait for', then clear it.995					pkDefender->ClearMissionQueue();996			}997			else998				bTargetDied = true;999		}1000		else1001		{1002			// City1003			CvCity* pCity = pkTargetPlot->getPlotCity();1004			CvAssert_Debug(pCity != NULL);1005			if(pCity)1006			{1007				if(pkAttacker)1008				{1009					bBarbarian = pCity->isBarbarian();1010					pCity->changeDamage(iDamage);10111012					if(pCity->getOwner() == GC.getGame().getActivePlayer())1013					{1014						strBuffer = GetLocalizedText("TXT_KEY_MISC_YOUR_CITY_ATTACKED_BY_AIR", pCity->getNameKey(), pkAttacker->getNameKey(), iDamage);1015						//red icon over attacking unit1016						pkDLLInterface->AddMessage(uiParentEventID, pCity->getOwner(), false, GC.getEVENT_MESSAGE_TIME(), strBuffer/*, "AS2D_COMBAT", MESSAGE_TYPE_INFO, pkAttacker->m_pUnitInfo->GetButton(), (ColorTypes)GC.getInfoTypeForString("COLOR_RED"), pkAttacker->getX(), pkAttacker->getY(), true, true*/);1017						MILITARYLOG(pCity->getOwner(), strBuffer.c_str(), pCity->plot(), pkAttacker->getOwner());1018					}1019				}10201021				pCity->clearCombat();1022			}1023			else1024				bTargetDied = true;1025		}1026	}1027	else1028		bTargetDied = true;10291030	if(pkAttacker)1031	{1032		// Unit gains XP for executing a Range Strike1033		if(iDamage > 0) // && iDefenderStrength > 0)1034		{1035#if defined(MOD_UNITS_XP_TIMES_100)1036			pkAttacker->changeExperienceTimes100(100 * 1037#else1038			pkAttacker->changeExperience(1039#endif1040			    kCombatInfo.getExperience(BATTLE_UNIT_ATTACKER),1041			    kCombatInfo.getMaxExperienceAllowed(BATTLE_UNIT_ATTACKER),1042			    true,1043			    kCombatInfo.getInBorders(BATTLE_UNIT_ATTACKER),1044			    kCombatInfo.getUpdateGlobal(BATTLE_UNIT_ATTACKER));1045		}10461047		pkAttacker->testPromotionReady();10481049		pkAttacker->setCombatUnit(NULL);1050		pkAttacker->ClearMissionQueue(GetPostCombatDelay());10511052		// Report that combat is over in case we want to queue another attack1053		GET_PLAYER(pkAttacker->getOwner()).GetTacticalAI()->CombatResolved(pkAttacker, bTargetDied);1054	}1055	1056	BATTLE_FINISHED();1057}

Calls

Called by