Bazaar developer reference

CvUnit::DoAttrition()

Defined in
CvUnit.cpp, line 5933
Class
CvUnit
Hook name
CivHooks::CvUnit_DoAttrition

Hooks

static bool BeforeCvUnit_DoAttrition(CvUnit* self);static void AfterCvUnit_DoAttrition(CvUnit* self);static void ReplaceCvUnit_DoAttrition(void (*original)(CvUnit*), CvUnit* self);CivRegisterBefore<CivHooks::CvUnit_DoAttrition>(host, &BeforeCvUnit_DoAttrition);CivRegisterAfter<CivHooks::CvUnit_DoAttrition>(host, &AfterCvUnit_DoAttrition);CivRegisterReplace<CivHooks::CvUnit_DoAttrition>(host, &ReplaceCvUnit_DoAttrition);

Code

5933void CvUnit::DoAttrition()5934{5935	CvPlot* pPlot = plot();5936	CvString strAppendText;59375938	if(!IsInFriendlyTerritory())5939	{5940		if(isEnemy(pPlot->getTeam(), pPlot) && getEnemyDamageChance() > 0 && getEnemyDamage() > 0)5941		{5942			if(GC.getGame().getJonRandNum(100, "Enemy Territory Damage Chance") < getEnemyDamageChance())5943			{5944				strAppendText =  GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DAMAGED_ATTRITION");5945#if defined(MOD_API_UNIT_STATS)5946				changeDamage(getEnemyDamage(), NO_PLAYER, -1, 0.0, &strAppendText);5947#else5948				changeDamage(getEnemyDamage(), NO_PLAYER, 0.0, &strAppendText);5949#endif5950			}5951		}5952		else if(getNeutralDamageChance() > 0 && getNeutralDamage() > 0)5953		{5954			if(GC.getGame().getJonRandNum(100, "Neutral Territory Damage Chance") < getNeutralDamageChance())5955			{5956				strAppendText =  GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DAMAGED_ATTRITION");5957#if defined(MOD_API_UNIT_STATS)5958				changeDamage(getNeutralDamage(), NO_PLAYER, -1, 0.0, &strAppendText);5959#else5960				changeDamage(getNeutralDamage(), NO_PLAYER, 0.0, &strAppendText);5961#endif5962			}5963		}5964	}59655966#if defined(MOD_API_PLOT_BASED_DAMAGE)5967	if (MOD_API_PLOT_BASED_DAMAGE) {5968		int iDamage = plot()->getTurnDamage(ignoreTerrainDamage(), ignoreFeatureDamage(), extraTerrainDamage(), extraFeatureDamage());5969		if (0 != iDamage) {5970			if (iDamage > 0) {5971				// CUSTOMLOG("Applying terrain/feature damage (of %i) for player/unit %i/%i at (%i, %i)", iDamage, getOwner(), GetID(), plot()->getX(), plot()->getY());5972				CvString strAppendText =  GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DAMAGED_ATTRITION");5973#if defined(MOD_API_UNIT_STATS)5974				changeDamage(iDamage, NO_PLAYER, -1, 0.0, &strAppendText);5975#else5976				changeDamage(iDamage, NO_PLAYER, 0.0, &strAppendText);5977#endif5978			} else {5979				// CUSTOMLOG("Applying terrain/feature healing (of %i) for player/unit %i/%i at (%i, %i)", iDamage, getOwner(), GetID(), plot()->getX(), plot()->getY());5980#if defined(MOD_API_UNIT_STATS)5981				changeDamage(iDamage, NO_PLAYER, -1);5982#else5983				changeDamage(iDamage, NO_PLAYER);5984#endif5985			}5986		}5987	} else {5988#endif5989		// slewis - helicopters take attrition when ending their turn over mountains.5990		if(getDomainType() == DOMAIN_LAND && pPlot->isMountain() && !canMoveAllTerrain())5991		{5992			strAppendText =  GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DAMAGED_ATTRITION");5993#if defined(MOD_API_UNIT_STATS)5994			changeDamage(50, NO_PLAYER, -1, 0.0, &strAppendText);5995#else5996			changeDamage(50, NO_PLAYER, 0.0, &strAppendText);5997#endif5998		}5999#if defined(MOD_API_PLOT_BASED_DAMAGE)6000	}6001#endif60026003#if defined(MOD_UNITS_MAX_HP)6004	if(getDamage() >= GetMaxHitPoints())6005#else6006	if(getDamage() >= GC.getMAX_HIT_POINTS())6007#endif6008	{6009		CvString strBuffer;6010		CvNotifications* pNotification = GET_PLAYER(getOwner()).GetNotifications();6011		if(pNotification)6012		{6013			strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED_ATTRITION", getNameKey());6014			Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");6015			pNotification->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), getX(), getY(), (int)getUnitType(), getOwner());6016		}6017	}60186019	TeamTypes eOwnerTeam = pPlot->getTeam();60206021	if (eOwnerTeam != NO_TEAM)6022	{6023		CvTeam &kTeam = GET_TEAM(eOwnerTeam);6024		if (!kTeam.isMinorCiv() && eOwnerTeam != getTeam() && !kTeam.IsAllowsOpenBordersToTeam(getTeam()))6025		{6026			int iReligiousStrengthLoss = GetReligiousStrengthLossRivalTerritory();6027			if (iReligiousStrengthLoss > 0)6028			{6029				int iStrength = GetReligionData()->GetReligiousStrength();6030				int iStrengthLoss = (getUnitInfo().GetReligiousStrength() * iReligiousStrengthLoss) / 100;60316032				if ((iStrength - iStrengthLoss) <= 0)6033				{6034					CvString strBuffer;6035					CvNotifications* pNotification = GET_PLAYER(getOwner()).GetNotifications();6036					if(pNotification)6037					{6038						strBuffer = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DESTROYED_ATTRITION", getNameKey());6039						Localization::String strSummary = Localization::Lookup("TXT_KEY_UNIT_LOST");6040						pNotification->Add(NOTIFICATION_UNIT_DIED, strBuffer, strSummary.toUTF8(), getX(), getY(), (int)getUnitType(), getOwner());6041					}60426043					kill(false);6044				}6045				else6046				{6047					GetReligionData()->SetReligiousStrength(iStrength - iStrengthLoss);6048					if (pPlot && pPlot->GetActiveFogOfWarMode() == FOGOFWARMODE_OFF)6049					{6050						Localization::String string = GetLocalizedText("TXT_KEY_MISC_YOU_UNIT_WAS_DAMAGED_ATTRITION");60516052						char text[256];6053						sprintf_s (text, "%s [COLOR_WHITE]-%d [ICON_PEACE][ENDCOLOR]", string.toUTF8(), iStrengthLoss);6054#if defined(SHOW_PLOT_POPUP)6055						SHOW_PLOT_POPUP(plot(), getOwner(), text, 0.0f);6056#else6057						float fDelay = 0.0f;6058						DLLUI->AddPopupText(getX(), getY(), text, fDelay);6059#endif6060					}6061				}6062			}6063		}6064	}6065}

Calls

Called by