Hooks
static bool BeforeCvCity_setDamage(CvCity* self, int iValue, bool noMessage);static void AfterCvCity_setDamage(CvCity* self, int iValue, bool noMessage);static void ReplaceCvCity_setDamage(void (*original)(CvCity*, int, bool), CvCity* self, int iValue, bool noMessage);CivRegisterBefore<CivHooks::CvCity_setDamage>(host, &BeforeCvCity_setDamage);CivRegisterAfter<CivHooks::CvCity_setDamage>(host, &AfterCvCity_setDamage);CivRegisterReplace<CivHooks::CvCity_setDamage>(host, &ReplaceCvCity_setDamage);
Code
11847void CvCity::setDamage(int iValue, bool noMessage)11848{11849 float fDelay = 0.0f;1185011851 VALIDATE_OBJECT1185211853 if(iValue < 0)11854 iValue = 0;11855 else if(iValue > GetMaxHitPoints())11856 iValue = GetMaxHitPoints();1185711858 if(iValue != getDamage())11859 {11860 int iOldValue = getDamage();11861 auto_ptr<ICvCity1> pDllCity(new CvDllCity(this));11862 gDLL->GameplayCitySetDamage(pDllCity.get(), iValue, iOldValue);1186311864 // send the popup text if the player can see this plot11865 if(!noMessage && plot()->GetActiveFogOfWarMode() == FOGOFWARMODE_OFF)11866 {11867 char text[256];11868 text[0] = NULL;11869 int iNewValue = MIN(GetMaxHitPoints(),iValue);11870 int iDiff = iOldValue - iNewValue;11871 if(iNewValue < iOldValue)11872 {11873 sprintf_s(text, "[COLOR_GREEN]+%d[ENDCOLOR]", iDiff);11874 fDelay = GC.getPOST_COMBAT_TEXT_DELAY() * 2;11875 }11876 else11877 {11878 sprintf_s(text, "[COLOR_RED]%d[ENDCOLOR]", iDiff);11879 }1188011881#if defined(SHOW_PLOT_POPUP)11882 SHOW_PLOT_POPUP(plot(), NO_PLAYER, text, fDelay);11883#else11884 DLLUI->AddPopupText(m_iX, m_iY, text, fDelay);11885#endif11886 }11887 m_iDamage = iValue;11888 }11889}